JayBeams  0.1
Another project to have fun coding.
ut_base_encoders.cpp
Go to the documentation of this file.
3 
4 #include <boost/test/unit_test.hpp>
5 
6 /**
7  * @test Verify that base encoders work as expected.
8  */
9 BOOST_AUTO_TEST_CASE(encode_uint8) {
10  using jb::itch5::encoder;
11  using jb::itch5::decoder;
12  // The actual buffer size is 32 bytes, but we treat them as 16 byte
13  // buffers. This is because some of the tests verify we (a) do
14  // detect attempts to read past the end of the array, and (b) when
15  // checking is disabled, we do allow reading past the 'end'.
16  // Using a larger buffer allows such tests without involving
17  // undefined behavior.
18  char buffer[32] = {0};
19 
20  encoder<true, std::uint8_t>::w(16, buffer, 1, std::uint8_t(20));
21  auto actual = decoder<true, std::uint8_t>::r(16, buffer, 1);
22  BOOST_CHECK_EQUAL(actual, 20);
23  BOOST_CHECK_EQUAL(buffer[1], 20);
24 
25  encoder<true, std::uint8_t>::w(16, buffer, 3, std::uint8_t(25));
26  actual = decoder<false, std::uint8_t>::r(16, buffer, 3);
27  BOOST_CHECK_EQUAL(actual, 25);
28  BOOST_CHECK_EQUAL(buffer[3], 25);
29 
30  BOOST_CHECK_NO_THROW((encoder<true, std::uint8_t>::w(16, buffer, 0, 0)));
31  BOOST_CHECK_NO_THROW((encoder<true, std::uint8_t>::w(16, buffer, 8, 0)));
32  BOOST_CHECK_NO_THROW((encoder<true, std::uint8_t>::w(16, buffer, 15, 0)));
33  BOOST_CHECK_THROW(
34  (encoder<true, std::uint8_t>::w(16, buffer, 16, 0)), std::runtime_error);
35  BOOST_CHECK_NO_THROW((encoder<false, std::uint8_t>::w(16, buffer, 16, 0)));
36 }
37 
38 /**
39  * @test Verify that base encoders work as expected.
40  */
41 BOOST_AUTO_TEST_CASE(encode_uint16) {
42  using jb::itch5::encoder;
43  using jb::itch5::decoder;
44  char buffer[32];
45 
46  std::uint16_t expected = 0xAA10;
47  encoder<true, std::uint16_t>::w(16, buffer, 0, expected);
48  auto actual = decoder<true, std::uint16_t>::r(16, buffer, 0);
49  BOOST_CHECK_EQUAL(actual, expected);
50  BOOST_CHECK_EQUAL(std::uint8_t(buffer[0]), 0xAA);
51  BOOST_CHECK_EQUAL(std::uint8_t(buffer[1]), 0x10);
52 
53  encoder<false, std::uint16_t>::w(16, buffer, 0, expected);
54  actual = decoder<false, std::uint16_t>::r(16, buffer, 0);
55  BOOST_CHECK_EQUAL(actual, expected);
56  BOOST_CHECK_EQUAL(std::uint8_t(buffer[0]), 0xAA);
57  BOOST_CHECK_EQUAL(std::uint8_t(buffer[1]), 0x10);
58 
59  BOOST_CHECK_NO_THROW((encoder<true, std::uint16_t>::w(16, buffer, 0, 0)));
60  BOOST_CHECK_NO_THROW((encoder<true, std::uint16_t>::w(16, buffer, 8, 0)));
61  BOOST_CHECK_NO_THROW((encoder<true, std::uint16_t>::w(16, buffer, 14, 0)));
62  BOOST_CHECK_THROW(
63  (encoder<true, std::uint16_t>::w(16, buffer, 15, 0)), std::runtime_error);
64  BOOST_CHECK_NO_THROW((encoder<false, std::uint16_t>::w(16, buffer, 15, 0)));
65 }
66 
67 /**
68  * @test Verify that base encoders work as expected.
69  */
70 BOOST_AUTO_TEST_CASE(encode_uint32) {
71  using jb::itch5::encoder;
72  using jb::itch5::decoder;
73  char buffer[32];
74  std::uint32_t expected = 0x10203040;
75 
76  unsigned char const contents[] = u8"\x10\x20\x30\x40";
77  std::size_t const len = sizeof(contents) / sizeof(contents[0]) - 1;
78 
79  encoder<true, std::uint32_t>::w(16, buffer, 0, expected);
80  auto actual = decoder<true, std::uint32_t>::r(16, buffer, 0);
81  BOOST_CHECK_EQUAL(actual, expected);
82  BOOST_CHECK_EQUAL_COLLECTIONS(buffer, buffer + 4, contents, contents + len);
83 
84  encoder<false, std::uint32_t>::w(16, buffer, 0, expected);
85  actual = decoder<false, std::uint32_t>::r(16, buffer, 0);
86  BOOST_CHECK_EQUAL(actual, expected);
87  BOOST_CHECK_EQUAL_COLLECTIONS(buffer, buffer + 4, contents, contents + len);
88 
89  BOOST_CHECK_NO_THROW((encoder<true, std::uint32_t>::w(16, buffer, 0, 0)));
90  BOOST_CHECK_NO_THROW((encoder<true, std::uint32_t>::w(16, buffer, 8, 0)));
91  BOOST_CHECK_NO_THROW((encoder<true, std::uint32_t>::w(16, buffer, 12, 0)));
92  BOOST_CHECK_THROW(
93  (encoder<true, std::uint32_t>::w(16, buffer, 13, 0)), std::runtime_error);
94  BOOST_CHECK_NO_THROW((encoder<false, std::uint32_t>::w(16, buffer, 13, 0)));
95 }
96 
97 /**
98  * @test Verify that base encoders work as expected.
99  */
100 BOOST_AUTO_TEST_CASE(encode_uint64) {
101  using jb::itch5::encoder;
102  using jb::itch5::decoder;
103  unsigned char buffer[32];
104  std::uint64_t expected = 0xAABBCCDDEEFF0011ULL;
105  encoder<true, std::uint64_t>::w(16, buffer, 0, expected);
106 
107  unsigned char const contents[] = u8"\xAA\xBB\xCC\xDD\xEE\xFF\x00\x11";
108  std::size_t const len = sizeof(contents) / sizeof(contents[0]) - 1;
109 
110  auto actual = decoder<true, std::uint64_t>::r(16, buffer, 0);
111  BOOST_CHECK_EQUAL(actual, expected);
112  BOOST_CHECK_EQUAL_COLLECTIONS(buffer, buffer + 8, contents, contents + len);
113 
114  encoder<false, std::uint64_t>::w(16, buffer, 0, expected);
115  actual = decoder<false, std::uint64_t>::r(16, buffer, 0);
116  BOOST_CHECK_EQUAL(actual, expected);
117  BOOST_CHECK_EQUAL_COLLECTIONS(buffer, buffer + 8, contents, contents + len);
118 
119  BOOST_CHECK_NO_THROW((encoder<true, std::uint64_t>::w(16, buffer, 2, 0)));
120  BOOST_CHECK_NO_THROW((encoder<true, std::uint64_t>::w(16, buffer, 7, 0)));
121  BOOST_CHECK_THROW(
122  (encoder<true, std::uint64_t>::w(16, buffer, 9, 0)), std::runtime_error);
123  BOOST_CHECK_NO_THROW((encoder<false, std::uint64_t>::w(16, buffer, 9, 0)));
124 }
BOOST_AUTO_TEST_CASE(encode_uint8)
TODO(#19) all this code should be replaced with Boost.Endian.
Definition: encoder.hpp:13
Define the interface to decode ITCH-5.0 messages and message fields.
Definition: decoder.hpp:24