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 #include <boost/spirit/include/qi_rule.hpp>
12 
13 int
main()14 main()
15 {
16     using spirit_test::test;
17     using spirit_test::test_attr;
18 
19     ///////////////////////////////////////////////////////////////////////////
20     //  parameterized signed integer tests
21     ///////////////////////////////////////////////////////////////////////////
22     {
23         using boost::spirit::int_;
24         int i;
25 
26         BOOST_TEST(test("123456", int_(123456)));
27         BOOST_TEST(!test("123456", int_(654321)));
28         BOOST_TEST(test_attr("123456", int_(123456), i));
29         BOOST_TEST(i == 123456);
30         BOOST_TEST(!test_attr("123456", int_(654321), i));
31 
32         BOOST_TEST(test("+123456", int_(123456)));
33         BOOST_TEST(!test("+123456", int_(654321)));
34         BOOST_TEST(test_attr("+123456", int_(123456), i));
35         BOOST_TEST(i == 123456);
36         BOOST_TEST(!test_attr("+123456", int_(654321), i));
37 
38         BOOST_TEST(test("-123456", int_(-123456)));
39         BOOST_TEST(!test("-123456", int_(123456)));
40         BOOST_TEST(test_attr("-123456", int_(-123456), i));
41         BOOST_TEST(i == -123456);
42         BOOST_TEST(!test_attr("-123456", int_(123456), i));
43 
44         BOOST_TEST(test(max_int, int_(INT_MAX)));
45         BOOST_TEST(test_attr(max_int, int_(INT_MAX), i));
46         BOOST_TEST(i == INT_MAX);
47 
48         BOOST_TEST(test(min_int, int_(INT_MIN)));
49         BOOST_TEST(test_attr(min_int, int_(INT_MIN), i));
50         BOOST_TEST(i == INT_MIN);
51 
52         // with leading zeros
53         BOOST_TEST(test("0000000000123456", int_(123456)));
54         BOOST_TEST(test_attr("0000000000123456", int_(123456), i));
55         BOOST_TEST(i == 123456);
56     }
57 
58     ///////////////////////////////////////////////////////////////////////////
59     //  parameterized long long tests
60     ///////////////////////////////////////////////////////////////////////////
61 #ifdef BOOST_HAS_LONG_LONG
62     {
63         using boost::spirit::long_long;
64         boost::long_long_type ll;
65 
66         BOOST_TEST(test("1234567890123456789"
67           , long_long(1234567890123456789LL)));
68         BOOST_TEST(!test("1234567890123456789"
69           , long_long(0)));
70         BOOST_TEST(test_attr("1234567890123456789"
71           , long_long(1234567890123456789LL), ll));
72         BOOST_TEST(ll == 1234567890123456789LL);
73         BOOST_TEST(!test_attr("1234567890123456789"
74           , long_long(0), ll));
75 
76         BOOST_TEST(test("-1234567890123456789"
77           , long_long(-1234567890123456789LL)));
78         BOOST_TEST(!test("-1234567890123456789"
79           , long_long(1234567890123456789LL)));
80         BOOST_TEST(test_attr("-1234567890123456789"
81           , long_long(-1234567890123456789LL), ll));
82         BOOST_TEST(ll == -1234567890123456789LL);
83         BOOST_TEST(!test_attr("-1234567890123456789"
84           , long_long(1234567890123456789LL), ll));
85 
86         BOOST_TEST(test(max_long_long, long_long(LONG_LONG_MAX)));
87         BOOST_TEST(test_attr(max_long_long, long_long(LONG_LONG_MAX), ll));
88         BOOST_TEST(ll == LONG_LONG_MAX);
89 
90         BOOST_TEST(test(min_long_long, long_long(LONG_LONG_MIN)));
91         BOOST_TEST(test_attr(min_long_long, long_long(LONG_LONG_MIN), ll));
92         BOOST_TEST(ll == LONG_LONG_MIN);
93     }
94 #endif
95 
96     ///////////////////////////////////////////////////////////////////////////
97     //  parameterized 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_(12345)));
105         BOOST_TEST(!test("12345", short_(54321)));
106         BOOST_TEST(test_attr("12345", short_(12345), i));
107         BOOST_TEST(i == 12345);
108         BOOST_TEST(!test_attr("12345", short_(54321), i));
109 
110         BOOST_TEST(test("1234567890", long_(1234567890L)));
111         BOOST_TEST(!test("1234567890", long_(987654321L)));
112         BOOST_TEST(test_attr("1234567890", long_(1234567890L), i));
113         BOOST_TEST(i == 1234567890);
114         BOOST_TEST(!test_attr("1234567890", long_(987654321L), i));
115     }
116 
117     ///////////////////////////////////////////////////////////////////////////
118     //  parameterized action tests
119     ///////////////////////////////////////////////////////////////////////////
120     {
121         using boost::phoenix::ref;
122         using boost::spirit::ascii::space;
123         using boost::spirit::qi::int_;
124         using boost::spirit::qi::_1;
125         int n = 0, m = 0;
126 
127         BOOST_TEST(test("123", int_(123)[ref(n) = _1]));
128         BOOST_TEST(n == 123);
129         BOOST_TEST(!test("123", int_(321)[ref(n) = _1]));
130 
131         BOOST_TEST(test_attr("789", int_(789)[ref(n) = _1], m));
132         BOOST_TEST(n == 789 && m == 789);
133         BOOST_TEST(!test_attr("789", int_(987)[ref(n) = _1], m));
134 
135         BOOST_TEST(test("   456", int_(456)[ref(n) = _1], space));
136         BOOST_TEST(n == 456);
137         BOOST_TEST(!test("   456", int_(654)[ref(n) = _1], space));
138     }
139 
140     ///////////////////////////////////////////////////////////////////////////
141     {
142         using boost::spirit::qi::int_;
143         using boost::spirit::qi::_1;
144         using boost::spirit::qi::_val;
145         using boost::spirit::qi::space;
146 
147         int i = 0;
148         int j = 0;
149         BOOST_TEST(test_attr("456", int_[_val = _1], i) && i == 456);
150         BOOST_TEST(test_attr("   456", int_[_val = _1], j, space) && j == 456);
151     }
152 
153     ///////////////////////////////////////////////////////////////////////////
154     //  parameterized lazy tests
155     ///////////////////////////////////////////////////////////////////////////
156     {
157         using boost::phoenix::ref;
158         using boost::spirit::qi::int_;
159         int n = 123, m = 321;
160 
161         BOOST_TEST(test("123", int_(ref(n))));
162         BOOST_TEST(!test("123", int_(ref(m))));
163     }
164 
165     ///////////////////////////////////////////////////////////////////////////
166     //  parameterized custom int tests
167     ///////////////////////////////////////////////////////////////////////////
168     {
169         using boost::spirit::qi::int_;
170         using boost::spirit::qi::int_parser;
171         custom_int i;
172 
173         BOOST_TEST(test_attr("-123456", int_(-123456), i));
174         int_parser<custom_int, 10, 1, 2> int2;
175         BOOST_TEST(test_attr("-12", int2(-12), i));
176     }
177 
178     return boost::report_errors();
179 }
180