libuav original

Dependents:   UAVCAN UAVCAN_Subscriber

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers integer_spec.cpp Source File

integer_spec.cpp

00001 /*
00002  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
00003  */
00004 
00005 #include <gtest/gtest.h>
00006 #include <uavcan/marshal/types.hpp>
00007 #include <uavcan/transport/transfer_buffer.hpp>
00008 
00009 
00010 TEST(IntegerSpec, Limits)
00011 {
00012     using uavcan::IntegerSpec;
00013     using uavcan::SignednessSigned;
00014     using uavcan::SignednessUnsigned;
00015     using uavcan::CastModeSaturate;
00016     using uavcan::CastModeTruncate;
00017 
00018     typedef IntegerSpec<8,  SignednessUnsigned, CastModeSaturate> UInt8;
00019     typedef IntegerSpec<4,    SignednessSigned, CastModeTruncate> SInt4;
00020     typedef IntegerSpec<32, SignednessUnsigned, CastModeTruncate> UInt32;
00021     typedef IntegerSpec<40, SignednessUnsigned, CastModeSaturate> UInt40;
00022     typedef IntegerSpec<64, SignednessUnsigned, CastModeTruncate> UInt64;
00023     typedef IntegerSpec<64,   SignednessSigned, CastModeSaturate> SInt64;
00024     typedef IntegerSpec<63, SignednessUnsigned, CastModeSaturate> UInt63;
00025 
00026     ASSERT_EQ(255, UInt8::max());
00027     ASSERT_EQ(0, UInt8::min());
00028 
00029     ASSERT_EQ(7, SInt4::max());
00030     ASSERT_EQ(-8, SInt4::min());
00031 
00032     ASSERT_EQ(0xFFFFFFFF, UInt32::max());
00033     ASSERT_EQ(0, UInt32::min());
00034 
00035     ASSERT_EQ(0xFFFFFFFFFF, UInt40::max());
00036     ASSERT_EQ(0, UInt40::min());
00037 
00038     ASSERT_EQ(0xFFFFFFFFFFFFFFFF, UInt64::max());
00039     ASSERT_EQ(0, UInt64::min());
00040 
00041     ASSERT_EQ(0x7FFFFFFFFFFFFFFF, SInt64::max());
00042     ASSERT_EQ(-0x8000000000000000, SInt64::min());
00043 
00044     ASSERT_EQ(0x7FFFFFFFFFFFFFFF, UInt63::max());
00045     ASSERT_EQ(0, UInt63::min());
00046 
00047     ASSERT_EQ(SInt64::max(), UInt63::max());
00048 }
00049 
00050 
00051 TEST(IntegerSpec, Basic)
00052 {
00053     using uavcan::IntegerSpec;
00054     using uavcan::SignednessSigned;
00055     using uavcan::SignednessUnsigned;
00056     using uavcan::CastModeSaturate;
00057     using uavcan::CastModeTruncate;
00058     using uavcan::StorageType;
00059 
00060     uavcan::StaticTransferBuffer<100> buf;
00061     uavcan::BitStream bs_wr(buf);
00062     uavcan::ScalarCodec sc_wr(bs_wr);
00063 
00064     typedef IntegerSpec<8,  SignednessUnsigned, CastModeSaturate> UInt8S;
00065     typedef IntegerSpec<4,    SignednessSigned, CastModeTruncate> SInt4T;
00066     typedef IntegerSpec<32, SignednessUnsigned, CastModeTruncate> UInt32T;
00067     typedef IntegerSpec<40, SignednessUnsigned, CastModeSaturate> UInt40S;
00068     typedef IntegerSpec<64, SignednessUnsigned, CastModeTruncate> UInt64T;
00069     typedef IntegerSpec<58,   SignednessSigned, CastModeSaturate> SInt58S;
00070     typedef IntegerSpec<63, SignednessUnsigned, CastModeSaturate> UInt63S;
00071     typedef IntegerSpec<10,   SignednessSigned, CastModeSaturate> SInt10S;
00072     typedef IntegerSpec<1,  SignednessUnsigned, CastModeSaturate> UInt1S;
00073 
00074     ASSERT_EQ(1, UInt8S::encode(UInt8S::StorageType(123), sc_wr, uavcan::TailArrayOptDisabled));
00075     ASSERT_EQ(1, SInt4T::encode(SInt4T::StorageType(-0x44), sc_wr, uavcan::TailArrayOptDisabled));
00076     ASSERT_EQ(1, UInt32T::encode(UInt32T::StorageType(0xFFFFFFFF), sc_wr, uavcan::TailArrayOptDisabled));
00077     ASSERT_EQ(1, UInt40S::encode(UInt40S::StorageType(0xFFFFFFFFFFFFFFFF), sc_wr, uavcan::TailArrayOptDisabled));
00078     ASSERT_EQ(1, UInt64T::encode(UInt64T::StorageType(0xFFFFFFFFFFFFFFFF), sc_wr, uavcan::TailArrayOptDisabled));
00079     ASSERT_EQ(1, SInt58S::encode(SInt58S::StorageType(0xFFFFFFFFFFFFFFF), sc_wr, uavcan::TailArrayOptDisabled));
00080     ASSERT_EQ(1, UInt63S::encode(UInt63S::StorageType(0xFFFFFFFFFFFFFFFF), sc_wr, uavcan::TailArrayOptDisabled));
00081     ASSERT_EQ(1, SInt10S::encode(SInt10S::StorageType(-30000), sc_wr, uavcan::TailArrayOptDisabled));
00082     ASSERT_EQ(1, UInt1S::encode(UInt1S::StorageType(42), sc_wr, uavcan::TailArrayOptDisabled));
00083 
00084     std::cout << bs_wr.toString() << std::endl;
00085 
00086     uavcan::BitStream bs_rd(buf);
00087     uavcan::ScalarCodec sc_rd(bs_rd);
00088 
00089 #define CHECK(IntType, expected_value) \
00090     do { \
00091         StorageType<IntType>::Type var = StorageType<IntType>::Type(); \
00092         ASSERT_EQ(1, IntType::decode(var, sc_rd, uavcan::TailArrayOptDisabled)); \
00093         ASSERT_EQ(expected_value, var); \
00094     } while (0)
00095 
00096     CHECK(UInt8S,  123);
00097     CHECK(SInt4T,  -4);
00098     CHECK(UInt32T, 0xFFFFFFFF);
00099     CHECK(UInt40S, 0xFFFFFFFFFF);
00100     CHECK(UInt64T, 0xFFFFFFFFFFFFFFFF);
00101     CHECK(SInt58S, 0x1FFFFFFFFFFFFFF);
00102     CHECK(UInt63S, 0x7FFFFFFFFFFFFFFF);
00103     CHECK(SInt10S, -512);
00104     CHECK(UInt1S,  1);
00105 
00106 #undef CHECK
00107 
00108     StorageType<UInt1S>::Type var;
00109     ASSERT_EQ(0, UInt1S::decode(var, sc_rd, uavcan::TailArrayOptDisabled));
00110 }