integer_spec.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>
8 
9 
10 TEST(IntegerSpec, Limits)
11 {
12  using uavcan::IntegerSpec;
17 
18  typedef IntegerSpec<8, SignednessUnsigned, CastModeSaturate> UInt8;
19  typedef IntegerSpec<4, SignednessSigned, CastModeTruncate> SInt4;
20  typedef IntegerSpec<32, SignednessUnsigned, CastModeTruncate> UInt32;
21  typedef IntegerSpec<40, SignednessUnsigned, CastModeSaturate> UInt40;
22  typedef IntegerSpec<64, SignednessUnsigned, CastModeTruncate> UInt64;
23  typedef IntegerSpec<64, SignednessSigned, CastModeSaturate> SInt64;
24  typedef IntegerSpec<63, SignednessUnsigned, CastModeSaturate> UInt63;
25 
26  ASSERT_EQ(255, UInt8::max());
27  ASSERT_EQ(0, UInt8::min());
28 
29  ASSERT_EQ(7, SInt4::max());
30  ASSERT_EQ(-8, SInt4::min());
31 
32  ASSERT_EQ(0xFFFFFFFF, UInt32::max());
33  ASSERT_EQ(0, UInt32::min());
34 
35  ASSERT_EQ(0xFFFFFFFFFF, UInt40::max());
36  ASSERT_EQ(0, UInt40::min());
37 
38  ASSERT_EQ(0xFFFFFFFFFFFFFFFF, UInt64::max());
39  ASSERT_EQ(0, UInt64::min());
40 
41  ASSERT_EQ(0x7FFFFFFFFFFFFFFF, SInt64::max());
42  ASSERT_EQ(-0x8000000000000000, SInt64::min());
43 
44  ASSERT_EQ(0x7FFFFFFFFFFFFFFF, UInt63::max());
45  ASSERT_EQ(0, UInt63::min());
46 
47  ASSERT_EQ(SInt64::max(), UInt63::max());
48 }
49 
50 
51 TEST(IntegerSpec, Basic)
52 {
53  using uavcan::IntegerSpec;
58  using uavcan::StorageType;
59 
61  uavcan::BitStream bs_wr(buf);
62  uavcan::ScalarCodec sc_wr(bs_wr);
63 
64  typedef IntegerSpec<8, SignednessUnsigned, CastModeSaturate> UInt8S;
65  typedef IntegerSpec<4, SignednessSigned, CastModeTruncate> SInt4T;
66  typedef IntegerSpec<32, SignednessUnsigned, CastModeTruncate> UInt32T;
67  typedef IntegerSpec<40, SignednessUnsigned, CastModeSaturate> UInt40S;
68  typedef IntegerSpec<64, SignednessUnsigned, CastModeTruncate> UInt64T;
69  typedef IntegerSpec<58, SignednessSigned, CastModeSaturate> SInt58S;
70  typedef IntegerSpec<63, SignednessUnsigned, CastModeSaturate> UInt63S;
71  typedef IntegerSpec<10, SignednessSigned, CastModeSaturate> SInt10S;
72  typedef IntegerSpec<1, SignednessUnsigned, CastModeSaturate> UInt1S;
73 
74  ASSERT_EQ(1, UInt8S::encode(UInt8S::StorageType(123), sc_wr, uavcan::TailArrayOptDisabled));
75  ASSERT_EQ(1, SInt4T::encode(SInt4T::StorageType(-0x44), sc_wr, uavcan::TailArrayOptDisabled));
76  ASSERT_EQ(1, UInt32T::encode(UInt32T::StorageType(0xFFFFFFFF), sc_wr, uavcan::TailArrayOptDisabled));
77  ASSERT_EQ(1, UInt40S::encode(UInt40S::StorageType(0xFFFFFFFFFFFFFFFF), sc_wr, uavcan::TailArrayOptDisabled));
78  ASSERT_EQ(1, UInt64T::encode(UInt64T::StorageType(0xFFFFFFFFFFFFFFFF), sc_wr, uavcan::TailArrayOptDisabled));
79  ASSERT_EQ(1, SInt58S::encode(SInt58S::StorageType(0xFFFFFFFFFFFFFFF), sc_wr, uavcan::TailArrayOptDisabled));
80  ASSERT_EQ(1, UInt63S::encode(UInt63S::StorageType(0xFFFFFFFFFFFFFFFF), sc_wr, uavcan::TailArrayOptDisabled));
81  ASSERT_EQ(1, SInt10S::encode(SInt10S::StorageType(-30000), sc_wr, uavcan::TailArrayOptDisabled));
82  ASSERT_EQ(1, UInt1S::encode(UInt1S::StorageType(42), sc_wr, uavcan::TailArrayOptDisabled));
83 
84  std::cout << bs_wr.toString() << std::endl;
85 
86  uavcan::BitStream bs_rd(buf);
87  uavcan::ScalarCodec sc_rd(bs_rd);
88 
89 #define CHECK(IntType, expected_value) \
90  do { \
91  StorageType<IntType>::Type var = StorageType<IntType>::Type(); \
92  ASSERT_EQ(1, IntType::decode(var, sc_rd, uavcan::TailArrayOptDisabled)); \
93  ASSERT_EQ(expected_value, var); \
94  } while (0)
95 
96  CHECK(UInt8S, 123);
97  CHECK(SInt4T, -4);
98  CHECK(UInt32T, 0xFFFFFFFF);
99  CHECK(UInt40S, 0xFFFFFFFFFF);
100  CHECK(UInt64T, 0xFFFFFFFFFFFFFFFF);
101  CHECK(SInt58S, 0x1FFFFFFFFFFFFFF);
102  CHECK(UInt63S, 0x7FFFFFFFFFFFFFFF);
103  CHECK(SInt10S, -512);
104  CHECK(UInt1S, 1);
105 
106 #undef CHECK
107 
108  StorageType<UInt1S>::Type var;
109  ASSERT_EQ(0, UInt1S::decode(var, sc_rd, uavcan::TailArrayOptDisabled));
110 }
types.hpp
uavcan::BitStream
Definition: bit_stream.hpp:31
uavcan::SignednessSigned
@ SignednessSigned
Definition: integer_spec.hpp:17
uavcan::max
const UAVCAN_EXPORT T & max(const T &a, const T &b)
Definition: templates.hpp:291
uavcan::CastModeTruncate
@ CastModeTruncate
Definition: type_util.hpp:17
uavcan::IntegerSpec
Definition: integer_spec.hpp:24
uavcan::SignednessUnsigned
@ SignednessUnsigned
Definition: integer_spec.hpp:17
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::TailArrayOptDisabled
@ TailArrayOptDisabled
Definition: type_util.hpp:22
CHECK
#define CHECK(IntType, expected_value)
TEST
TEST(IntegerSpec, Limits)
Definition: integer_spec.cpp:10
transfer_buffer.hpp
uavcan::StorageType
Definition: type_util.hpp:51
uavcan::ScalarCodec
Definition: scalar_codec.hpp:20
uavcan::CastModeSaturate
@ CastModeSaturate
Definition: type_util.hpp:17


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