1/*=============================================================================
2 Copyright (c) 2001-2011 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
10#include "uint.hpp"
11
12int
13main()
14{
15 using spirit_test::test;
16 using spirit_test::test_attr;
17 ///////////////////////////////////////////////////////////////////////////
18 // unsigned tests
19 ///////////////////////////////////////////////////////////////////////////
20 {
21 using boost::spirit::qi::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::qi::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::qi::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::qi::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::qi::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(s: first);
116 uint_parser<unsigned, 10, 4, 4> uint_exact4;
117 BOOST_TEST(boost::spirit::qi::parse(first, last, uint_exact4, u)
118 && first != last && (last-first == 3) && u == 0);
119
120 first = "0001400";
121 last = first + std::strlen(s: first);
122 BOOST_TEST(boost::spirit::qi::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 uint_parser<boost::uint8_t, 10, 1, 3> uchar_3;
130 unsigned char uc;
131 BOOST_TEST(test_attr("255", uchar_3, uc, true));
132 BOOST_TEST(uc == 255);
133 BOOST_TEST(!test_attr("256", uchar_3, uc, false));
134 BOOST_TEST(!test_attr("257", uchar_3, uc, false));
135 }
136
137 ///////////////////////////////////////////////////////////////////////////
138 // action tests
139 ///////////////////////////////////////////////////////////////////////////
140 {
141 using boost::phoenix::ref;
142 using boost::spirit::qi::_1;
143 using boost::spirit::qi::uint_;
144 using boost::spirit::ascii::space;
145 int n;
146
147 BOOST_TEST(test("123", uint_[ref(n) = _1]));
148 BOOST_TEST(n == 123);
149 BOOST_TEST(test(" 456", uint_[ref(n) = _1], space));
150 BOOST_TEST(n == 456);
151 }
152
153 ///////////////////////////////////////////////////////////////////////////
154 // Check overflow is parse error
155 ///////////////////////////////////////////////////////////////////////////
156 {
157 boost::spirit::qi::uint_parser<boost::uint8_t> uint8_;
158 boost::uint8_t u8;
159
160 BOOST_TEST(!test_attr("999", uint8_, u8));
161 BOOST_TEST(!test_attr("256", uint8_, u8));
162 BOOST_TEST(test_attr("255", uint8_, u8));
163
164 boost::spirit::qi::uint_parser<boost::uint16_t> uint16_;
165 boost::uint16_t u16;
166
167 BOOST_TEST(!test_attr("99999", uint16_, u16));
168 BOOST_TEST(!test_attr("65536", uint16_, u16));
169 BOOST_TEST(test_attr("65535", uint16_, u16));
170
171 boost::spirit::qi::uint_parser<boost::uint32_t> uint32_;
172 boost::uint32_t u32;
173
174 BOOST_TEST(!test_attr("9999999999", uint32_, u32));
175 BOOST_TEST(!test_attr("4294967296", uint32_, u32));
176 BOOST_TEST(test_attr("4294967295", uint32_, u32));
177
178 boost::spirit::qi::uint_parser<boost::int8_t> u_int8_;
179
180 BOOST_TEST(!test_attr("999", u_int8_, u8));
181 BOOST_TEST(!test_attr("-1", u_int8_, u8));
182 BOOST_TEST(!test_attr("128", u_int8_, u8));
183 BOOST_TEST(test_attr("127", u_int8_, u8));
184 BOOST_TEST(test_attr("0", u_int8_, u8));
185
186 boost::spirit::qi::uint_parser<boost::int16_t> u_int16_;
187
188 BOOST_TEST(!test_attr("99999", u_int16_, u16));
189 BOOST_TEST(!test_attr("-1", u_int16_, u16));
190 BOOST_TEST(!test_attr("32768", u_int16_, u16));
191 BOOST_TEST(test_attr("32767", u_int16_, u16));
192 BOOST_TEST(test_attr("0", u_int16_, u16));
193
194 boost::spirit::qi::uint_parser<boost::int32_t> u_int32_;
195
196 BOOST_TEST(!test_attr("9999999999", u_int32_, u32));
197 BOOST_TEST(!test_attr("-1", u_int32_, u32));
198 BOOST_TEST(!test_attr("2147483648", u_int32_, u32));
199 BOOST_TEST(test_attr("2147483647", u_int32_, u32));
200 BOOST_TEST(test_attr("0", u_int32_, u32));
201 }
202
203 ///////////////////////////////////////////////////////////////////////////
204 // custom uint tests
205 ///////////////////////////////////////////////////////////////////////////
206 {
207 using boost::spirit::qi::uint_;
208 using boost::spirit::qi::uint_parser;
209 custom_uint u;
210
211 BOOST_TEST(test_attr("123456", uint_, u));
212 uint_parser<custom_uint, 10, 1, 2> uint2;
213 BOOST_TEST(test_attr("12", uint2, u));
214 }
215
216 return boost::report_errors();
217}
218

source code of boost/libs/spirit/test/qi/uint1.cpp