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
12int
13main()
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

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