1 #include "dxxsconf.h"
2
3 #include "serial.h"
4
5 #define BOOST_TEST_DYN_LINK
6 #define BOOST_TEST_MODULE Rebirth serial
7 #include <boost/test/unit_test.hpp>
8
9 static_assert(!serial::is_message<int>::value, "");
10 static_assert(serial::is_message<serial::message<int>>::value, "");
11
12 assert_equal(serial::detail::size_base<4>::maximum_size, 4, "");
13 assert_equal((serial::detail::size_base<4, 2>::minimum_size), 2, "");
14
15 static_assert(!serial::is_cxx_array<int>::value, "");
16 static_assert(!serial::is_cxx_array<int[1]>::value, "");
17 static_assert(!serial::is_cxx_array<int *>::value, "");
18 static_assert(!serial::is_cxx_array<std::array<int, 1> *>::value, "");
19 static_assert(!serial::is_cxx_array<std::array<int, 1> &>::value, "");
20 static_assert(serial::is_cxx_array<std::array<int, 1>>::value, "");
21 static_assert(serial::is_cxx_array<const std::array<int, 1>>::value, "");
22
23 static_assert(serial::udt_message_compatible_same_type<const int, int>::value, "");
24 static_assert(serial::udt_message_compatible_same_type<const int &, int>::value, "");
25 static_assert(serial::udt_message_compatible_same_type<const int &&, int>::value, "");
26
27 namespace {
28
29 struct simple_serial_test_struct
30 {
31 uint16_t a, b;
32 };
33
34 DEFINE_SERIAL_MUTABLE_UDT_TO_MESSAGE(simple_serial_test_struct, s, (s.a, s.b));
35
36 }
37
BOOST_AUTO_TEST_CASE(read_uint16_10)38 BOOST_AUTO_TEST_CASE(read_uint16_10)
39 {
40 constexpr uint8_t buf[2]{1, 0};
41 serial::reader::bytebuffer_t b(buf);
42 uint16_t u = 0;
43 process_integer(b, u);
44 BOOST_TEST(u == 1);
45 }
46
BOOST_AUTO_TEST_CASE(read_uint16_01)47 BOOST_AUTO_TEST_CASE(read_uint16_01)
48 {
49 constexpr uint8_t buf[2]{0, 1};
50 serial::reader::bytebuffer_t b(buf);
51 uint16_t u = 0;
52 process_integer(b, u);
53 BOOST_TEST(u == 0x100);
54 }
55
BOOST_AUTO_TEST_CASE(read_uint32_0010)56 BOOST_AUTO_TEST_CASE(read_uint32_0010)
57 {
58 constexpr uint8_t buf[4]{0, 0, 1, 0};
59 serial::reader::bytebuffer_t b(buf);
60 uint32_t u = 0;
61 process_integer(b, u);
62 BOOST_TEST(u == 0x10000);
63 }
64
BOOST_AUTO_TEST_CASE(read_uint8_array_to_std_array)65 BOOST_AUTO_TEST_CASE(read_uint8_array_to_std_array)
66 {
67 constexpr uint8_t buf[4]{1, 2, 3, 4};
68 serial::reader::bytebuffer_t b(buf);
69 std::array<uint8_t, 3> u{};
70 process_array(b, u);
71 BOOST_TEST(u[0] == 1);
72 BOOST_TEST(u[1] == 2);
73 BOOST_TEST(u[2] == 3);
74 }
75
BOOST_AUTO_TEST_CASE(read_uint8_array_to_uint16_array)76 BOOST_AUTO_TEST_CASE(read_uint8_array_to_uint16_array)
77 {
78 constexpr uint8_t buf[]{1, 2, 3, 4, 5, 6, 7, 8};
79 serial::reader::bytebuffer_t b(buf);
80 std::array<uint16_t, 4> u{};
81 process_buffer(b, u[0], u[1], u[3], u[2]);
82 BOOST_TEST(u[0] == 0x201);
83 BOOST_TEST(u[1] == 0x403);
84 BOOST_TEST(u[2] == 0x807);
85 BOOST_TEST(u[3] == 0x605);
86 }
87
BOOST_AUTO_TEST_CASE(read_uint8_array_to_uint32_array)88 BOOST_AUTO_TEST_CASE(read_uint8_array_to_uint32_array)
89 {
90 constexpr uint8_t buf[]{1, 2, 3, 4, 5, 6, 7, 8};
91 serial::reader::bytebuffer_t b(buf);
92 std::array<uint32_t, 2> u{};
93 process_buffer(b, u);
94 BOOST_TEST(u[0] == 0x4030201);
95 BOOST_TEST(u[1] == 0x8070605);
96 }
97
BOOST_AUTO_TEST_CASE(read_struct)98 BOOST_AUTO_TEST_CASE(read_struct)
99 {
100 constexpr uint8_t buf[]{1, 2, 3, 4};
101 serial::reader::bytebuffer_t b(buf);
102 simple_serial_test_struct s{0x1234, 0x5678};
103 process_buffer(b, s);
104 BOOST_TEST(s.a == 0x201);
105 BOOST_TEST(s.b == 0x403);
106 }
107
BOOST_AUTO_TEST_CASE(read_sign_extend)108 BOOST_AUTO_TEST_CASE(read_sign_extend)
109 {
110 constexpr int8_t expected = -5;
111 constexpr uint8_t buf[2]{static_cast<uint8_t>(expected), 0xff};
112 serial::reader::bytebuffer_t b(buf);
113 int8_t value = 1;
114 process_buffer(b, serial::sign_extend<int16_t>(value));
115 BOOST_TEST(value == expected);
116 }
117
BOOST_AUTO_TEST_CASE(read_pad)118 BOOST_AUTO_TEST_CASE(read_pad)
119 {
120 constexpr uint8_t buf[2]{0, 0xff};
121 serial::reader::bytebuffer_t b(buf);
122 process_buffer(b, serial::pad<2>());
123 }
124
BOOST_AUTO_TEST_CASE(write_uint16)125 BOOST_AUTO_TEST_CASE(write_uint16)
126 {
127 uint8_t buf[2]{};
128 serial::writer::bytebuffer_t b(buf);
129 constexpr uint16_t u = 0x100;
130 process_integer(b, u);
131 constexpr uint8_t expected[] = {0, 1};
132 BOOST_TEST(buf == expected);
133 }
134
BOOST_AUTO_TEST_CASE(write_uint32)135 BOOST_AUTO_TEST_CASE(write_uint32)
136 {
137 uint8_t buf[4]{};
138 serial::writer::bytebuffer_t b(buf);
139 constexpr uint32_t u = 0x12345678;
140 process_integer(b, u);
141 BOOST_TEST(buf[0] == 0x78);
142 BOOST_TEST(buf[1] == 0x56);
143 BOOST_TEST(buf[2] == 0x34);
144 BOOST_TEST(buf[3] == 0x12);
145 }
146
BOOST_AUTO_TEST_CASE(write_uint8_array)147 BOOST_AUTO_TEST_CASE(write_uint8_array)
148 {
149 uint8_t buf[4]{0xff, 0xfe, 0xfd, 0xfc};
150 serial::writer::bytebuffer_t b(buf);
151 constexpr std::array<uint8_t, 3> u{{1, 2, 3}};
152 process_array(b, u);
153 BOOST_TEST(buf[0] == 1);
154 BOOST_TEST(buf[1] == 2);
155 BOOST_TEST(buf[2] == 3);
156 BOOST_TEST(buf[3] == 0xfc); // check that the field was not modified
157 }
158
BOOST_AUTO_TEST_CASE(write_uint16_array)159 BOOST_AUTO_TEST_CASE(write_uint16_array)
160 {
161 uint8_t buf[]{81, 82, 83, 84, 85, 86, 87, 88};
162 serial::writer::bytebuffer_t b(buf);
163 constexpr std::array<uint16_t, 4> u{{0x201, 0x403, 0x605, 0x807}};
164 process_buffer(b, u[0], u[1], u[3], u[2]);
165 BOOST_TEST(buf[0] == 1);
166 BOOST_TEST(buf[1] == 2);
167 BOOST_TEST(buf[2] == 3);
168 BOOST_TEST(buf[3] == 4);
169 BOOST_TEST(buf[4] == 7);
170 BOOST_TEST(buf[5] == 8);
171 BOOST_TEST(buf[6] == 5);
172 BOOST_TEST(buf[7] == 6);
173 }
174
BOOST_AUTO_TEST_CASE(write_sign_extend)175 BOOST_AUTO_TEST_CASE(write_sign_extend)
176 {
177 uint8_t buf[2]{};
178 serial::writer::bytebuffer_t b(buf);
179 constexpr int8_t value = 0x100 - 5;
180 process_buffer(b, serial::sign_extend<int16_t>(value));
181 BOOST_TEST(buf[0] == 0xfb);
182 BOOST_TEST(buf[1] == 0xff);
183 }
184
BOOST_AUTO_TEST_CASE(write_pad)185 BOOST_AUTO_TEST_CASE(write_pad)
186 {
187 uint8_t buf[2]{};
188 serial::writer::bytebuffer_t b(buf);
189 process_buffer(b, serial::pad<2, 0x85>());
190 BOOST_TEST(buf[0] == 0x85);
191 BOOST_TEST(buf[1] == 0x85);
192 }
193