]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/spirit/test/x3/uint1.cpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / spirit / test / x3 / uint1.cpp
1 /*=============================================================================
2 Copyright (c) 2001-2015 Joel de Guzman
3 Copyright (c) 2001-2011 Hartmut Kaiser
4 Copyright (c) 2011 Bryce Lelbach
5
6 Distributed under the Boost Software License, Version 1.0. (See accompanying
7 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
8 =============================================================================*/
9 #include "uint.hpp"
10 #include <boost/spirit/home/x3.hpp>
11
12 int
13 main()
14 {
15 using spirit_test::test;
16 using spirit_test::test_attr;
17 ///////////////////////////////////////////////////////////////////////////
18 // unsigned tests
19 ///////////////////////////////////////////////////////////////////////////
20 {
21 using boost::spirit::x3::uint_;
22 unsigned u;
23
24 BOOST_TEST(test("123456", uint_));
25 BOOST_TEST(test_attr("123456", uint_, u));
26 BOOST_TEST(u == 123456);
27
28 BOOST_TEST(test(max_unsigned, uint_));
29 BOOST_TEST(test_attr(max_unsigned, uint_, u));
30 BOOST_TEST(u == UINT_MAX);
31
32 BOOST_TEST(!test(unsigned_overflow, uint_));
33 BOOST_TEST(!test_attr(unsigned_overflow, uint_, u));
34 }
35
36 ///////////////////////////////////////////////////////////////////////////
37 // binary tests
38 ///////////////////////////////////////////////////////////////////////////
39 {
40 using boost::spirit::x3::bin;
41 unsigned u;
42
43 BOOST_TEST(test("11111110", bin));
44 BOOST_TEST(test_attr("11111110", bin, u));
45 BOOST_TEST(u == 0xFE);
46
47 BOOST_TEST(test(max_binary, bin));
48 BOOST_TEST(test_attr(max_binary, bin, u));
49 BOOST_TEST(u == UINT_MAX);
50
51 BOOST_TEST(!test(binary_overflow, bin));
52 BOOST_TEST(!test_attr(binary_overflow, bin, u));
53 }
54
55 ///////////////////////////////////////////////////////////////////////////
56 // octal tests
57 ///////////////////////////////////////////////////////////////////////////
58 {
59 using boost::spirit::x3::oct;
60 unsigned u;
61
62 BOOST_TEST(test("12545674515", oct));
63 BOOST_TEST(test_attr("12545674515", oct, u));
64 BOOST_TEST(u == 012545674515);
65
66 BOOST_TEST(test(max_octal, oct));
67 BOOST_TEST(test_attr(max_octal, oct, u));
68 BOOST_TEST(u == UINT_MAX);
69
70 BOOST_TEST(!test(octal_overflow, oct));
71 BOOST_TEST(!test_attr(octal_overflow, oct, u));
72 }
73
74 ///////////////////////////////////////////////////////////////////////////
75 // hex tests
76 ///////////////////////////////////////////////////////////////////////////
77 {
78 using boost::spirit::x3::hex;
79 unsigned u;
80
81 BOOST_TEST(test("95BC8DF", hex));
82 BOOST_TEST(test_attr("95BC8DF", hex, u));
83 BOOST_TEST(u == 0x95BC8DF);
84
85 BOOST_TEST(test("abcdef12", hex));
86 BOOST_TEST(test_attr("abcdef12", hex, u));
87 BOOST_TEST(u == 0xabcdef12);
88
89 BOOST_TEST(test(max_hex, hex));
90 BOOST_TEST(test_attr(max_hex, hex, u));
91 BOOST_TEST(u == UINT_MAX);
92
93 BOOST_TEST(!test(hex_overflow, hex));
94 BOOST_TEST(!test_attr(hex_overflow, hex, u));
95 }
96
97 ///////////////////////////////////////////////////////////////////////////
98 // limited fieldwidth
99 ///////////////////////////////////////////////////////////////////////////
100 {
101 unsigned u;
102 using boost::spirit::x3::uint_parser;
103
104 uint_parser<unsigned, 10, 1, 3> uint3;
105 BOOST_TEST(test("123456", uint3, false));
106 BOOST_TEST(test_attr("123456", uint3, u, false));
107 BOOST_TEST(u == 123);
108
109 uint_parser<unsigned, 10, 2, 4> uint4;
110 BOOST_TEST(test("123456", uint4, false));
111 BOOST_TEST(test_attr("123456", uint4, u, false));
112 BOOST_TEST(u == 1234);
113
114 char const * first = "0000000";
115 char const * last = first + std::strlen(first);
116 uint_parser<unsigned, 10, 4, 4> uint_exact4;
117 BOOST_TEST(boost::spirit::x3::parse(first, last, uint_exact4, u)
118 && first != last && (last-first == 3) && u == 0);
119
120 first = "0001400";
121 last = first + std::strlen(first);
122 BOOST_TEST(boost::spirit::x3::parse(first, last, uint_exact4, u)
123 && first != last && (last-first == 3) && u == 1);
124
125 BOOST_TEST(!test("1", uint4));
126 BOOST_TEST(!test_attr("1", uint4, u));
127 BOOST_TEST(test_attr("014567", uint4, u, false) && u == 145);
128 }
129
130 ///////////////////////////////////////////////////////////////////////////
131 // action tests
132 ///////////////////////////////////////////////////////////////////////////
133 {
134 using boost::spirit::x3::_attr;
135 using boost::spirit::x3::uint_;
136 using boost::spirit::x3::ascii::space;
137 int n;
138
139 auto f = [&](auto& ctx){ n = _attr(ctx); };
140
141 BOOST_TEST(test("123", uint_[f]));
142 BOOST_TEST(n == 123);
143 BOOST_TEST(test(" 456", uint_[f], space));
144 BOOST_TEST(n == 456);
145 }
146
147 ///////////////////////////////////////////////////////////////////////////
148 // Check overflow is parse error
149 ///////////////////////////////////////////////////////////////////////////
150 {
151 boost::spirit::x3::uint_parser<boost::uint8_t> uint8_;
152 boost::uint8_t u8;
153
154 BOOST_TEST(!test_attr("999", uint8_, u8));
155 BOOST_TEST(!test_attr("256", uint8_, u8));
156 BOOST_TEST(test_attr("255", uint8_, u8));
157
158 boost::spirit::x3::uint_parser<boost::uint16_t> uint16_;
159 boost::uint16_t u16;
160
161 BOOST_TEST(!test_attr("99999", uint16_, u16));
162 BOOST_TEST(!test_attr("65536", uint16_, u16));
163 BOOST_TEST(test_attr("65535", uint16_, u16));
164
165 boost::spirit::x3::uint_parser<boost::uint32_t> uint32_;
166 boost::uint32_t u32;
167
168 BOOST_TEST(!test_attr("9999999999", uint32_, u32));
169 BOOST_TEST(!test_attr("4294967296", uint32_, u32));
170 BOOST_TEST(test_attr("4294967295", uint32_, u32));
171 }
172
173 ///////////////////////////////////////////////////////////////////////////
174 // custom uint tests
175 ///////////////////////////////////////////////////////////////////////////
176 {
177 using boost::spirit::x3::uint_;
178 using boost::spirit::x3::uint_parser;
179 custom_uint u;
180
181 BOOST_TEST(test_attr("123456", uint_, u));
182 uint_parser<custom_uint, 10, 1, 2> uint2;
183 BOOST_TEST(test_attr("12", uint2, u));
184 }
185
186 return boost::report_errors();
187 }