]>
git.proxmox.com Git - ceph.git/blob - 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
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 =============================================================================*/
10 #include <boost/spirit/home/x3.hpp>
15 using spirit_test::test
;
16 using spirit_test::test_attr
;
17 ///////////////////////////////////////////////////////////////////////////
19 ///////////////////////////////////////////////////////////////////////////
21 using boost::spirit::x3::uint_
;
24 BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(uint_
);
26 BOOST_TEST(test("123456", uint_
));
27 BOOST_TEST(test_attr("123456", uint_
, u
));
28 BOOST_TEST(u
== 123456);
30 BOOST_TEST(test(max_unsigned
, uint_
));
31 BOOST_TEST(test_attr(max_unsigned
, uint_
, u
));
32 BOOST_TEST(u
== UINT_MAX
);
34 BOOST_TEST(!test(unsigned_overflow
, uint_
));
35 BOOST_TEST(!test_attr(unsigned_overflow
, uint_
, u
));
38 ///////////////////////////////////////////////////////////////////////////
40 ///////////////////////////////////////////////////////////////////////////
42 using boost::spirit::x3::bin
;
45 BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(bin
);
47 BOOST_TEST(test("11111110", bin
));
48 BOOST_TEST(test_attr("11111110", bin
, u
));
49 BOOST_TEST(u
== 0xFE);
51 BOOST_TEST(test(max_binary
, bin
));
52 BOOST_TEST(test_attr(max_binary
, bin
, u
));
53 BOOST_TEST(u
== UINT_MAX
);
55 BOOST_TEST(!test(binary_overflow
, bin
));
56 BOOST_TEST(!test_attr(binary_overflow
, bin
, u
));
59 ///////////////////////////////////////////////////////////////////////////
61 ///////////////////////////////////////////////////////////////////////////
63 using boost::spirit::x3::oct
;
66 BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(oct
);
68 BOOST_TEST(test("12545674515", oct
));
69 BOOST_TEST(test_attr("12545674515", oct
, u
));
70 BOOST_TEST(u
== 012545674515);
72 BOOST_TEST(test(max_octal
, oct
));
73 BOOST_TEST(test_attr(max_octal
, oct
, u
));
74 BOOST_TEST(u
== UINT_MAX
);
76 BOOST_TEST(!test(octal_overflow
, oct
));
77 BOOST_TEST(!test_attr(octal_overflow
, oct
, u
));
80 ///////////////////////////////////////////////////////////////////////////
82 ///////////////////////////////////////////////////////////////////////////
84 using boost::spirit::x3::hex
;
87 BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(hex
);
89 BOOST_TEST(test("95BC8DF", hex
));
90 BOOST_TEST(test_attr("95BC8DF", hex
, u
));
91 BOOST_TEST(u
== 0x95BC8DF);
93 BOOST_TEST(test("abcdef12", hex
));
94 BOOST_TEST(test_attr("abcdef12", hex
, u
));
95 BOOST_TEST(u
== 0xabcdef12);
97 BOOST_TEST(test(max_hex
, hex
));
98 BOOST_TEST(test_attr(max_hex
, hex
, u
));
99 BOOST_TEST(u
== UINT_MAX
);
101 BOOST_TEST(!test(hex_overflow
, hex
));
102 BOOST_TEST(!test_attr(hex_overflow
, hex
, u
));
105 ///////////////////////////////////////////////////////////////////////////
106 // limited fieldwidth
107 ///////////////////////////////////////////////////////////////////////////
110 using boost::spirit::x3::uint_parser
;
112 constexpr uint_parser
<unsigned, 10, 1, 3> uint3
{};
113 BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(uint3
);
114 BOOST_TEST(test("123456", uint3
, false));
115 BOOST_TEST(test_attr("123456", uint3
, u
, false));
116 BOOST_TEST(u
== 123);
118 constexpr uint_parser
<unsigned, 10, 2, 4> uint4
{};
119 BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(uint4
);
120 BOOST_TEST(test("123456", uint4
, false));
121 BOOST_TEST(test_attr("123456", uint4
, u
, false));
122 BOOST_TEST(u
== 1234);
124 char const * first
= "0000000";
125 char const * last
= first
+ std::strlen(first
);
126 constexpr uint_parser
<unsigned, 10, 4, 4> uint_exact4
{};
127 BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(uint_exact4
);
128 BOOST_TEST(boost::spirit::x3::parse(first
, last
, uint_exact4
, u
)
129 && first
!= last
&& (last
-first
== 3) && u
== 0);
132 last
= first
+ std::strlen(first
);
133 BOOST_TEST(boost::spirit::x3::parse(first
, last
, uint_exact4
, u
)
134 && first
!= last
&& (last
-first
== 3) && u
== 1);
136 BOOST_TEST(!test("1", uint4
));
137 BOOST_TEST(!test_attr("1", uint4
, u
));
138 BOOST_TEST(test_attr("014567", uint4
, u
, false) && u
== 145);
141 ///////////////////////////////////////////////////////////////////////////
143 ///////////////////////////////////////////////////////////////////////////
145 using boost::spirit::x3::_attr
;
146 using boost::spirit::x3::uint_
;
147 using boost::spirit::x3::ascii::space
;
150 auto f
= [&](auto& ctx
){ n
= _attr(ctx
); };
152 BOOST_TEST(test("123", uint_
[f
]));
153 BOOST_TEST(n
== 123);
154 BOOST_TEST(test(" 456", uint_
[f
], space
));
155 BOOST_TEST(n
== 456);
158 ///////////////////////////////////////////////////////////////////////////
159 // Check overflow is parse error
160 ///////////////////////////////////////////////////////////////////////////
162 boost::spirit::x3::uint_parser
<boost::uint8_t> uint8_
;
165 BOOST_TEST(!test_attr("999", uint8_
, u8
));
166 BOOST_TEST(!test_attr("256", uint8_
, u8
));
167 BOOST_TEST(test_attr("255", uint8_
, u8
));
169 boost::spirit::x3::uint_parser
<boost::uint16_t> uint16_
;
172 BOOST_TEST(!test_attr("99999", uint16_
, u16
));
173 BOOST_TEST(!test_attr("65536", uint16_
, u16
));
174 BOOST_TEST(test_attr("65535", uint16_
, u16
));
176 boost::spirit::x3::uint_parser
<boost::uint32_t> uint32_
;
179 BOOST_TEST(!test_attr("9999999999", uint32_
, u32
));
180 BOOST_TEST(!test_attr("4294967296", uint32_
, u32
));
181 BOOST_TEST(test_attr("4294967295", uint32_
, u32
));
183 boost::spirit::x3::uint_parser
<boost::int8_t> u_int8_
;
185 BOOST_TEST(!test_attr("999", u_int8_
, u8
));
186 BOOST_TEST(!test_attr("-1", u_int8_
, u8
));
187 BOOST_TEST(!test_attr("128", u_int8_
, u8
));
188 BOOST_TEST(test_attr("127", u_int8_
, u8
));
189 BOOST_TEST(test_attr("0", u_int8_
, u8
));
191 boost::spirit::x3::uint_parser
<boost::int16_t> u_int16_
;
193 BOOST_TEST(!test_attr("99999", u_int16_
, u16
));
194 BOOST_TEST(!test_attr("-1", u_int16_
, u16
));
195 BOOST_TEST(!test_attr("32768", u_int16_
, u16
));
196 BOOST_TEST(test_attr("32767", u_int16_
, u16
));
197 BOOST_TEST(test_attr("0", u_int16_
, u16
));
199 boost::spirit::x3::uint_parser
<boost::int32_t> u_int32_
;
201 BOOST_TEST(!test_attr("9999999999", u_int32_
, u32
));
202 BOOST_TEST(!test_attr("-1", u_int32_
, u32
));
203 BOOST_TEST(!test_attr("2147483648", u_int32_
, u32
));
204 BOOST_TEST(test_attr("2147483647", u_int32_
, u32
));
205 BOOST_TEST(test_attr("0", u_int32_
, u32
));
208 ///////////////////////////////////////////////////////////////////////////
210 ///////////////////////////////////////////////////////////////////////////
212 using boost::spirit::x3::uint_
;
213 using boost::spirit::x3::uint_parser
;
216 BOOST_TEST(test_attr("123456", uint_
, u
));
217 uint_parser
<custom_uint
, 10, 1, 2> uint2
;
218 BOOST_TEST(test_attr("12", uint2
, u
));
221 return boost::report_errors();