25 #include <boost/range/irange.hpp> 42 std::unique_ptr<Packet> test_packet_parser(
PacketParser &parser,
43 const std::vector<uint8_t> &data,
size_t packet_end);
44 void add_bytes(std::vector<uint8_t> &data,
size_t num_bytes);
58 std::unique_ptr<Packet> test_packet_parser(
PacketParser &parser,
59 const std::vector<uint8_t> &data,
size_t packet_end)
61 std::unique_ptr<Packet> packet;
63 for (
auto i : boost::irange(static_cast<size_t>(0), packet_end - 1))
65 REQUIRE(parser.
parse_byte(data[i]) ==
nullptr);
68 REQUIRE((packet = parser.
parse_byte(data[packet_end - 1])) !=
nullptr);
70 for (
auto i : boost::irange(packet_end, data.size()))
72 REQUIRE(parser.
parse_byte(data[i]) ==
nullptr);
87 void add_bytes(std::vector<uint8_t> &data,
size_t num_bytes)
89 for (
auto i : boost::irange(static_cast<size_t>(0), num_bytes))
91 data.insert(data.begin(),
static_cast<uint8_t
>(i));
94 for (
auto i : boost::irange(static_cast<size_t>(0), num_bytes))
96 data.push_back(static_cast<uint8_t>(i));
103 TEST_CASE(
"PacketParser's can be constructed.",
"[PacketParser]")
109 TEST_CASE(
"PacketParser's can parse packets with 'parse_byte'.",
113 SECTION(
"Can parse v1.0 packets.")
115 auto data = to_vector(PingV1());
117 auto packet = test_packet_parser(parser, data,
sizeof(PingV1) + 3);
120 SECTION(
"Can parse v2.0 packets.")
122 auto data = to_vector(PingV2());
124 auto packet = test_packet_parser(parser, data,
sizeof(PingV2) + 3);
127 SECTION(
"Can parse v2.0 packets with signature.")
129 auto data = to_vector_with_sig(PingV2());
131 auto packet = test_packet_parser(
136 SECTION(
"Prints error and clears buffer if message ID is invalid.")
142 auto data = to_vector(PingV1());
144 std::unique_ptr<Packet> packet;
146 for (
auto byte : data)
151 REQUIRE(packet ==
nullptr);
154 "Packet ID (#255) is not part of the '" 155 MAVLINK_DIALECT
"' MAVLink dialect.\n");
159 SECTION(
"Can parse multiple packets back to back.")
161 auto data1 = to_vector(PingV1());
162 auto data2 = to_vector(PingV2());
163 auto data3 = to_vector_with_sig(PingV2());
164 auto packet1 = test_packet_parser(parser, data1,
sizeof(PingV1));
165 auto packet2 = test_packet_parser(parser, data2,
sizeof(PingV2));
166 auto packet3 = test_packet_parser(
173 SECTION(
"Can parse multiple packets with random bytes interspersed.")
175 auto data1 = to_vector(PingV1());
176 auto data2 = to_vector(PingV2());
177 auto data3 = to_vector_with_sig(PingV2());
181 auto packet1 = test_packet_parser(parser, data1,
sizeof(PingV1) + 3);
182 auto packet2 = test_packet_parser(parser, data2,
sizeof(PingV2) + 3);
183 auto packet3 = test_packet_parser(
193 TEST_CASE(
"PacketParser's can be cleared with 'clear'.",
"[PacketParser]")
200 auto data = to_vector(PingV1());
201 auto packet = test_packet_parser(parser, data,
sizeof(PingV1));
206 TEST_CASE(
"PacketParser's keep track of how many bytes they have parsed of " 207 "the current packet.",
"[PacketParser]")
TEST_CASE("PacketParser's can be constructed.", "[PacketParser]")
size_t bytes_parsed() const
const size_t SIGNATURE_LENGTH
std::unique_ptr< Packet > parse_byte(uint8_t byte)