diff --git a/CMakeLists.txt b/CMakeLists.txt index 056838d2..877c4c1a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,11 +11,87 @@ set (LIBAIS_VERSION_MINOR 6) # "${PROJECT_BINARY_DIR}/ais.h" # ) -include_directories("${PROJECT_BINARY_DIR}") +#include_directories("${PROJECT_BINARY_DIR}") -add_library(ais SHARED STATIC ais ais1_2_3 ais4_11 ais5 ais7_13 ais8 ais9 ais10 ais12 ais14 ais15 ais18 ais19 ais21 ais24 ais8_366_22 ) +set (HEADERS + ais.h + ais8_001_22.h + ais8_366_22.h +) -add_executable(test_libais test_libais) -target_link_libraries (test_libais ais) +set (SOURCES + ais + ais1_2_3 + ais4_11 + ais5 + ais7_13 + ais8 ais8_001_22 ais8_366_22 + ais9 + ais10 + ais12 + ais14 + ais15 + ais18 + ais19 + ais21 + ais24 + ais8_366_22 +) + +install(FILES ${HEADERS} DESTINATION include) + +add_library(ais STATIC ${SOURCES} ) +install(TARGETS ais DESTINATION lib) + + +# testing support + +option(BUILD_TESTS "Enable testing." OFF) + +if(BUILD_TESTS) + + option(TESTS_NEED_PTHREADS "Enable if tests need to link agains pthreads" OFF) + option(SEPARATE_TESTS "Enable if separate tests should be built, otherwise a single test executable will be built containing all tests" ON) + + find_path(gtest_INCLUDE_DIR gtest/test.h) + find_library(gtest_LIBRARY gtest) + find_library(gtest_main_LIBRARY gtest_main) + + if(gtest_INCLUDE_DIR AND gtest_LIBRARY AND gtest_main_LIBRARY) + include_directories(${gtest_INCLUDE_DIR}) + set(TEST_LIBS ${TEST_LIBS} ${gtest_LIBRARY} ${gtest_main_LIBRARY}) + else() + message(FATAL_ERROR "gtest not found") + endif() + + if(TESTS_NEED_PTHREADS) + find_package(Threads) + if(CMAKE_THREAD_LIBS_INIT AND CMAKE_USE_PTHREADS_INIT) + set(TEST_LIBS ${TEST_LIBS} ${CMAKE_THREAD_LIBS_INIT}) + else() + message(FATAL_ERROR "pthreads not found") + endif() + endif() + + set (TEST_SOURCES + ais1_2_3_unittest + ais8_001_22_unittest + ) + + enable_testing() + + if(SEPARATE_TESTS) + foreach(TEST_SOURCE ${TEST_SOURCES}) + add_executable(${TEST_SOURCE} ${TEST_SOURCE}) + target_link_libraries (${TEST_SOURCE} ais ${TEST_LIBS}) + add_test(${TEST_SOURCE} ${TEST_SOURCE}) + endforeach() + else() + add_executable(all_tests ${TEST_SOURCES}) + target_link_libraries(all_tests ais ${TEST_LIBS}) + add_test(all_tests all_tests) + endif() + +endif() # There must be a new line after each command! diff --git a/ais1_2_3_unittest.cpp b/ais1_2_3_unittest.cpp index 6bb2e3a3..9c902bbe 100644 --- a/ais1_2_3_unittest.cpp +++ b/ais1_2_3_unittest.cpp @@ -6,7 +6,7 @@ using namespace std; -TEST(TestAis1_2_3,AisMsg) { +TEST(TestAis123,AisMsg) { AisMsg a; a.init(); ASSERT_EQ(AIS_OK, a.get_error()); @@ -17,7 +17,7 @@ import binary bv = binary.ais6tobitvec('15Mq4J0P01EREODRv4@74gv00HRq') print bv */ -TEST(TestAis1_2_3, BitDecoding) { +TEST(TestAis123, BitDecoding) { build_nmea_lookup(); const string m_str("15Mq4J0P01EREODRv4@74gv00HRq"); const string bits_expected("000001000101011101111001000100011010000000100000000000000001010101100010010101011111010100100010111110000100010000000111000100101111111110000000000000011000100010111001"); @@ -59,7 +59,7 @@ TEST(TestAis1_2_3, BitDecoding) { slot_offset: n/a */ -TEST(TestAis1_2_3, AisMsg1) { +TEST(TestAis123, AisMsg1) { const string m_str("AIVDM,1,1,,B,15Mq4J0P01EREODRv4@74gv00HRq,0*72,b003669970,1272412824"); const string body(nth_field(m_str,5,',')); ASSERT_STREQ("15Mq4J0P01EREODRv4@74gv00HRq",body.c_str()); diff --git a/ais8_001_22_unittest.cpp b/ais8_001_22_unittest.cpp index 9691f3a9..e748272a 100644 --- a/ais8_001_22_unittest.cpp +++ b/ais8_001_22_unittest.cpp @@ -45,11 +45,11 @@ const string nth_field(const string &str, const size_t n, const char c) { } #endif -TEST(EmptyTest, Empty) { +TEST(ais8dac001fi22, Empty) { // FIX: test the empty string case. What should it do? } -TEST(HelperTest, Helper) { +TEST(ais8dac001fi22, Helper) { // Does nth_field work right? const string msg_str = "!AIVDM,1,1,,A,81mg=5@0EP:0>H0007P>0>,0*74 + // !AIVDM,2,2,2,A,?J000,3*52 + + const char * payload = "81mg=5@0EPO0VVbh00P=t>?J000"; + Ais8_001_22 msg(payload,0); + //msg.print(); + + ASSERT_EQ(AIS_OK, msg.get_error()); + EXPECT_EQ(msg.sub_areas.size(),2); + + const char * payload2 = "81mg=5@0EPd0VV`800@>2EKI>@uT00000TFNWP1Od>J"; + Ais8_001_22 msg2(payload2,0); + //msg2.print(); + + ASSERT_EQ(AIS_OK, msg2.get_error()); + + + // empty polygon + const char * payload3 = "81mg=5@0EPD0Vn3PJip1TeD1TeD400000P0000000001J000"; + Ais8_001_22 msg3(payload3,0); + //msg3.print(); + + ASSERT_EQ(AIS_OK, msg3.get_error()); + } +} + +TEST(ais8dac001fi22, NoaaDMA) { + { + + // Testing NOAA DMAs + // !AIVDM,2,1,1,A,803Ovrh0EPJ0Vvch00@=w52I9BK<00000VFHkP0>D>3,0*24 + // !AIVDM,2,2,1,A,;J005>?11PBGP4=1PPP,0*3F + + const char * payload4 = "803Ovrh0EPJ0Vvch00@=w52I9BK<00000VFHkP0>D>3;J005>?11PBGP4=1PPP"; + Ais8_001_22 msg4(payload4,0); + + ASSERT_EQ(AIS_OK, msg4.get_error()); + ASSERT_EQ(3669739, msg4.mmsi); + ASSERT_STREQ("Caution Area: Marine mammals in area - reduce speed",ais8_001_22_notice_names[msg4.notice_type]); + ASSERT_EQ(26,msg4.link_id); + ASSERT_EQ(3,msg4.month); + ASSERT_EQ(15,msg4.day); + ASSERT_EQ(21,msg4.hour); + ASSERT_EQ(30,msg4.minute); + ASSERT_EQ(2,msg4.duration_minutes); + + ASSERT_EQ(AIS8_001_22_SHAPE_CIRCLE,msg4.sub_areas[0]->getType()); + Ais8_001_22_Circle* sub_area0 = dynamic_cast(msg4.sub_areas[0]); + ASSERT_EQ(0,sub_area0->radius_m); + ASSERT_EQ(-70.40821838378906,sub_area0->x); + ASSERT_EQ(40.02494812011719,sub_area0->y); + + ASSERT_EQ(AIS8_001_22_SHAPE_POLYGON,msg4.sub_areas[1]->getType()); + Ais8_001_22_Polygon* sub_area1 = dynamic_cast(msg4.sub_areas[1]); + ASSERT_EQ(103000.0,sub_area1->dists_m[0]); + ASSERT_EQ(114000.0,sub_area1->dists_m[1]); + ASSERT_EQ(101000.0,sub_area1->dists_m[2]); + ASSERT_EQ(89.5,sub_area1->angles[0]); + ASSERT_EQ(0.0,sub_area1->angles[1]); + ASSERT_EQ(270.0,sub_area1->angles[2]); + + ASSERT_EQ(AIS8_001_22_SHAPE_TEXT,msg4.sub_areas[2]->getType()); + Ais8_001_22_Text* sub_area2 = dynamic_cast(msg4.sub_areas[2]); + ASSERT_STREQ("NOAA RW DMA ",sub_area2->text.c_str()); + + } +}