JayBeams  0.1
Another project to have fun coding.
ut_price_levels.cpp
Go to the documentation of this file.
2 
3 #include <boost/test/unit_test.hpp>
4 
5 /**
6  * Helper functions to test jb::itch5::price_levels()
7  */
8 namespace {
9 template <typename price_field_t>
10 void check_price_levels() {
11  auto d = price_field_t::denom;
12  price_field_t p0_9995 = price_field_t(int(0.9995 * d));
13  price_field_t p0_9999 = price_field_t(int(0.9999 * d));
14  price_field_t p1_00 = price_field_t(int(1.00 * d));
15  price_field_t p10_00 = price_field_t(int(10.00 * d));
16  price_field_t p10_01 = price_field_t(int(10.01 * d));
17  price_field_t p11_01 = price_field_t(int(11.01 * d));
18 
19  BOOST_CHECK_EQUAL(jb::itch5::price_levels(p1_00, p1_00), 0);
20  BOOST_CHECK_EQUAL(jb::itch5::price_levels(p10_00, p10_01), 1);
21  BOOST_CHECK_EQUAL(jb::itch5::price_levels(p10_01, p11_01), 100);
22  BOOST_CHECK_EQUAL(jb::itch5::price_levels(p0_9995, p1_00), 5);
23  BOOST_CHECK_EQUAL(jb::itch5::price_levels(p0_9995, p0_9999), 4);
24  BOOST_CHECK_EQUAL(jb::itch5::price_levels(p0_9995, p11_01), 1006);
25 
26  BOOST_CHECK_THROW(jb::itch5::price_levels(p10_01, p10_00), std::range_error);
27 }
28 
29 template <typename price_field_t>
30 void check_level_to_price() {
31  auto d = price_field_t::denom;
32  price_field_t p0_5000 = price_field_t(int(0.5000 * d));
33  price_field_t p1_00 = price_field_t(int(1.00 * d));
34  price_field_t p10_00 = price_field_t(int(10.00 * d));
35 
36  BOOST_CHECK_EQUAL(
37  jb::itch5::level_to_price<price_field_t>(int(0.5000 * d)), p0_5000);
38  BOOST_CHECK_EQUAL(
39  jb::itch5::level_to_price<price_field_t>(int(1.00 * d)), p1_00);
40  BOOST_CHECK_EQUAL(
41  jb::itch5::level_to_price<price_field_t>(int(1.00 * d + 9 * d / 100)),
42  p10_00);
43 
44  BOOST_CHECK_THROW(
45  jb::itch5::level_to_price<price_field_t>(int(-1.00 * d)),
46  std::range_error);
47  price_field_t const max_price =
48  jb::itch5::max_price_field_value<price_field_t>();
49  std::size_t const max_level =
50  jb::itch5::price_levels(price_field_t(0), max_price);
51  BOOST_CHECK_THROW(
52  jb::itch5::level_to_price<price_field_t>(max_level + 1),
53  std::range_error);
54 }
55 
56 } // anonymous namespace
57 
58 /**
59  * Verify that jb::itch5::price_levels() works correctly for price4_t
60  */
61 BOOST_AUTO_TEST_CASE(price_levels_4) {
62  check_price_levels<jb::itch5::price4_t>();
63 }
64 
65 /**
66  * Verify that jb::itch5::price_levels() works correctly for price8_t
67  */
68 BOOST_AUTO_TEST_CASE(price_levels_8) {
69  check_price_levels<jb::itch5::price8_t>();
70 }
71 
72 /**
73  * Verify that jb::itch5::level_to_price() works correctly for price4_t
74  */
75 BOOST_AUTO_TEST_CASE(level_to_price_4) {
76  check_level_to_price<jb::itch5::price4_t>();
77 }
78 
79 /**
80  * Verify that jb::itch5::level_to_price() works correctly for price8_t
81  */
82 BOOST_AUTO_TEST_CASE(level_to_price_8) {
83  check_level_to_price<jb::itch5::price8_t>();
84 }
BOOST_AUTO_TEST_CASE(price_levels_4)
Verify that jb::itch5::price_levels() works correctly for price4_t.
std::size_t price_levels(price_field_t lo, price_field_t hi)
Compute the number of price levels between two prices.