1 #include <gtest/gtest.h>
2 #include <marnav/nmea/vdm.hpp>
3 #include <marnav/nmea/mtw.hpp>
4 #include <marnav/nmea/nmea.hpp>
5 #include <marnav/nmea/ais_helper.hpp>
6 #include "type_traits_helper.hpp"
11 using namespace marnav
;
13 class Test_nmea_vdm
: public ::testing::Test
17 TEST_F(Test_nmea_vdm
, contruction
)
19 EXPECT_NO_THROW(nmea::vdm vdm
);
22 TEST_F(Test_nmea_vdm
, properties
)
24 nmea_sentence_traits
<nmea::vdm
>();
27 TEST_F(Test_nmea_vdm
, parse_invalid_number_of_arguments
)
30 nmea::detail::factory::sentence_parse
<nmea::vdm
>(nmea::talker::none
, {5, "@"}));
32 nmea::detail::factory::sentence_parse
<nmea::vdm
>(nmea::talker::none
, {7, "@"}));
35 TEST_F(Test_nmea_vdm
, parse_1
)
37 auto s
= nmea::make_sentence("!AIVDM,1,1,,B,177KQJ5000G?tO`K>RA1wUbN0TKH,0*5C");
38 ASSERT_NE(nullptr, s
);
40 auto vdm
= nmea::sentence_cast
<nmea::vdm
>(s
);
41 ASSERT_NE(nullptr, vdm
);
43 auto fragments
= vdm
->get_n_fragments();
44 EXPECT_EQ(1u, fragments
);
46 auto fragment
= vdm
->get_fragment();
47 EXPECT_EQ(1u, fragment
);
49 auto payload
= vdm
->get_payload();
50 EXPECT_STREQ("177KQJ5000G?tO`K>RA1wUbN0TKH", payload
.c_str());
53 TEST_F(Test_nmea_vdm
, parse_2
)
55 auto s0
= nmea::make_sentence(
56 "!AIVDM,2,1,3,B,55P5TL01VIaAL@7WKO@mBplU@<PDhh000000001S;AJ::4A80?4i@E53,0*3E");
57 ASSERT_NE(nullptr, s0
);
59 auto vdm0
= nmea::sentence_cast
<nmea::vdm
>(s0
);
60 ASSERT_NE(nullptr, vdm0
);
62 auto s1
= nmea::make_sentence("!AIVDM,2,2,3,B,1@0000000000000,2*55");
63 ASSERT_NE(nullptr, s1
);
65 auto vdm1
= nmea::sentence_cast
<nmea::vdm
>(s1
);
66 ASSERT_NE(nullptr, vdm1
);
69 TEST_F(Test_nmea_vdm
, empty_to_string
)
73 EXPECT_STREQ("!AIVDM,0,0,,,,0*67", nmea::to_string(vdm
).c_str());
76 TEST_F(Test_nmea_vdm
, collect_payload
)
78 std::vector
<std::unique_ptr
<nmea::sentence
>> v
;
80 v
.push_back(nmea::make_sentence(
81 "!AIVDM,2,1,3,B,55P5TL01VIaAL@7WKO@mBplU@<PDhh000000001S;AJ::4A80?4i@E53,0*3E"));
82 v
.push_back(nmea::make_sentence("!AIVDM,2,2,3,B,1@0000000000000,2*55"));
84 auto result
= nmea::collect_payload(v
.begin(), v
.end());
86 ASSERT_EQ(2u, result
.size());
87 EXPECT_EQ(0u, result
[0].second
);
88 EXPECT_EQ(2u, result
[1].second
);
90 "55P5TL01VIaAL@7WKO@mBplU@<PDhh000000001S;AJ::4A80?4i@E53", result
[0].first
.c_str());
91 EXPECT_STREQ("1@0000000000000", result
[1].first
.c_str());
94 TEST_F(Test_nmea_vdm
, collect_payload_wrong_sentence
)
96 std::vector
<std::unique_ptr
<nmea::sentence
>> v
;
97 v
.push_back(std::unique_ptr
<nmea::sentence
>(new nmea::mtw
));
99 EXPECT_ANY_THROW(nmea::collect_payload(v
.begin(), v
.end()));
102 TEST_F(Test_nmea_vdm
, collect_payload_object_iterators
)
104 std::vector
<nmea::vdm
> v
;
105 v
.push_back(nmea::vdm
{});
106 v
.push_back(nmea::vdm
{});
108 auto result
= nmea::collect_payload(v
.begin(), v
.end());
110 ASSERT_EQ(2u, result
.size());
113 TEST_F(Test_nmea_vdm
, collect_payload_pointers
)
117 auto result
= nmea::collect_payload(v
, v
+ 3);
119 ASSERT_EQ(3u, result
.size());
122 TEST_F(Test_nmea_vdm
, collect_payload_pointers_begin_end
)
128 auto result
= nmea::collect_payload(begin(v
), end(v
));
130 ASSERT_EQ(3u, result
.size());
133 TEST_F(Test_nmea_vdm
, make_vdms__1
)
135 const std::vector
<std::pair
<std::string
, uint32_t>> payload
= {
136 {"177KQJ5000G?tO`K>RA1wUbN0TKH", 0},
139 const char * expected
= "!AIVDM,1,1,,B,177KQJ5000G?tO`K>RA1wUbN0TKH,0*5C";
141 auto const sentences
= nmea::make_vdms(payload
);
143 ASSERT_EQ(1u, sentences
.size());
144 ASSERT_EQ(nmea::sentence_id::VDM
, sentences
[0]->id());
146 auto const result
= nmea::to_string(*sentences
[0]);
148 EXPECT_STREQ(expected
, result
.c_str());
151 TEST_F(Test_nmea_vdm
, make_vdms__2
)
153 const std::vector
<std::pair
<std::string
, uint32_t>> payload
154 = {{"55P5TL01VIaAL@7WKO@mBplU@<PDhh000000001S;AJ::4A80?4i@E53", 0},
155 {"1@0000000000000", 2}};
157 const char * expected
[2]
158 = {"!AIVDM,2,1,3,B,55P5TL01VIaAL@7WKO@mBplU@<PDhh000000001S;AJ::4A80?4i@E53,0*3E",
159 "!AIVDM,2,2,3,B,1@0000000000000,2*55"};
161 auto const sentences
= nmea::make_vdms(payload
, 3);
163 ASSERT_EQ(2u, sentences
.size());
165 for (auto i
= 0; i
< 2; ++i
) {
166 ASSERT_EQ(nmea::sentence_id::VDM
, sentences
[i
]->id());
167 auto const result
= nmea::to_string(*sentences
[i
]);
168 EXPECT_STREQ(expected
[i
], result
.c_str());