123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- #include <gtest/gtest.h>
- #include <uavcan/marshal/bit_stream.hpp>
- #include <uavcan/transport/transfer_buffer.hpp>
- TEST(BitStream, ToString)
- {
- {
- uavcan::StaticTransferBuffer<8> buf;
- uavcan::BitStream bs(buf);
- ASSERT_EQ("", bs.toString());
- ASSERT_EQ("", bs.toString());
- }
- {
- const uint8_t data[] = {0xad};
- uavcan::StaticTransferBuffer<8> buf;
- uavcan::BitStream bs(buf);
- ASSERT_EQ(1, bs.write(data, 8));
- ASSERT_EQ("10101101", bs.toString());
- }
- {
- const uint8_t data[] = {0xad, 0xbe};
- uavcan::StaticTransferBuffer<8> buf;
- uavcan::BitStream bs(buf);
- ASSERT_EQ(1, bs.write(data, 16));
- ASSERT_EQ("10101101 10111110", bs.toString());
- }
- {
- const uint8_t data[] = {0xad, 0xbe, 0xfc};
- uavcan::StaticTransferBuffer<8> buf;
- uavcan::BitStream bs(buf);
- ASSERT_EQ(1, bs.write(data, 20));
- ASSERT_EQ("10101101 10111110 11110000", bs.toString());
- }
- }
- TEST(BitStream, BitOrderSimple)
- {
-
- uavcan::StaticTransferBuffer<32> buf;
- {
- const uint8_t data[] = {0xad, 0xbe};
- uavcan::BitStream bs(buf);
- ASSERT_EQ(1, bs.write(data, 12));
- ASSERT_EQ("10101101 10110000", bs.toString());
- }
- {
- uavcan::BitStream bs(buf);
- ASSERT_EQ("10101101 10110000", bs.toString());
- uint8_t data[] = {0xFF, 0xFF};
- ASSERT_EQ(1, bs.read(data, 12));
- ASSERT_EQ(0xad, data[0]);
- ASSERT_EQ(0xb0, data[1]);
- }
- }
- TEST(BitStream, BitOrderComplex)
- {
- static const std::string REFERENCE =
- "10101101 10111111 11101111 01010110 11011111 01000100 10001101 00010101 10011110 00100110 10101111 00110111 10111100 00000100";
- uavcan::StaticTransferBuffer<32> buf;
- {
- const uint8_t data1[] = {0xad, 0xbe};
- const uint8_t data2[] = {0xfc};
- const uint8_t data3[] = {0xde, 0xad, 0xbe, 0xef};
- const uint8_t data4[] = {0x12, 0x34, 0x56, 0x78,
- 0x9a, 0xbc, 0xde, 0xf0};
- uavcan::BitStream bs(buf);
- ASSERT_EQ(1, bs.write(data1, 11));
- std::cout << bs.toString() << std::endl;
- ASSERT_EQ(1, bs.write(data2, 6));
- std::cout << bs.toString() << std::endl;
- ASSERT_EQ(1, bs.write(data3, 25));
- std::cout << bs.toString() << std::endl;
- ASSERT_EQ(1, bs.write(data4, 64));
- std::cout << bs.toString() << std::endl;
- ASSERT_EQ(1, bs.write(data4, 4));
- std::cout << bs.toString() << std::endl;
- std::cout << "Reference:\n" << REFERENCE << std::endl;
- ASSERT_EQ(REFERENCE, bs.toString());
- }
- {
- uint8_t data[8];
- std::fill(data, data + sizeof(data), 0xA5);
- uavcan::BitStream bs(buf);
- ASSERT_EQ(REFERENCE, bs.toString());
- ASSERT_EQ(1, bs.read(data, 11));
- ASSERT_EQ(0xad, data[0]);
- ASSERT_EQ(0xa0, data[1]);
- ASSERT_EQ(1, bs.read(data, 6));
- ASSERT_EQ(0xfc, data[0]);
- ASSERT_EQ(1, bs.read(data, 25));
- ASSERT_EQ(0xde, data[0]);
- ASSERT_EQ(0xad, data[1]);
- ASSERT_EQ(0xbe, data[2]);
- ASSERT_EQ(0x80, data[3]);
- ASSERT_EQ(1, bs.read(data, 64));
- ASSERT_EQ(0x12, data[0]);
- ASSERT_EQ(0x34, data[1]);
- ASSERT_EQ(0x56, data[2]);
- ASSERT_EQ(0x78, data[3]);
- ASSERT_EQ(0x9a, data[4]);
- ASSERT_EQ(0xbc, data[5]);
- ASSERT_EQ(0xde, data[6]);
- ASSERT_EQ(0xf0, data[7]);
- }
- }
- TEST(BitStream, BitByBit)
- {
- static const int NUM_BYTES = 1024;
- uavcan::StaticTransferBuffer<NUM_BYTES> buf;
- uavcan::BitStream bs_wr(buf);
- std::string binary_string;
- unsigned counter = 0;
- for (int byte = 0; byte < NUM_BYTES; byte++)
- {
- for (int bit = 0; bit < 8; bit++, counter++)
- {
- const bool value = counter % 3 == 0;
- binary_string.push_back(value ? '1' : '0');
- const uint8_t data[] = { uint8_t(value << 7) };
- ASSERT_EQ(1, bs_wr.write(data, 1));
- }
- binary_string.push_back(' ');
- }
- binary_string.erase(binary_string.length() - 1, 1);
-
- const uint8_t dummy_data_wr[] = { 0xFF };
- ASSERT_EQ(0, bs_wr.write(dummy_data_wr, 1));
-
- ASSERT_EQ(binary_string, bs_wr.toString());
-
- uavcan::BitStream bs_rd(buf);
- counter = 0;
- for (int byte = 0; byte < NUM_BYTES; byte++)
- {
- for (int bit = 0; bit < 8; bit++, counter++)
- {
- const bool value = counter % 3 == 0;
- uint8_t data[1];
- ASSERT_EQ(1, bs_rd.read(data, 1));
- if (value)
- {
- ASSERT_EQ(0x80, data[0]);
- }
- else
- {
- ASSERT_EQ(0, data[0]);
- }
- }
- }
-
- uint8_t dummy_data_rd[] = { 0xFF };
- ASSERT_EQ(0, bs_wr.read(dummy_data_rd, 1));
- ASSERT_EQ(0xFF, dummy_data_rd[0]);
- }
|