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
main()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 }
188