libuav original
Dependents: UAVCAN UAVCAN_Subscriber
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 }
Generated on Tue Jul 12 2022 17:17:32 by 1.7.2