libs
libuavcan
libuavcan
test
marshal
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>
7
#include <
uavcan/marshal/scalar_codec.hpp
>
8
#include <
uavcan/transport/transfer_buffer.hpp
>
9
10
11
TEST
(ScalarCodec, Basic)
12
{
13
uavcan::StaticTransferBuffer<38>
buf;
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);
71
CHECK
(64, i64,
std::numeric_limits<int64_t>::min
());
72
CHECK
(64, i64,
std::numeric_limits<int64_t>::max
());
73
CHECK
(15, i16, -1);
74
CHECK
(2, i8, -1);
75
CHECK
(16, i16,
std::numeric_limits<int16_t>::min
());
76
CHECK
(64, u64,
std::numeric_limits<uint64_t>::max
());
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
{
85
uavcan::StaticTransferBuffer<4>
buf;
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