scalar_codec.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
3  */
4 
5 #include <gtest/gtest.h>
6 #include <limits>
9 
10 
11 TEST(ScalarCodec, Basic)
12 {
14  uavcan::BitStream bs_wr(buf);
15  uavcan::ScalarCodec sc_wr(bs_wr);
16 
17  {
18  uint64_t u64 = 0;
19  ASSERT_EQ(0, sc_wr.decode<64>(u64)); // Out of buffer space
20  }
21 
22  /*
23  * Encoding some variables
24  */
25  ASSERT_EQ(1, sc_wr.encode<12>(uint16_t(0xbeda))); // --> 0xeda
26  ASSERT_EQ(1, sc_wr.encode<1>(uint8_t(1)));
27  ASSERT_EQ(1, sc_wr.encode<1>(uint16_t(0)));
28  ASSERT_EQ(1, sc_wr.encode<4>(uint8_t(8)));
29  ASSERT_EQ(1, sc_wr.encode<32>(uint32_t(0xdeadbeef)));
30  ASSERT_EQ(1, sc_wr.encode<3>(int8_t(-1)));
31  ASSERT_EQ(1, sc_wr.encode<4>(int8_t(-6)));
32  ASSERT_EQ(1, sc_wr.encode<20>(int32_t(-123456)));
33  ASSERT_EQ(1, sc_wr.encode<64>(std::numeric_limits<int64_t>::min()));
34  ASSERT_EQ(1, sc_wr.encode<64>(std::numeric_limits<int64_t>::max()));
35  ASSERT_EQ(1, sc_wr.encode<15>(int16_t(-1)));
36  ASSERT_EQ(1, sc_wr.encode<2>(int16_t(-1)));
37  ASSERT_EQ(1, sc_wr.encode<16>(std::numeric_limits<int16_t>::min()));
38  ASSERT_EQ(1, sc_wr.encode<64>(std::numeric_limits<uint64_t>::max())); // Total 302 bit (38 bytes)
39 
40  ASSERT_EQ(0, sc_wr.encode<64>(std::numeric_limits<uint64_t>::min())); // Out of buffer space
41 
42  /*
43  * Decoding back
44  */
45  uavcan::BitStream bs_rd(buf);
46  uavcan::ScalarCodec sc_rd(bs_rd);
47 
48  uint8_t u8 = 0;
49  int8_t i8 = 0;
50  uint16_t u16 = 0;
51  int16_t i16 = 0;
52  uint32_t u32 = 0;
53  int32_t i32 = 0;
54  uint64_t u64 = 0;
55  int64_t i64 = 0;
56 
57 #define CHECK(bitlen, variable, expected_value) \
58  do { \
59  ASSERT_EQ(1, sc_rd.decode<bitlen>(variable)); \
60  ASSERT_EQ(expected_value, variable); \
61  } while (0)
62 
63  CHECK(12, u16, 0xeda);
64  CHECK(1, u8, 1);
65  CHECK(1, u16, 0);
66  CHECK(4, u8, 8);
67  CHECK(32, u32, 0xdeadbeef);
68  CHECK(3, i8, -1);
69  CHECK(4, i8, -6);
70  CHECK(20, i32, -123456);
73  CHECK(15, i16, -1);
74  CHECK(2, i8, -1);
77 
78 #undef CHECK
79 
80  ASSERT_EQ(0, sc_rd.decode<64>(u64)); // Out of buffer space
81 }
82 
83 TEST(ScalarCodec, RepresentationCorrectness)
84 {
86  uavcan::BitStream bs_wr(buf);
87  uavcan::ScalarCodec sc_wr(bs_wr);
88 
89  ASSERT_EQ(1, sc_wr.encode<12>(uint16_t(0xbeda))); // --> 0xeda
90  ASSERT_EQ(1, sc_wr.encode<3>(int8_t(-1)));
91  ASSERT_EQ(1, sc_wr.encode<4>(int8_t(-5)));
92  ASSERT_EQ(1, sc_wr.encode<2>(int16_t(-1)));
93  ASSERT_EQ(1, sc_wr.encode<4>(uint8_t(0x88))); // --> 8
94 
95  // This representation was carefully crafted and triple checked:
96  static const std::string REFERENCE = "11011010 11101111 01111100 00000000";
97  ASSERT_EQ(REFERENCE, bs_wr.toString());
98 }
uavcan::BitStream
Definition: bit_stream.hpp:31
uavcan::uint64_t
std::uint64_t uint64_t
Definition: std.hpp:27
uavcan::uint32_t
std::uint32_t uint32_t
Definition: std.hpp:26
uavcan::ScalarCodec::decode
int decode(T &value)
Definition: scalar_codec.hpp:114
TEST
TEST(ScalarCodec, Basic)
Definition: scalar_codec.cpp:11
uavcan::int64_t
std::int64_t int64_t
Definition: std.hpp:32
uavcan::uint16_t
std::uint16_t uint16_t
Definition: std.hpp:25
uavcan::int16_t
std::int16_t int16_t
Definition: std.hpp:30
uavcan::int32_t
std::int32_t int32_t
Definition: std.hpp:31
CHECK
#define CHECK(bitlen, variable, expected_value)
uavcan::uint8_t
std::uint8_t uint8_t
Definition: std.hpp:24
uavcan::max
const UAVCAN_EXPORT T & max(const T &a, const T &b)
Definition: templates.hpp:291
scalar_codec.hpp
uavcan::StaticTransferBuffer
Definition: transfer_buffer.hpp:50
uavcan::min
const UAVCAN_EXPORT T & min(const T &a, const T &b)
Definition: templates.hpp:281
uavcan::int8_t
std::int8_t int8_t
Definition: std.hpp:29
uavcan::ScalarCodec::encode
int encode(const T value)
Definition: scalar_codec.hpp:99
transfer_buffer.hpp
uavcan::ScalarCodec
Definition: scalar_codec.hpp:20


uavcan_communicator
Author(s):
autogenerated on Fri Dec 13 2024 03:10:03