• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*=============================================================================
2     Copyright (c) 2001-2015 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
main()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::x3::uint_parser;
24         using boost::spirit::x3::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::x3::real_parser;
44         using boost::spirit::x3::parse;
45         using boost::spirit::x3::ureal_policies;
46 
47         constexpr real_parser<double, ureal_policies<double> > udouble;
48         double d;
49 
50         BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(udouble);
51 
52         BOOST_TEST(test("1234", udouble));
53         BOOST_TEST(test_attr("1234", udouble, d) && compare(d, 1234));
54 
55         BOOST_TEST(test("1.2e3", udouble));
56         BOOST_TEST(test_attr("1.2e3", udouble, d) && compare(d, 1.2e3));
57 
58         BOOST_TEST(test("1.2e-3", udouble));
59         BOOST_TEST(test_attr("1.2e-3", udouble, d) && compare(d, 1.2e-3));
60 
61         BOOST_TEST(test("1.e2", udouble));
62         BOOST_TEST(test_attr("1.e2", udouble, d) && compare(d, 1.e2));
63 
64         BOOST_TEST(test("1.", udouble));
65         BOOST_TEST(test_attr("1.", udouble, d) && compare(d, 1.));
66 
67         BOOST_TEST(test(".2e3", udouble));
68         BOOST_TEST(test_attr(".2e3", udouble, d) && compare(d, .2e3));
69 
70         BOOST_TEST(test("2e3", udouble));
71         BOOST_TEST(test_attr("2e3", udouble, d) && compare(d, 2e3));
72 
73         BOOST_TEST(test("2", udouble));
74         BOOST_TEST(test_attr("2", udouble, d) && compare(d, 2));
75 
76         BOOST_TEST(test("inf", udouble));
77         BOOST_TEST(test("infinity", udouble));
78         BOOST_TEST(test("INF", udouble));
79         BOOST_TEST(test("INFINITY", udouble));
80 
81         BOOST_TEST(test_attr("inf", udouble, d)
82                 && std::isinf(d));
83         BOOST_TEST(test_attr("INF", udouble, d)
84                 && std::isinf(d));
85         BOOST_TEST(test_attr("infinity", udouble, d)
86                 && std::isinf(d));
87         BOOST_TEST(test_attr("INFINITY", udouble, d)
88                 && std::isinf(d));
89 
90         BOOST_TEST(test("nan", udouble));
91         BOOST_TEST(test_attr("nan", udouble, d)
92                 && std::isnan(d));
93         BOOST_TEST(test("NAN", udouble));
94         BOOST_TEST(test_attr("NAN", udouble, d)
95                 && std::isnan(d));
96         BOOST_TEST(test("nan(...)", udouble));
97         BOOST_TEST(test_attr("nan(...)", udouble, d)
98                 && std::isnan(d));
99         BOOST_TEST(test("NAN(...)", udouble));
100         BOOST_TEST(test_attr("NAN(...)", udouble, d)
101                 && std::isnan(d));
102 
103         BOOST_TEST(!test("e3", udouble));
104         BOOST_TEST(!test_attr("e3", udouble, d));
105 
106         BOOST_TEST(!test("-1.2e3", udouble));
107         BOOST_TEST(!test_attr("-1.2e3", udouble, d));
108 
109         BOOST_TEST(!test("+1.2e3", udouble));
110         BOOST_TEST(!test_attr("+1.2e3", udouble, d));
111 
112         BOOST_TEST(!test("1.2e", udouble));
113         BOOST_TEST(!test_attr("1.2e", udouble, d));
114 
115         BOOST_TEST(!test("-.3", udouble));
116         BOOST_TEST(!test_attr("-.3", udouble, d));
117     }
118 
119     return boost::report_errors();
120 }
121