1 | /*============================================================================= |
2 | Copyright (c) 2001-2011 Joel de Guzman |
3 | Copyright (c) 2001-2011 Hartmut Kaiser |
4 | Copyright (c) 2011 Bryce Lelbach |
5 | |
6 | Use, modification and distribution is subject to the Boost Software |
7 | License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at |
8 | http://www.boost.org/LICENSE_1_0.txt) |
9 | =============================================================================*/ |
10 | |
11 | #include "real.hpp" |
12 | |
13 | int |
14 | main() |
15 | { |
16 | using spirit_test::test; |
17 | using spirit_test::test_attr; |
18 | |
19 | /////////////////////////////////////////////////////////////////////////// |
20 | // thousand separated numbers |
21 | /////////////////////////////////////////////////////////////////////////// |
22 | { |
23 | using boost::spirit::qi::uint_parser; |
24 | using boost::spirit::qi::parse; |
25 | |
26 | uint_parser<unsigned, 10, 1, 3> uint3; |
27 | uint_parser<unsigned, 10, 3, 3> uint3_3; |
28 | |
29 | #define r (uint3 >> *(',' >> uint3_3)) |
30 | |
31 | BOOST_TEST(test("1,234,567,890" , r)); |
32 | BOOST_TEST(test("12,345,678,900" , r)); |
33 | BOOST_TEST(test("123,456,789,000" , r)); |
34 | BOOST_TEST(!test("1000,234,567,890" , r)); |
35 | BOOST_TEST(!test("1,234,56,890" , r)); |
36 | BOOST_TEST(!test("1,66" , r)); |
37 | } |
38 | |
39 | /////////////////////////////////////////////////////////////////////////// |
40 | // unsigned real number tests |
41 | /////////////////////////////////////////////////////////////////////////// |
42 | { |
43 | using boost::spirit::qi::real_parser; |
44 | using boost::spirit::qi::parse; |
45 | using boost::spirit::qi::ureal_policies; |
46 | |
47 | real_parser<double, ureal_policies<double> > udouble; |
48 | double d; |
49 | |
50 | BOOST_TEST(test("1234" , udouble)); |
51 | BOOST_TEST(test_attr("1234" , udouble, d) && compare(d, 1234)); |
52 | |
53 | BOOST_TEST(test("1.2e3" , udouble)); |
54 | BOOST_TEST(test_attr("1.2e3" , udouble, d) && compare(d, 1.2e3)); |
55 | |
56 | BOOST_TEST(test("1.2e-3" , udouble)); |
57 | BOOST_TEST(test_attr("1.2e-3" , udouble, d) && compare(d, 1.2e-3)); |
58 | |
59 | BOOST_TEST(test("1.e2" , udouble)); |
60 | BOOST_TEST(test_attr("1.e2" , udouble, d) && compare(d, 1.e2)); |
61 | |
62 | BOOST_TEST(test("1." , udouble)); |
63 | BOOST_TEST(test_attr("1." , udouble, d) && compare(d, 1.)); |
64 | |
65 | BOOST_TEST(test(".2e3" , udouble)); |
66 | BOOST_TEST(test_attr(".2e3" , udouble, d) && compare(d, .2e3)); |
67 | |
68 | BOOST_TEST(test("2e3" , udouble)); |
69 | BOOST_TEST(test_attr("2e3" , udouble, d) && compare(d, 2e3)); |
70 | |
71 | BOOST_TEST(test("2" , udouble)); |
72 | BOOST_TEST(test_attr("2" , udouble, d) && compare(d, 2)); |
73 | |
74 | using boost::core::isinf; |
75 | using boost::core::isnan; |
76 | |
77 | BOOST_TEST(test("inf" , udouble)); |
78 | BOOST_TEST(test("infinity" , udouble)); |
79 | BOOST_TEST(test("INF" , udouble)); |
80 | BOOST_TEST(test("INFINITY" , udouble)); |
81 | |
82 | BOOST_TEST(test_attr("inf" , udouble, d) |
83 | && isinf(d)); |
84 | BOOST_TEST(test_attr("INF" , udouble, d) |
85 | && isinf(d)); |
86 | BOOST_TEST(test_attr("infinity" , udouble, d) |
87 | && isinf(d)); |
88 | BOOST_TEST(test_attr("INFINITY" , udouble, d) |
89 | && isinf(d)); |
90 | |
91 | BOOST_TEST(test("nan" , udouble)); |
92 | BOOST_TEST(test_attr("nan" , udouble, d) |
93 | && isnan(d)); |
94 | BOOST_TEST(test("NAN" , udouble)); |
95 | BOOST_TEST(test_attr("NAN" , udouble, d) |
96 | && isnan(d)); |
97 | BOOST_TEST(test("nan(...)" , udouble)); |
98 | BOOST_TEST(test_attr("nan(...)" , udouble, d) |
99 | && isnan(d)); |
100 | BOOST_TEST(test("NAN(...)" , udouble)); |
101 | BOOST_TEST(test_attr("NAN(...)" , udouble, d) |
102 | && isnan(d)); |
103 | |
104 | BOOST_TEST(!test("e3" , udouble)); |
105 | BOOST_TEST(!test_attr("e3" , udouble, d)); |
106 | |
107 | BOOST_TEST(!test("-1.2e3" , udouble)); |
108 | BOOST_TEST(!test_attr("-1.2e3" , udouble, d)); |
109 | |
110 | BOOST_TEST(!test("+1.2e3" , udouble)); |
111 | BOOST_TEST(!test_attr("+1.2e3" , udouble, d)); |
112 | |
113 | BOOST_TEST(!test("1.2e" , udouble)); |
114 | BOOST_TEST(!test_attr("1.2e" , udouble, d)); |
115 | |
116 | BOOST_TEST(!test("-.3" , udouble)); |
117 | BOOST_TEST(!test_attr("-.3" , udouble, d)); |
118 | |
119 | BOOST_TEST(test("4em" , udouble, false)); |
120 | BOOST_TEST(test_attr("4em" , udouble, d, false) && compare(d, 4.0)); |
121 | } |
122 | |
123 | return boost::report_errors(); |
124 | } |
125 | |