• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "int.hpp"
11 
12 int
main()13 main()
14 {
15     using spirit_test::test;
16     using spirit_test::test_attr;
17 
18     ///////////////////////////////////////////////////////////////////////////
19     //  signed integer tests
20     ///////////////////////////////////////////////////////////////////////////
21     {
22         using boost::spirit::int_;
23         int i;
24 
25         BOOST_TEST(test("123456", int_));
26         BOOST_TEST(test_attr("123456", int_, i));
27         BOOST_TEST(i == 123456);
28 
29         BOOST_TEST(test("+123456", int_));
30         BOOST_TEST(test_attr("+123456", int_, i));
31         BOOST_TEST(i == 123456);
32 
33         BOOST_TEST(test("-123456", int_));
34         BOOST_TEST(test_attr("-123456", int_, i));
35         BOOST_TEST(i == -123456);
36 
37         BOOST_TEST(test(max_int, int_));
38         BOOST_TEST(test_attr(max_int, int_, i));
39         BOOST_TEST(i == INT_MAX);
40 
41         BOOST_TEST(test(min_int, int_));
42         BOOST_TEST(test_attr(min_int, int_, i));
43         BOOST_TEST(i == INT_MIN);
44 
45         BOOST_TEST(!test(int_overflow, int_));
46         BOOST_TEST(!test_attr(int_overflow, int_, i));
47         BOOST_TEST(!test(int_underflow, int_));
48         BOOST_TEST(!test_attr(int_underflow, int_, i));
49 
50         BOOST_TEST(!test("-", int_));
51         BOOST_TEST(!test_attr("-", int_, i));
52 
53         BOOST_TEST(!test("+", int_));
54         BOOST_TEST(!test_attr("+", int_, i));
55 
56         // Bug report from Steve Nutt
57         BOOST_TEST(!test_attr("5368709120", int_, i));
58 
59         // with leading zeros
60         BOOST_TEST(test("0000000000123456", int_));
61         BOOST_TEST(test_attr("0000000000123456", int_, i));
62         BOOST_TEST(i == 123456);
63     }
64 
65     ///////////////////////////////////////////////////////////////////////////
66     //  long long tests
67     ///////////////////////////////////////////////////////////////////////////
68 #ifdef BOOST_HAS_LONG_LONG
69     {
70         using boost::spirit::long_long;
71         boost::long_long_type ll;
72 
73         BOOST_TEST(test("1234567890123456789", long_long));
74         BOOST_TEST(test_attr("1234567890123456789", long_long, ll));
75         BOOST_TEST(ll == 1234567890123456789LL);
76 
77         BOOST_TEST(test("-1234567890123456789", long_long));
78         BOOST_TEST(test_attr("-1234567890123456789", long_long, ll));
79         BOOST_TEST(ll == -1234567890123456789LL);
80 
81         BOOST_TEST(test(max_long_long, long_long));
82         BOOST_TEST(test_attr(max_long_long, long_long, ll));
83         BOOST_TEST(ll == LONG_LONG_MAX);
84 
85         BOOST_TEST(test(min_long_long, long_long));
86         BOOST_TEST(test_attr(min_long_long, long_long, ll));
87         BOOST_TEST(ll == LONG_LONG_MIN);
88 
89         BOOST_TEST(!test(long_long_overflow, long_long));
90         BOOST_TEST(!test_attr(long_long_overflow, long_long, ll));
91         BOOST_TEST(!test(long_long_underflow, long_long));
92         BOOST_TEST(!test_attr(long_long_underflow, long_long, ll));
93     }
94 #endif
95 
96     ///////////////////////////////////////////////////////////////////////////
97     //  short_ and long_ tests
98     ///////////////////////////////////////////////////////////////////////////
99     {
100         using boost::spirit::short_;
101         using boost::spirit::long_;
102         int i;
103 
104         BOOST_TEST(test("12345", short_));
105         BOOST_TEST(test_attr("12345", short_, i));
106         BOOST_TEST(i == 12345);
107 
108         BOOST_TEST(test("1234567890", long_));
109         BOOST_TEST(test_attr("1234567890", long_, i));
110         BOOST_TEST(i == 1234567890);
111     }
112 
113     ///////////////////////////////////////////////////////////////////////////
114     // Check overflow is parse error
115     ///////////////////////////////////////////////////////////////////////////
116     {
117         boost::spirit::qi::int_parser<boost::int8_t> int8_;
118         char c;
119 
120         BOOST_TEST(!test_attr("999", int8_, c));
121 
122         int i;
123         using boost::spirit::short_;
124         BOOST_TEST(!test_attr("32769", short_, i, false));
125         BOOST_TEST(!test_attr("41234", short_, i, false));
126     }
127 
128     ///////////////////////////////////////////////////////////////////////////
129     //  int_parser<unused_type> tests
130     ///////////////////////////////////////////////////////////////////////////
131     {
132         using boost::spirit::qi::int_parser;
133         using boost::spirit::unused_type;
134         int_parser<unused_type> any_int;
135 
136         BOOST_TEST(test("123456", any_int));
137         BOOST_TEST(test("-123456", any_int));
138         BOOST_TEST(test("-1234567890123456789", any_int));
139     }
140 
141     ///////////////////////////////////////////////////////////////////////////
142     //  action tests
143     ///////////////////////////////////////////////////////////////////////////
144     {
145         using boost::phoenix::ref;
146         using boost::spirit::_1;
147         using boost::spirit::ascii::space;
148         using boost::spirit::int_;
149         int n = 0, m = 0;
150 
151         BOOST_TEST(test("123", int_[ref(n) = _1]));
152         BOOST_TEST(n == 123);
153         BOOST_TEST(test_attr("789", int_[ref(n) = _1], m));
154         BOOST_TEST(n == 789 && m == 789);
155         BOOST_TEST(test("   456", int_[ref(n) = _1], space));
156         BOOST_TEST(n == 456);
157     }
158 
159     ///////////////////////////////////////////////////////////////////////////
160     //  custom int tests
161     ///////////////////////////////////////////////////////////////////////////
162     {
163         using boost::spirit::qi::int_;
164         using boost::spirit::qi::int_parser;
165         custom_int i;
166 
167         BOOST_TEST(test_attr("-123456", int_, i));
168         int_parser<custom_int, 10, 1, 2> int2;
169         BOOST_TEST(test_attr("-12", int2, i));
170     }
171 
172     return boost::report_errors();
173 }
174