EndianTest.cpp
Go to the documentation of this file.
1 //
2 // Copyright (c) 2023 SICK AG, Waldkirch
3 //
4 // SPDX-License-Identifier: Unlicense
5 #include <cstdint>
6 #include <cstring>
7 
8 #include "gtest/gtest.h"
9 
10 #include "VisionaryEndian.h"
11 
12 template <visionary::endian par>
13 struct Values;
14 
15 static const union BE
16 {
17  BE() : bytes{0x01u, 0x02u, 0x03u, 0x04u, 0x05u, 0x06u, 0x07u, 0x08u}
18  {
19  }
20 
21  std::uint8_t bytes[8];
22  std::uint8_t u8;
23  std::int8_t i8;
24  std::uint16_t u16;
25  std::int16_t i16;
26  std::uint32_t u32;
27  std::int32_t i32;
28  std::uint64_t u64;
29  std::int64_t i64;
30 } be;
31 
32 static const union LE
33 {
34  LE() : bytes{0x08u, 0x07u, 0x06u, 0x05u, 0x04u, 0x03u, 0x02u, 0x01u}
35  {
36  }
37 
38  std::uint8_t bytes[8];
39  std::uint8_t u8;
40  std::int8_t i8;
41  std::uint16_t u16;
42  std::int16_t i16;
43  std::uint32_t u32;
44  std::int32_t i32;
45  std::uint64_t u64;
46  std::int64_t i64;
47 } le;
48 
49 TEST(VisionaryEndian, convertFrom_little)
50 {
51  using namespace visionary;
52 
54  EXPECT_EQ(EndianDut::convertFrom<std::uint8_t>(le.bytes), 0x08u);
55  EXPECT_EQ(EndianDut::convertFrom<std::int16_t>(le.bytes), 0x0708);
56  EXPECT_EQ(EndianDut::convertFrom<std::uint32_t>(le.bytes), 0x05060708u);
57  EXPECT_EQ(EndianDut::convertFrom<std::int64_t>(le.bytes), 0x0102030405060708ll);
58 }
59 
60 TEST(VisionaryEndian, convertFrom_big)
61 {
62  using namespace visionary;
63 
64  using EndianDut = Endian<endian::big, endian::native>;
65  EXPECT_EQ(EndianDut::convertFrom<std::uint8_t>(be.bytes), 0x01u);
66  EXPECT_EQ(EndianDut::convertFrom<std::int16_t>(be.bytes), 0x0102);
67  EXPECT_EQ(EndianDut::convertFrom<std::uint32_t>(be.bytes), 0x01020304u);
68  EXPECT_EQ(EndianDut::convertFrom<std::int64_t>(be.bytes), 0x0102030405060708ll);
69 }
70 
71 TEST(VisionaryEndian, readUnalignedLittleEndian_is_same_as_convertFrom_little)
72 {
73  using namespace visionary;
74 
76 
77  EXPECT_EQ(EndianDut::convertFrom<std::uint8_t>(le.bytes), readUnalignLittleEndian<std::uint8_t>(le.bytes));
78  EXPECT_EQ(EndianDut::convertFrom<std::int16_t>(le.bytes), readUnalignLittleEndian<std::int16_t>(le.bytes));
79  EXPECT_EQ(EndianDut::convertFrom<std::uint32_t>(le.bytes), readUnalignLittleEndian<std::uint32_t>(le.bytes));
80  EXPECT_EQ(EndianDut::convertFrom<std::int64_t>(le.bytes), readUnalignLittleEndian<std::int64_t>(le.bytes));
81 }
82 
83 TEST(VisionaryEndian, readUnalignedBigEndian_is_same_as_convertFrom_big)
84 {
85  using namespace visionary;
86 
87  using EndianDut = Endian<endian::big, endian::native>;
88 
89  EXPECT_EQ(EndianDut::convertFrom<std::uint8_t>(be.bytes), readUnalignBigEndian<std::uint8_t>(be.bytes));
90  EXPECT_EQ(EndianDut::convertFrom<std::int16_t>(be.bytes), readUnalignBigEndian<std::int16_t>(be.bytes));
91  EXPECT_EQ(EndianDut::convertFrom<std::uint32_t>(be.bytes), readUnalignBigEndian<std::uint32_t>(be.bytes));
92  EXPECT_EQ(EndianDut::convertFrom<std::int64_t>(be.bytes), readUnalignBigEndian<std::int64_t>(be.bytes));
93 }
94 
95 TEST(VisionaryEndian, writeUnalignedLittleEndian_is_same_as_convertTo_little)
96 {
97  using namespace visionary;
98 
100 
101  struct
102  {
103  std::uint8_t cf[8u];
104  std::uint8_t ru[8u];
105  } buf;
106 
107  EndianDut::convertTo<char>(buf.cf, sizeof(buf), 'A');
108  writeUnalignLittleEndian<char>(buf.ru, sizeof(buf), 'A');
109  EXPECT_EQ(0, std::memcmp(buf.cf, buf.ru, 1u));
110 
111  EndianDut::convertTo<std::uint16_t>(buf.cf, sizeof(buf), 0xbeefu);
112  writeUnalignLittleEndian<std::uint16_t>(buf.ru, sizeof(buf), 0xbeefu);
113  EXPECT_EQ(0, std::memcmp(buf.cf, buf.ru, 2u));
114 
115  EndianDut::convertTo<std::int32_t>(buf.cf, sizeof(buf), -123456789);
116  writeUnalignLittleEndian<std::int32_t>(buf.ru, sizeof(buf), -123456789);
117  EXPECT_EQ(0, std::memcmp(buf.cf, buf.ru, 4u));
118 
119  EndianDut::convertTo<std::uint64_t>(buf.cf, sizeof(buf), 0xfeedbe117ee14e11ull);
120  writeUnalignLittleEndian<std::uint64_t>(buf.ru, sizeof(buf), 0xfeedbe117ee14e11ull);
121  EXPECT_EQ(0, std::memcmp(buf.cf, buf.ru, 8u));
122 }
123 
124 TEST(VisionaryEndian, writeUnalignedBigEndian_is_same_as_convertTo_big)
125 {
126  using namespace visionary;
127 
128  using EndianDut = Endian<endian::native, endian::big>;
129 
130  struct
131  {
132  std::uint8_t cf[8u];
133  std::uint8_t ru[8u];
134  } buf;
135 
136  EndianDut::convertTo<char>(buf.cf, sizeof(buf), 'b');
137  writeUnalignBigEndian<char>(buf.ru, sizeof(buf), 'b');
138  EXPECT_EQ(0, std::memcmp(buf.cf, buf.ru, 1u));
139 
140  EndianDut::convertTo<std::uint16_t>(buf.cf, sizeof(buf), 0xbeefu);
141  writeUnalignBigEndian<std::uint16_t>(buf.ru, sizeof(buf), 0xbeefu);
142  EXPECT_EQ(0, std::memcmp(buf.cf, buf.ru, 2u));
143 
144  EndianDut::convertTo<std::int32_t>(buf.cf, sizeof(buf), -123456789);
145  writeUnalignBigEndian<std::int32_t>(buf.ru, sizeof(buf), -123456789);
146  EXPECT_EQ(0, std::memcmp(buf.cf, buf.ru, 4u));
147 
148  EndianDut::convertTo<std::uint64_t>(buf.cf, sizeof(buf), 0xfeedbe117ee14e11ull);
149  writeUnalignBigEndian<std::uint64_t>(buf.ru, sizeof(buf), 0xfeedbe117ee14e11ull);
150  EXPECT_EQ(0, std::memcmp(buf.cf, buf.ru, 8u));
151 }
152 
153 TEST(VisionaryEndian, nativeToLittleEndian_is_same_as_convert_native_little)
154 {
155  using namespace visionary;
156 
157  using EndianDut = Endian<endian::native, endian::little>;
158 
159  EXPECT_EQ(nativeToLittleEndian<std::int8_t>(0x7f), EndianDut::convert<std::int8_t>(0x7f));
160  EXPECT_EQ(nativeToLittleEndian<std::uint16_t>(0xaffeu), EndianDut::convert<std::uint16_t>(0xaffeu));
161  EXPECT_EQ(nativeToLittleEndian<std::uint32_t>(123456789), EndianDut::convert<std::uint32_t>(123456789));
162  EXPECT_FLOAT_EQ(nativeToLittleEndian<float>(3.14159265e-27f), EndianDut::convert<float>(3.14159265e-27f));
163  EXPECT_EQ(nativeToLittleEndian<std::int64_t>(-12345678917636455ll),
164  EndianDut::convert<std::int64_t>(-12345678917636455ll));
165  EXPECT_DOUBLE_EQ(nativeToLittleEndian<double>(3.14159265e-127), EndianDut::convert<double>(3.14159265e-127));
166 }
167 
168 TEST(VisionaryEndian, nativeToBigEndian_is_same_as_convert_native_big)
169 {
170  using namespace visionary;
171 
172  using EndianDut = Endian<endian::native, endian::big>;
173 
174  EXPECT_EQ(nativeToBigEndian<std::int8_t>(0x7f), EndianDut::convert<std::int8_t>(0x7f));
175  EXPECT_EQ(nativeToBigEndian<std::uint16_t>(0xaffeu), EndianDut::convert<std::uint16_t>(0xaffeu));
176  EXPECT_EQ(nativeToBigEndian<std::uint32_t>(123456789), EndianDut::convert<std::uint32_t>(123456789));
177  EXPECT_FLOAT_EQ(nativeToBigEndian<float>(3.14159265e-27f), EndianDut::convert<float>(3.14159265e-27f));
178  EXPECT_EQ(nativeToBigEndian<std::int64_t>(-12345678917636455ll),
179  EndianDut::convert<std::int64_t>(-12345678917636455ll));
180  EXPECT_DOUBLE_EQ(nativeToBigEndian<double>(3.14159265e-127), EndianDut::convert<double>(3.14159265e-127));
181 }
182 
183 TEST(VisionaryEndian, littleEndianToNative_is_same_as_convert_little_native)
184 {
185  using namespace visionary;
186 
187  using EndianDut = Endian<endian::little, endian::native>;
188 
189  EXPECT_EQ(littleEndianToNative<std::int8_t>(0x7f), EndianDut::convert<std::int8_t>(0x7f));
190  EXPECT_EQ(littleEndianToNative<std::uint16_t>(0xaffeu), EndianDut::convert<std::uint16_t>(0xaffeu));
191  EXPECT_EQ(littleEndianToNative<std::uint32_t>(123456789), EndianDut::convert<std::uint32_t>(123456789));
192  EXPECT_FLOAT_EQ(littleEndianToNative<float>(3.14159265e-27f), EndianDut::convert<float>(3.14159265e-27f));
193  EXPECT_EQ(littleEndianToNative<std::int64_t>(-12345678917636455ll),
194  EndianDut::convert<std::int64_t>(-12345678917636455ll));
195  EXPECT_DOUBLE_EQ(littleEndianToNative<double>(3.14159265e-127), EndianDut::convert<double>(3.14159265e-127));
196 }
197 
198 TEST(VisionaryEndian, bigEndianToNative_is_same_as_convert_big_native)
199 {
200  using namespace visionary;
201 
202  using EndianDut = Endian<endian::big, endian::native>;
203 
204  EXPECT_EQ(bigEndianToNative<std::int8_t>(0x7f), EndianDut::convert<std::int8_t>(0x7f));
205  EXPECT_EQ(bigEndianToNative<std::uint16_t>(0xaffeu), EndianDut::convert<std::uint16_t>(0xaffeu));
206  EXPECT_EQ(bigEndianToNative<std::uint32_t>(123456789), EndianDut::convert<std::uint32_t>(123456789));
207  EXPECT_FLOAT_EQ(bigEndianToNative<float>(3.14159265e-27f), EndianDut::convert<float>(3.14159265e-27f));
208  EXPECT_EQ(bigEndianToNative<std::int64_t>(-12345678917636455ll),
209  EndianDut::convert<std::int64_t>(-12345678917636455ll));
210  EXPECT_DOUBLE_EQ(bigEndianToNative<double>(3.14159265e-127), EndianDut::convert<double>(3.14159265e-127));
211 }
212 
213 // The list of types we want to test.
214 using Implementations1 = ::testing::Types<visionary::Endian<visionary::endian::little, visionary::endian::native>,
218 
219 template <typename T>
220 class VisionaryEndianTest1 : public testing::Test
221 {
222 public:
223  using DUT = T;
224 };
225 
227 
228 TYPED_TEST(VisionaryEndianTest1, convert_is_revertable)
229 {
230  using namespace visionary;
231 
232  using Forward = typename TestFixture::DUT;
233  using Inverse = Endian<Forward::to, Forward::from>;
234 
235  EXPECT_EQ(Inverse::template convert(Forward::template convert<signed char>(-'A')), -'A');
236  EXPECT_EQ(Inverse::template convert(Forward::template convert<std::int16_t>(-12345)), -12345);
237  EXPECT_EQ(Inverse::template convert(Forward::template convert<std::uint16_t>(55453u)), 55453u);
238  EXPECT_EQ(Inverse::template convert(Forward::template convert<std::int32_t>(-98765453)), -98765453);
239  EXPECT_FLOAT_EQ(Inverse::template convert(Forward::template convert<float>(-2.7182818e32f)), -2.7182818e32f);
240  EXPECT_EQ(Inverse::template convert(Forward::template convert<std::uint64_t>(9876545367236465ull)),
241  9876545367236465ull);
242  EXPECT_DOUBLE_EQ(Inverse::template convert(Forward::template convert<double>(-2.7182818e132)), -2.7182818e132);
243 }
244 
245 using Implementations2 = ::testing::Types<visionary::Endian<visionary::endian::little, visionary::endian::little>,
248 
249 template <typename T>
250 class VisionaryEndianTest2 : public testing::Test
251 {
252 public:
253  using DUT = T;
254 };
255 
257 
258 TYPED_TEST(VisionaryEndianTest2, convert_x_to_x_is_ident)
259 {
260  using namespace visionary;
261 
262  using Forward = typename TestFixture::DUT;
263 
264  EXPECT_EQ(Forward::template convert<unsigned char>('A'), 'A');
265  EXPECT_EQ(Forward::template convert<std::int16_t>(-12345), -12345);
266  EXPECT_EQ(Forward::template convert<std::uint16_t>(55453u), 55453u);
267  EXPECT_EQ(Forward::template convert<std::int32_t>(-98765453), -98765453);
268  EXPECT_EQ(Forward::template convert<float>(-2.7182818e32f), -2.7182818e32f);
269  EXPECT_EQ(Forward::template convert<std::uint64_t>(9876545367236465ull), 9876545367236465ull);
270  EXPECT_EQ(Forward::template convert<double>(-2.7182818e132), -2.7182818e132);
271 }
272 
273 TYPED_TEST(VisionaryEndianTest2, convertTo_x_is_ident)
274 {
275  using namespace visionary;
276 
277  using Forward = typename TestFixture::DUT;
278 
279  struct
280  {
281  std::uint8_t cf[8u];
282  std::uint8_t ru[8u];
283  } buf;
284 
285  Forward::template convertTo<unsigned char>(buf.cf, sizeof(buf.cf), 'A');
286  writeUnaligned<unsigned char>(buf.ru, sizeof(buf.ru), 'A');
287  EXPECT_EQ(0, std::memcmp(buf.cf, buf.ru, 1u));
288 
289  Forward::template convertTo<std::int16_t>(buf.cf, sizeof(buf.cf), -12345);
290  writeUnaligned<std::int16_t>(buf.ru, sizeof(buf.ru), -12345);
291  EXPECT_EQ(0, std::memcmp(buf.cf, buf.ru, 2u));
292 
293  Forward::template convertTo<float>(buf.cf, sizeof(buf.cf), -2.7182818e32f);
294  writeUnaligned<float>(buf.ru, sizeof(buf.ru), -2.7182818e32f);
295  EXPECT_EQ(0, std::memcmp(buf.cf, buf.ru, 4u));
296 
297  Forward::template convertTo<std::uint64_t>(buf.cf, sizeof(buf.cf), 9876545367236465ull);
298  writeUnaligned<std::uint64_t>(buf.ru, sizeof(buf.ru), 9876545367236465ull);
299  EXPECT_EQ(0, std::memcmp(buf.cf, buf.ru, 4u));
300 }
convert
void convert(const A &a, B &b)
BE::i64
std::int64_t i64
Definition: EndianTest.cpp:29
VisionaryEndian.h
TEST
TEST(VisionaryEndian, convertFrom_little)
Definition: EndianTest.cpp:49
T
T
Definition: mem_fn_cc.hpp:25
visionary
Definition: MD5.cpp:44
Implementations2
::testing::Types< visionary::Endian< visionary::endian::little, visionary::endian::little >, visionary::Endian< visionary::endian::big, visionary::endian::big >, visionary::Endian< visionary::endian::native, visionary::endian::native > > Implementations2
Definition: EndianTest.cpp:247
BE::u16
std::uint16_t u16
Definition: EndianTest.cpp:24
BE::u32
std::uint32_t u32
Definition: EndianTest.cpp:26
VisionaryEndianTest2::DUT
T DUT
Definition: EndianTest.cpp:253
VisionaryEndianTest1
Definition: EndianTest.cpp:220
LE::u32
std::uint32_t u32
Definition: EndianTest.cpp:43
BE::i32
std::int32_t i32
Definition: EndianTest.cpp:27
LE::bytes
std::uint8_t bytes[8]
Definition: EndianTest.cpp:38
Values
Definition: EndianTest.cpp:13
f
f
LE
Definition: EndianTest.cpp:32
TYPED_TEST
TYPED_TEST(VisionaryEndianTest1, convert_is_revertable)
Definition: EndianTest.cpp:228
LE::LE
LE()
Definition: EndianTest.cpp:34
BE::i8
std::int8_t i8
Definition: EndianTest.cpp:23
VisionaryEndianTest1::DUT
T DUT
Definition: EndianTest.cpp:223
BE::bytes
std::uint8_t bytes[8]
Definition: EndianTest.cpp:21
LE::u64
std::uint64_t u64
Definition: EndianTest.cpp:45
VisionaryEndianTest2
Definition: EndianTest.cpp:250
visionary::Endian
Definition: VisionaryEndian.h:162
LE::i8
std::int8_t i8
Definition: EndianTest.cpp:40
Implementations1
::testing::Types< visionary::Endian< visionary::endian::little, visionary::endian::native >, visionary::Endian< visionary::endian::big, visionary::endian::native >, visionary::Endian< visionary::endian::native, visionary::endian::little >, visionary::Endian< visionary::endian::native, visionary::endian::big > > Implementations1
Definition: EndianTest.cpp:217
BE
Definition: EndianTest.cpp:15
BE::u64
std::uint64_t u64
Definition: EndianTest.cpp:28
BE::i16
std::int16_t i16
Definition: EndianTest.cpp:25
LE::u16
std::uint16_t u16
Definition: EndianTest.cpp:41
LE::i64
std::int64_t i64
Definition: EndianTest.cpp:46
TYPED_TEST_SUITE
TYPED_TEST_SUITE(VisionaryEndianTest1, Implementations1)
LE::u8
std::uint8_t u8
Definition: EndianTest.cpp:39
LE::i32
std::int32_t i32
Definition: EndianTest.cpp:44
le
static const union LE le
be
static const union BE be
LE::i16
std::int16_t i16
Definition: EndianTest.cpp:42
BE::BE
BE()
Definition: EndianTest.cpp:17
BE::u8
std::uint8_t u8
Definition: EndianTest.cpp:22


sick_visionary_ros
Author(s): SICK AG TechSupport 3D Snapshot
autogenerated on Thu Feb 8 2024 03:38:54