6 # pragma GCC diagnostic ignored "-Wfloat-equal"
7 # pragma GCC diagnostic ignored "-Wdouble-promotion"
10 #include <gtest/gtest.h>
108 ASSERT_EQ(1, A3::ValueType::C::RawValueType::BitLen);
110 ASSERT_EQ(8 * 4, A1::MaxBitLen);
111 ASSERT_EQ(16 * 2, A2::MaxBitLen);
112 ASSERT_EQ((8 + 16 + 5 + 3) * 2, A3::MaxBitLen);
117 ASSERT_FALSE(a1.empty());
118 for (A1::const_iterator it = a1.begin(); it != a1.end(); ++it)
123 ASSERT_FALSE(a2.empty());
124 for (A2::const_iterator it = a2.begin(); it != a2.end(); ++it)
129 for (A3::const_iterator it = a3.begin(); it != a3.end(); ++it)
133 ASSERT_EQ(0, it->c.size());
134 ASSERT_TRUE(it->c.empty());
140 for (
uint8_t i = 0; i < 4; i++)
144 for (
uint8_t i = 0; i < 2; i++)
148 for (
uint8_t i = 0; i < 2; i++)
152 for (
uint8_t i2 = 0; i2 < 5; i2++)
154 a3[i].c.push_back(i2 & 1);
156 ASSERT_EQ(5, a3[i].c.size());
157 ASSERT_FALSE(a3[i].c.empty());
174 static const std::string Reference =
175 "00000000 00000001 00000010 00000011 "
176 "00000000 00000000 00000000 00111100 "
177 "00000000 00000000 00000000 10101010 "
178 "00000001 00000000 00111100 10101010";
180 ASSERT_EQ(Reference, bs_wr.toString());
200 for (
uint8_t i = 0; i < 4; i++)
202 ASSERT_EQ(a1[i], a1_[i]);
204 for (
uint8_t i = 0; i < 2; i++)
206 ASSERT_EQ(a2[i], a2_[i]);
208 for (
uint8_t i = 0; i < 2; i++)
210 ASSERT_EQ(a3[i].a, a3_[i].a);
211 ASSERT_EQ(a3[i].b, a3_[i].b);
212 ASSERT_EQ(a3[i].c, a3_[i].c);
226 ASSERT_TRUE(a1 == v1);
227 ASSERT_FALSE(a1 != v1);
228 ASSERT_TRUE(v1 == a1);
229 ASSERT_FALSE(v1 != a1);
230 ASSERT_FALSE(a1 < v1);
233 ASSERT_FALSE(a1 == v1);
234 ASSERT_TRUE(a1 != v1);
235 ASSERT_TRUE(a1 < v1);
237 ASSERT_EQ(0, a1.front());
238 ASSERT_EQ(3, a1.back());
241 std::vector<bool> v2;
248 ASSERT_TRUE(a3[0].c == v2);
249 ASSERT_FALSE(a3[0].c == v1);
250 ASSERT_FALSE(a3[0].c != v2);
251 ASSERT_TRUE(a3[0].c != v1);
254 ASSERT_TRUE(a3[0].c != v2);
255 ASSERT_FALSE(a3[0].c == v2);
268 ASSERT_EQ(3 + 5, A::MaxBitLen);
269 ASSERT_EQ(8 + 255 * 8, B::MaxBitLen);
271 ASSERT_TRUE(a.empty());
272 ASSERT_TRUE(b.empty());
273 ASSERT_TRUE(b2.empty());
284 ASSERT_EQ(
"000" "00000 000" "00000", bs_wr.toString());
293 ASSERT_TRUE(a.empty());
294 ASSERT_TRUE(b.empty());
295 ASSERT_TRUE(b2.empty());
320 ASSERT_EQ(
"10110101 00000010 00101010 11010110 01111011 01001000", bs_wr.toString());
328 ASSERT_TRUE(a.empty());
329 ASSERT_TRUE(b.empty());
330 ASSERT_TRUE(b2.empty());
336 ASSERT_EQ(5, a.size());
337 ASSERT_EQ(2, b.size());
338 ASSERT_EQ(2, b2.size());
347 ASSERT_EQ(-42, b[1]);
349 ASSERT_EQ(123, b2[0]);
350 ASSERT_EQ(72, b2[1]);
353 ASSERT_FALSE(a == b);
354 ASSERT_FALSE(b == a);
360 ASSERT_TRUE(a.empty());
361 ASSERT_TRUE(b.empty());
365 ASSERT_EQ(5, a.size());
366 ASSERT_EQ(255, b.size());
368 for (
uint8_t i = 0; i < 5; i++)
372 for (
uint8_t i = 0; i < 255; i++)
379 template <
typename B>
410 res = B::encode(obj.
b, codec, tao_mode);
427 res = B::decode(obj.
b, codec, tao_mode);
437 template <
typename T>
444 EXPECT_EQ(1, T::encode(value, sc_wr, tao_mode));
448 for (
int i = 0; i < 3; i++)
452 EXPECT_EQ(1, T::decode(value2, sc_rd, tao_mode));
453 EXPECT_EQ(value, value2);
455 return bs_wr.toString();
490 a.b[0].push_back(
true);
491 a.b[0].push_back(
false);
501 b.
b[0].push_back(42);
502 b.
b[0].push_back(72);
504 b.
b[2].push_back(123);
505 b.
b[2].push_back(99);
507 ASSERT_EQ(
"00000000 00000000 00000011 00000010 00101010 01001000 00000000 01111011 01100011",
510 ASSERT_EQ(
"00000000 00000000 00000011 00000010 00101010 01001000 00000000 00000010 01111011 01100011",
521 ASSERT_EQ(
"00000000 00111100 00000001 00000010 00000011",
524 ASSERT_EQ(
"00000000 00111100 00000011 00000001 00000010 00000011",
534 ASSERT_TRUE(a.empty());
542 ASSERT_FALSE(a.empty());
560 ASSERT_EQ(
"11000101 01001001 00001111 11000000 00100000 01000000 01100000", bs_wr.toString());
567 ASSERT_EQ(1, a2.size());
571 ASSERT_TRUE(a2.empty());
578 ASSERT_EQ(1, a2.size());
582 ASSERT_EQ(5, a2.size());
584 ASSERT_EQ(197, a2[0]);
585 ASSERT_EQ(73, a2[1]);
586 ASSERT_EQ(15, a2[2]);
587 ASSERT_EQ(192, a2[3]);
588 ASSERT_EQ(32, a2[4]);
600 a.b[0].push_back(55);
601 a.b[0].push_back(66);
642 ASSERT_EQ(
"00000000 00111100 00010001 00100010 00110011 01000100", bs_wr.toString());
654 ASSERT_EQ(
"00000000 00111100 00010001 00100010 00110011", bs_wr.toString());
669 typedef EightBitArray
C;
679 ASSERT_TRUE(a == a2);
680 ASSERT_TRUE(b == b2);
681 ASSERT_TRUE(c == c2);
683 a.push_back(OneBitArray());
684 b.push_back(EightBitArray());
687 ASSERT_TRUE(a != a2);
688 ASSERT_TRUE(b != b2);
689 ASSERT_TRUE(c != c2);
695 ASSERT_TRUE(a2 == a);
696 ASSERT_TRUE(b2 == b);
697 ASSERT_TRUE(c2 == c);
711 ASSERT_EQ(2, a.size());
718 ASSERT_EQ(4, b.size());
735 ASSERT_TRUE(a8 == a7);
737 ASSERT_TRUE(a8 == a8);
739 ASSERT_TRUE(a7 == a7);
740 ASSERT_TRUE(a8 ==
"");
741 ASSERT_TRUE(a7 ==
"");
745 ASSERT_TRUE(a8 ==
"Hello world!");
746 ASSERT_TRUE(a7 ==
"123");
748 a8 =
"Our sun is dying.";
750 ASSERT_TRUE(
"Our sun is dying." == a8);
751 ASSERT_TRUE(
"456" == a7);
755 ASSERT_TRUE(
"Our sun is dying. 123456-789" == a8);
757 ASSERT_TRUE(a8_2 ==
"");
758 ASSERT_TRUE(a8_2.empty());
759 ASSERT_TRUE(a8_2 != a8);
761 ASSERT_TRUE(a8_2 ==
"Our sun is dying. 123456-789");
762 ASSERT_TRUE(a8_2 == a8);
767 ASSERT_STREQ(
"", A8().c_str());
768 ASSERT_STREQ(
"", A7().c_str());
769 ASSERT_STREQ(
"Our sun is dying. 123456-789", a8_2.c_str());
770 ASSERT_STREQ(
"Our sun is dying. 123456-789", a8.c_str());
771 ASSERT_STREQ(
"456", a7.c_str());
778 ASSERT_EQ(3, a8_3.size());
779 ASSERT_EQ(3, a7_3.size());
780 ASSERT_STREQ(
"123", a8_3.c_str());
781 ASSERT_STREQ(
"456", a7_3.c_str());
791 ASSERT_TRUE(
"" == a);
793 a.appendFormatted(
"%4.1f", 12.3);
795 a.appendFormatted(
"%li", -123456789L);
796 a.appendFormatted(
"%s",
" TOTAL PERSPECTIVE VORTEX ");
797 a.appendFormatted(
"0x%X", 0xDEADBEEF);
799 ASSERT_STREQ(
"12.3 -123456789 TOTAL PERSPECTIVE VORTEX 0xDE", a.c_str());
810 a1 =
"12\n3\x44\xa5\xde\xad\x79";
812 std::cout << std::endl;
817 std::cout << std::endl;
820 af16d1.push_back(1.23F);
821 af16d1.push_back(4.56F);
823 std::cout << std::endl;
827 std::cout << std::endl;
831 std::cout << std::endl;
841 ThreeDimensional threedee;
845 threedee[
x].resize(3);
846 for (
uint8_t y = 0; y < threedee[
x].size(); y++)
848 threedee[
x][y].resize(3);
849 for (
uint8_t z = 0; z < threedee[
x][y].size(); z++)
851 threedee[
x][y][z] = 1.0F / (float(
x + y + z) + 1.0F);
857 std::cout << std::endl;
869 const double nans3x3[] =
876 ASSERT_EQ(0, m3x3s.
size());
879 double nans3x3_out[9];
881 for (
uint8_t i = 0; i < 9; i++)
883 ASSERT_DOUBLE_EQ(0, nans3x3_out[i]);
887 std::vector<double> empty;
889 ASSERT_EQ(0, m3x3s.
size());
893 for (
uint8_t i = 0; i < 9; i++)
895 ASSERT_DOUBLE_EQ(0, empty.at(i));
901 std::vector<float> scalar2x2(4);
902 scalar2x2[0] = scalar2x2[3] = 3.14F;
904 ASSERT_EQ(1, m2x2f.
size());
905 ASSERT_FLOAT_EQ(3.14F, m2x2f[0]);
908 const float reference[] =
913 ASSERT_TRUE(
std::equal(scalar2x2.begin(), scalar2x2.end(), reference));
916 const float scalar6x6[] =
926 ASSERT_EQ(1, m6x6d.
size());
927 ASSERT_DOUBLE_EQ(-18, m6x6d[0]);
929 std::vector<long double> output(36);
931 ASSERT_TRUE(
std::equal(output.begin(), output.end(), scalar6x6));
936 const float diagonal6x6[] =
946 ASSERT_EQ(6, m6x6d.
size());
947 ASSERT_DOUBLE_EQ(1, m6x6d[0]);
948 ASSERT_DOUBLE_EQ(-2, m6x6d[1]);
949 ASSERT_DOUBLE_EQ(3, m6x6d[2]);
950 ASSERT_DOUBLE_EQ(-4, m6x6d[3]);
951 ASSERT_DOUBLE_EQ(5, m6x6d[4]);
952 ASSERT_DOUBLE_EQ(-6, m6x6d[5]);
954 std::vector<long double> output(36);
956 ASSERT_TRUE(
std::equal(output.begin(), output.end(), diagonal6x6));
961 std::vector<float> full3x3(9);
962 for (
uint8_t i = 0; i < 9; i++)
964 full3x3[i] = float(i);
967 ASSERT_EQ(9, m3x3s.
size());
968 for (
uint8_t i = 0; i < 9; i++)
970 ASSERT_FLOAT_EQ(
float(i), m3x3s[i]);
975 ASSERT_TRUE(
std::equal(full3x3.begin(), full3x3.end(), output));
980 const double scalarnan3x3[] =
987 ASSERT_EQ(3, m3x3s.
size());
988 ASSERT_FALSE(m3x3s[0] <= m3x3s[0]);
989 ASSERT_FALSE(m3x3s[1] <= m3x3s[1]);
990 ASSERT_FALSE(m3x3s[2] <= m3x3s[2]);
994 ASSERT_FALSE(output[0] <= output[0]);
995 ASSERT_EQ(0, output[1]);
996 ASSERT_EQ(0, output[2]);
997 ASSERT_EQ(0, output[3]);
998 ASSERT_FALSE(output[4] <= output[4]);
999 ASSERT_EQ(0, output[5]);
1000 ASSERT_EQ(0, output[6]);
1001 ASSERT_EQ(0, output[7]);
1002 ASSERT_FALSE(output[8] <= output[8]);
1007 const float full2x2[] =
1013 ASSERT_EQ(4, m2x2f.
size());
1014 ASSERT_FLOAT_EQ(1, m2x2f[0]);
1015 ASSERT_FALSE(m2x2f[1] <= m2x2f[1]);
1016 ASSERT_FLOAT_EQ(0, m2x2f[2]);
1017 ASSERT_FLOAT_EQ(-2, m2x2f[3]);
1021 ASSERT_EQ(1, output[0]);
1022 ASSERT_FALSE(output[1] <= output[1]);
1023 ASSERT_EQ(0, output[2]);
1024 ASSERT_EQ(-2, output[3]);
1029 const float zero2x2[] =
1035 ASSERT_EQ(1, m2x2f.
size());
1036 ASSERT_FLOAT_EQ(0, m2x2f[0]);
1041 const float sym2x2[] =
1047 ASSERT_EQ(3, m2x2f.
size());
1049 float sym2x2_out[4];
1051 ASSERT_FLOAT_EQ(1, sym2x2_out[0]);
1052 ASSERT_FLOAT_EQ(2, sym2x2_out[1]);
1053 ASSERT_FLOAT_EQ(2, sym2x2_out[2]);
1054 ASSERT_FLOAT_EQ(1, sym2x2_out[3]);
1057 const float sym3x3[] =
1064 ASSERT_EQ(6, m3x3s.
size());
1065 ASSERT_EQ(1, m3x3s[0]);
1066 ASSERT_EQ(2, m3x3s[1]);
1067 ASSERT_EQ(3, m3x3s[2]);
1068 ASSERT_EQ(4, m3x3s[3]);
1069 ASSERT_EQ(5, m3x3s[4]);
1070 ASSERT_EQ(6, m3x3s[5]);
1072 float sym3x3_out[9];
1075 for (
int i = 0; i < 9; i++)
1077 ASSERT_FLOAT_EQ(sym3x3[i], sym3x3_out[i]);
1081 const double sym6x6[] =
1085 3, 8, 12, 13, 14, 15,
1086 4, 9, 13, 16, 17, 18,
1087 5, 10, 14, 17, 19, 20,
1088 6, 11, 15, 18, 20, 21
1091 ASSERT_EQ(21, m6x6d.
size());
1094 ASSERT_DOUBLE_EQ(
double(i + 1), m6x6d[i]);
1097 double sym6x6_out[36];
1100 for (
int i = 0; i < 36; i++)
1102 ASSERT_DOUBLE_EQ(sym6x6[i], sym6x6_out[i]);
1114 float diagonal6x6[] =
1125 diagonal6x6[1] = std::numeric_limits<float>::epsilon();
1126 diagonal6x6[4] = -std::numeric_limits<float>::epsilon();
1127 diagonal6x6[34] = -std::numeric_limits<float>::epsilon();
1130 ASSERT_EQ(6, m6x6d.
size());
1131 ASSERT_DOUBLE_EQ(1, m6x6d[0]);
1132 ASSERT_DOUBLE_EQ(-2, m6x6d[1]);
1133 ASSERT_DOUBLE_EQ(3, m6x6d[2]);
1134 ASSERT_DOUBLE_EQ(-4, m6x6d[3]);
1135 ASSERT_DOUBLE_EQ(5, m6x6d[4]);
1136 ASSERT_DOUBLE_EQ(-6, m6x6d[5]);
1138 std::vector<long double> output(36);
1142 ASSERT_FALSE(
std::equal(output.begin(), output.end(), diagonal6x6));
1154 const long scalar[] =
1161 ASSERT_EQ(1, m3x3int.
size());
1162 ASSERT_EQ(42, m3x3int[0]);
1164 std::vector<int> output(9);
1166 ASSERT_TRUE(
std::equal(output.begin(), output.end(), scalar));
1169 std::vector<short> diagonal(9);
1174 ASSERT_EQ(3, m3x3int.
size());
1175 ASSERT_EQ(6, m3x3int[0]);
1176 ASSERT_EQ(-57, m3x3int[1]);
1177 ASSERT_EQ(1139, m3x3int[2]);
1180 std::vector<long double> full(9);
1181 for (
uint8_t i = 0; i < 9; i++)
1186 ASSERT_EQ(9, m3x3int.
size());
1187 for (
uint8_t i = 0; i < 9; i++)
1189 ASSERT_EQ(i, m3x3int[i]);
1194 #if UAVCAN_EXCEPTIONS
1199 std::vector<float> ill_formed_row_major(8);
1200 ASSERT_THROW(m3x3s.
packSquareMatrix(ill_formed_row_major), std::out_of_range);
1212 ASSERT_TRUE(m3x3s.
empty());
1216 ASSERT_EQ(9, m3x3s.
size());
1217 for (
uint8_t i = 0; i < 9; i++)
1219 ASSERT_EQ(0, m3x3s[i]);
1228 #if UAVCAN_EXCEPTIONS
1241 ASSERT_EQ(9, m3x3s.
size());
1243 ASSERT_EQ(9, m3x3s.
size());
1247 ASSERT_EQ(11, m3x3s[0]);
1248 ASSERT_EQ(12, m3x3s[1]);
1249 ASSERT_EQ(13, m3x3s[2]);
1250 ASSERT_EQ(21, m3x3s[3]);
1251 ASSERT_EQ(22, m3x3s[4]);
1252 ASSERT_EQ(23, m3x3s[5]);
1253 ASSERT_EQ(31, m3x3s[6]);
1254 ASSERT_EQ(32, m3x3s[7]);
1255 ASSERT_EQ(33, m3x3s[8]);
1259 for (
unsigned i = 0; i < 9; i++)
1261 const bool diagonal = (i == 0) || (i == 4) || (i == 8);
1265 ASSERT_EQ(9, m3x3s.
size());
1267 ASSERT_EQ(1, m3x3s.
size());
1269 ASSERT_EQ(9, m3x3s.
size());
1271 for (
uint8_t i = 0; i < 9; i++)
1273 const bool diagonal = (i == 0) || (i == 4) || (i == 8);
1274 ASSERT_EQ((diagonal ? 123 : 0), m3x3s[i]);
1296 ASSERT_EQ(6, m3x3s.
size());
1298 ASSERT_EQ(9, m3x3s.
size());
1300 ASSERT_EQ(1, m3x3s[0]);
1301 ASSERT_EQ(2, m3x3s[1]);
1302 ASSERT_EQ(3, m3x3s[2]);
1303 ASSERT_EQ(2, m3x3s[3]);
1304 ASSERT_EQ(4, m3x3s[4]);
1305 ASSERT_EQ(5, m3x3s[5]);
1306 ASSERT_EQ(3, m3x3s[6]);
1307 ASSERT_EQ(5, m3x3s[7]);
1308 ASSERT_EQ(6, m3x3s[8]);
1311 ASSERT_EQ(6, m3x3s.
size());
1313 ASSERT_EQ(1, m3x3s[0]);
1314 ASSERT_EQ(2, m3x3s[1]);
1315 ASSERT_EQ(3, m3x3s[2]);
1316 ASSERT_EQ(4, m3x3s[3]);
1317 ASSERT_EQ(5, m3x3s[4]);
1318 ASSERT_EQ(6, m3x3s[5]);
1331 ArrayStatic32 array_s32;
1333 ArrayDynamic64 array_d64;
1335 array_d64.resize(2);
1336 array_d64[0].resize(2);
1337 array_d64[1].resize(2);
1338 array_d64[0][0].resize(2);
1339 array_d64[0][1].resize(2);
1340 array_d64[1][0].resize(2);
1341 array_d64[1][1].resize(2);
1343 std::cout <<
"One:";
1345 std::cout << std::endl <<
"------";
1347 std::cout << std::endl;
1350 ASSERT_TRUE(array_d64 == array_s32);
1351 ASSERT_TRUE(array_d64.isClose(array_s32));
1352 ASSERT_TRUE(array_s32.isClose(array_d64));
1360 array_d64[0][0][0] = 123.456;
1365 std::cout <<
"Two:";
1367 std::cout << std::endl <<
"------";
1369 std::cout << std::endl;
1372 ASSERT_FALSE(array_d64 == array_s32);
1373 ASSERT_TRUE(array_d64.isClose(array_s32));
1374 ASSERT_TRUE(array_s32.isClose(array_d64));
1377 array_d64[0][0][0] = 123.457;
1379 ASSERT_FALSE(array_d64 == array_s32);
1380 ASSERT_FALSE(array_d64.isClose(array_s32));
1381 ASSERT_FALSE(array_s32.isClose(array_d64));
1384 array_d64[0][0][0] = 123.456;
1386 ASSERT_FALSE(array_d64 == array_s32);
1387 ASSERT_TRUE(array_d64.isClose(array_s32));
1388 ASSERT_TRUE(array_s32.isClose(array_d64));
1390 array_d64[0][0].resize(1);
1392 ASSERT_FALSE(array_d64 == array_s32);
1393 ASSERT_FALSE(array_d64.isClose(array_s32));
1394 ASSERT_FALSE(array_s32.isClose(array_d64));
1396 std::cout <<
"Three:";
1398 std::cout << std::endl <<
"------";
1400 std::cout << std::endl;
1407 str.convertToLowerCaseASCII();
1408 str.convertToUpperCaseASCII();
1410 ASSERT_STREQ(
"",
str.c_str());
1412 str =
"Hello World!";
1414 ASSERT_STREQ(
"Hello World!",
str.c_str());
1415 str.convertToLowerCaseASCII();
1416 ASSERT_STREQ(
"hello world!",
str.c_str());
1417 str.convertToUpperCaseASCII();
1418 ASSERT_STREQ(
"HELLO WORLD!",
str.c_str());