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 
12 int
main()13 main()
14 {
15     using spirit_test::test;
16     using spirit_test::test_attr;
17     ///////////////////////////////////////////////////////////////////////////
18     //  parameterized unsigned tests
19     ///////////////////////////////////////////////////////////////////////////
20     {
21         using boost::spirit::qi::uint_;
22         unsigned u;
23 
24         BOOST_TEST(test("123456", uint_(123456)));
25         BOOST_TEST(!test("123456", uint_(654321)));
26         BOOST_TEST(test_attr("123456", uint_(123456), u));
27         BOOST_TEST(u == 123456);
28         BOOST_TEST(!test_attr("123456", uint_(654321), u));
29 
30         BOOST_TEST(test(max_unsigned, uint_(UINT_MAX)));
31         BOOST_TEST(test_attr(max_unsigned, uint_(UINT_MAX), u));
32         BOOST_TEST(u == UINT_MAX);
33     }
34 
35     ///////////////////////////////////////////////////////////////////////////
36     //  parameterized binary tests
37     ///////////////////////////////////////////////////////////////////////////
38     {
39         using boost::spirit::qi::bin;
40         unsigned u;
41 
42         BOOST_TEST(test("11111110", bin(0xFE)));
43         BOOST_TEST(!test("11111110", bin(0xEF)));
44         BOOST_TEST(test_attr("11111110", bin(0xFE), u));
45         BOOST_TEST(u == 0xFE);
46         BOOST_TEST(!test_attr("11111110", bin(0xEF), u));
47 
48         BOOST_TEST(test(max_binary, bin(UINT_MAX)));
49         BOOST_TEST(test_attr(max_binary, bin(UINT_MAX), u));
50         BOOST_TEST(u == UINT_MAX);
51     }
52 
53     ///////////////////////////////////////////////////////////////////////////
54     //  parameterized octal tests
55     ///////////////////////////////////////////////////////////////////////////
56     {
57         using boost::spirit::qi::oct;
58         unsigned u;
59 
60         BOOST_TEST(test("12545674515", oct(012545674515)));
61 #if UINT_MAX > 4294967296 // > 32 bits only
62         BOOST_TEST(!test("12545674515", oct(051547654521)));
63 #endif
64         BOOST_TEST(test_attr("12545674515", oct(012545674515), u));
65         BOOST_TEST(u == 012545674515);
66 #if UINT_MAX > 4294967296 // > 32 bits only
67         BOOST_TEST(!test_attr("12545674515", oct(051547654521), u));
68 #endif
69 
70         BOOST_TEST(test(max_octal, oct(UINT_MAX)));
71         BOOST_TEST(test_attr(max_octal, oct(UINT_MAX), u));
72         BOOST_TEST(u == UINT_MAX);
73     }
74 
75     ///////////////////////////////////////////////////////////////////////////
76     //  parameterized hex tests
77     ///////////////////////////////////////////////////////////////////////////
78     {
79         using boost::spirit::qi::hex;
80         unsigned u;
81 
82         BOOST_TEST(test("95BC8DF", hex(0x95BC8DF)));
83         BOOST_TEST(!test("95BC8DF", hex(0xFD8CB59)));
84         BOOST_TEST(test_attr("95BC8DF", hex(0x95BC8DF), u));
85         BOOST_TEST(u == 0x95BC8DF);
86         BOOST_TEST(!test_attr("95BC8DF", hex(0xFD8CB59), u));
87 
88         BOOST_TEST(test("abcdef12", hex(0xabcdef12)));
89         BOOST_TEST(!test("abcdef12", hex(0x12fedcba)));
90         BOOST_TEST(test_attr("abcdef12", hex(0xabcdef12), u));
91         BOOST_TEST(u == 0xabcdef12);
92         BOOST_TEST(!test_attr("abcdef12", hex(0x12fedcba), u));
93 
94         BOOST_TEST(test(max_hex, hex(UINT_MAX)));
95         BOOST_TEST(test_attr(max_hex, hex(UINT_MAX), u));
96         BOOST_TEST(u == UINT_MAX);
97     }
98 
99     ///////////////////////////////////////////////////////////////////////////
100     //  parameterized action tests
101     ///////////////////////////////////////////////////////////////////////////
102     {
103         using boost::phoenix::ref;
104         using boost::spirit::ascii::space;
105         using boost::spirit::qi::uint_;
106         using boost::spirit::qi::_1;
107         unsigned n, m;
108 
109         BOOST_TEST(test("123", uint_(123)[ref(n) = _1]));
110         BOOST_TEST(n == 123);
111         BOOST_TEST(!test("123", uint_(321)[ref(n) = _1]));
112 
113         BOOST_TEST(test_attr("789", uint_(789)[ref(n) = _1], m));
114         BOOST_TEST(n == 789 && m == 789);
115         BOOST_TEST(!test_attr("789", uint_(987)[ref(n) = _1], m));
116 
117         BOOST_TEST(test("   456", uint_(456)[ref(n) = _1], space));
118         BOOST_TEST(n == 456);
119         BOOST_TEST(!test("   456", uint_(654)[ref(n) = _1], space));
120     }
121 
122     ///////////////////////////////////////////////////////////////////////////
123     //  parameterized lazy tests
124     ///////////////////////////////////////////////////////////////////////////
125     {
126         using boost::phoenix::ref;
127         using boost::spirit::qi::uint_;
128         unsigned n = 123, m = 321;
129 
130         BOOST_TEST(test("123", uint_(ref(n))));
131         BOOST_TEST(!test("123", uint_(ref(m))));
132     }
133 
134     ///////////////////////////////////////////////////////////////////////////
135     //  parameterized custom uint tests
136     ///////////////////////////////////////////////////////////////////////////
137     {
138         using boost::spirit::qi::uint_;
139         using boost::spirit::qi::uint_parser;
140         custom_uint u;
141 
142         BOOST_TEST(test_attr("123456", uint_(123456), u));
143         uint_parser<custom_uint, 10, 1, 2> uint2;
144         BOOST_TEST(test_attr("12", uint2(12), u));
145     }
146 
147     return boost::report_errors();
148 }
149