1 //  Copyright (c) 2001-2011 Hartmut Kaiser
2 //  Copyright (c) 2011      Bryce Lelbach
3 //
4 //  Distributed under the Boost Software License, Version 1.0. (See accompanying
5 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 
7 #include "real.hpp"
8 
9 ///////////////////////////////////////////////////////////////////////////////
main()10 int main()
11 {
12     using namespace boost::spirit;
13 
14     {
15         using namespace boost::spirit::ascii;
16 
17         ///////////////////////////////////////////////////////////////////////
18         BOOST_TEST(test_delimited("0.0 ", double_, 0.0, char_(' ')));
19         BOOST_TEST(test_delimited("1.0 ", double_, 1.0, char_(' ')));
20         BOOST_TEST(test_delimited("1.0 ", double_, 1.0001, char_(' ')));
21         BOOST_TEST(test_delimited("1.001 ", double_, 1.001, char_(' ')));
22         BOOST_TEST(test_delimited("1.01 ", double_, 1.010, char_(' ')));
23         BOOST_TEST(test_delimited("1.1 ", double_, 1.100, char_(' ')));
24 
25         BOOST_TEST(test_delimited("1.234e-04 ", double_, 0.00012345, char_(' ')));
26         BOOST_TEST(test_delimited("0.001 ", double_, 0.0012345, char_(' ')));
27         BOOST_TEST(test_delimited("0.012 ", double_, 0.012345, char_(' ')));
28         BOOST_TEST(test_delimited("0.123 ", double_, 0.12345, char_(' ')));
29         BOOST_TEST(test_delimited("1.234 ", double_, 1.2345, char_(' ')));
30         BOOST_TEST(test_delimited("12.346 ", double_, 12.346, char_(' ')));
31         BOOST_TEST(test_delimited("123.46 ", double_, 123.46, char_(' ')));
32         BOOST_TEST(test_delimited("1234.5 ", double_, 1234.5, char_(' ')));
33         BOOST_TEST(test_delimited("12342.0 ", double_, 12342., char_(' ')));
34         BOOST_TEST(test_delimited("1.234e05 ", double_, 123420., char_(' ')));
35 
36         BOOST_TEST(test_delimited("-1.0 ", double_, -1.0, char_(' ')));
37         BOOST_TEST(test_delimited("-1.234 ", double_, -1.2345, char_(' ')));
38         BOOST_TEST(test_delimited("-1.235 ", double_, -1.2346, char_(' ')));
39         BOOST_TEST(test_delimited("-1234.2 ", double_, -1234.2, char_(' ')));
40 
41         BOOST_TEST(test_delimited("1.0 ", double_(1.0), char_(' ')));
42         BOOST_TEST(test_delimited("1.0 ", double_(1.0001), char_(' ')));
43         BOOST_TEST(test_delimited("1.001 ", double_(1.001), char_(' ')));
44         BOOST_TEST(test_delimited("1.01 ", double_(1.010), char_(' ')));
45         BOOST_TEST(test_delimited("1.1 ", double_(1.100), char_(' ')));
46 
47         BOOST_TEST(test_delimited("1.234e-04 ", double_(0.00012345), char_(' ')));
48         BOOST_TEST(test_delimited("0.001 ", double_(0.0012345), char_(' ')));
49         BOOST_TEST(test_delimited("0.012 ", double_(0.012345), char_(' ')));
50         BOOST_TEST(test_delimited("0.123 ", double_(0.12345), char_(' ')));
51         BOOST_TEST(test_delimited("1.234 ", double_(1.2345), char_(' ')));
52         BOOST_TEST(test_delimited("12.346 ", double_(12.346), char_(' ')));
53         BOOST_TEST(test_delimited("123.46 ", double_(123.46), char_(' ')));
54         BOOST_TEST(test_delimited("1234.5 ", double_(1234.5), char_(' ')));
55         BOOST_TEST(test_delimited("12342.0 ", double_(12342.), char_(' ')));
56         BOOST_TEST(test_delimited("1.234e05 ", double_(123420.), char_(' ')));
57     }
58 
59     {
60         using namespace boost::spirit::ascii;
61 
62         ///////////////////////////////////////////////////////////////////////
63         // test NaN and Inf
64         BOOST_TEST(test_delimited("nan ", double_,
65             std::numeric_limits<double>::quiet_NaN(), char_(' ')));
66         BOOST_TEST(test_delimited("-nan ", double_,
67             -std::numeric_limits<double>::quiet_NaN(), char_(' ')));
68         BOOST_TEST(test_delimited("inf ", double_,
69             std::numeric_limits<double>::infinity(), char_(' ')));
70         BOOST_TEST(test_delimited("-inf ", double_,
71             -std::numeric_limits<double>::infinity(), char_(' ')));
72 
73         typedef karma::real_generator<double, signed_policy<double> > signed_type;
74         signed_type const signed_ = signed_type();
75 
76         BOOST_TEST(test_delimited("+nan ", signed_,
77             std::numeric_limits<double>::quiet_NaN(), char_(' ')));
78         BOOST_TEST(test_delimited("-nan ", signed_,
79             -std::numeric_limits<double>::quiet_NaN(), char_(' ')));
80         BOOST_TEST(test_delimited("+inf ", signed_,
81             std::numeric_limits<double>::infinity(), char_(' ')));
82         BOOST_TEST(test_delimited("-inf ", signed_,
83             -std::numeric_limits<double>::infinity(), char_(' ')));
84 #if defined(BOOST_SPIRIT_ZERO_PROBLEM)
85         BOOST_TEST(test_delimited(" 0.0 ", signed_, 0.0, char_(' ')));
86 #endif
87     }
88 
89     {
90         using namespace boost::spirit::ascii;
91 
92         ///////////////////////////////////////////////////////////////////////
93         typedef karma::real_generator<double, scientific_policy<double> >
94             science_type;
95         science_type const science = science_type();
96 
97         BOOST_TEST(test("0.0e00", science, 0.0));
98         BOOST_TEST(test("1.0e00", science, 1.0));
99 
100         BOOST_TEST(test("1.234e-05", science, 0.000012345));
101         BOOST_TEST(test("1.234e-04", science, 0.00012345));
102         BOOST_TEST(test("1.234e-03", science, 0.0012345));
103         BOOST_TEST(test("1.234e-02", science, 0.012345));
104         BOOST_TEST(test("1.235e-01", science, 0.12345));     // note the rounding error!
105         BOOST_TEST(test("1.234e00", science, 1.2345));
106         BOOST_TEST(test("1.235e01", science, 12.346));
107         BOOST_TEST(test("1.235e02", science, 123.46));
108         BOOST_TEST(test("1.234e03", science, 1234.5));
109         BOOST_TEST(test("1.234e04", science, 12342.));
110         BOOST_TEST(test("1.234e05", science, 123420.));
111 
112         BOOST_TEST(test("-1.234e-05", science, -0.000012345));
113         BOOST_TEST(test("-1.234e-04", science, -0.00012345));
114         BOOST_TEST(test("-1.234e-03", science, -0.0012345));
115         BOOST_TEST(test("-1.234e-02", science, -0.012345));
116         BOOST_TEST(test("-1.235e-01", science, -0.12345));   // note the rounding error!
117         BOOST_TEST(test("-1.234e00", science, -1.2345));
118         BOOST_TEST(test("-1.235e01", science, -12.346));
119         BOOST_TEST(test("-1.235e02", science, -123.46));
120         BOOST_TEST(test("-1.234e03", science, -1234.5));
121         BOOST_TEST(test("-1.234e04", science, -12342.));
122         BOOST_TEST(test("-1.234e05", science, -123420.));
123 
124         BOOST_TEST(test("1.234E-05", upper[science], 0.000012345));
125         BOOST_TEST(test("1.234E-04", upper[science], 0.00012345));
126         BOOST_TEST(test("1.234E-03", upper[science], 0.0012345));
127         BOOST_TEST(test("1.234E-02", upper[science], 0.012345));
128         BOOST_TEST(test("1.235E-01", upper[science], 0.12345));     // note the rounding error!
129         BOOST_TEST(test("1.234E00", upper[science], 1.2345));
130         BOOST_TEST(test("1.235E01", upper[science], 12.346));
131         BOOST_TEST(test("1.235E02", upper[science], 123.46));
132         BOOST_TEST(test("1.234E03", upper[science], 1234.5));
133         BOOST_TEST(test("1.234E04", upper[science], 12342.));
134         BOOST_TEST(test("1.234E05", upper[science], 123420.));
135 
136         BOOST_TEST(test("-1.234E-05", upper[science], -0.000012345));
137         BOOST_TEST(test("-1.234E-04", upper[science], -0.00012345));
138         BOOST_TEST(test("-1.234E-03", upper[science], -0.0012345));
139         BOOST_TEST(test("-1.234E-02", upper[science], -0.012345));
140         BOOST_TEST(test("-1.235E-01", upper[science], -0.12345));   // note the rounding error!
141         BOOST_TEST(test("-1.234E00", upper[science], -1.2345));
142         BOOST_TEST(test("-1.235E01", upper[science], -12.346));
143         BOOST_TEST(test("-1.235E02", upper[science], -123.46));
144         BOOST_TEST(test("-1.234E03", upper[science], -1234.5));
145         BOOST_TEST(test("-1.234E04", upper[science], -12342.));
146         BOOST_TEST(test("-1.234E05", upper[science], -123420.));
147     }
148 
149     {
150         BOOST_TEST(test("1.0", lit(1.0)));
151         BOOST_TEST(test("1.0", lit(1.0f)));
152         BOOST_TEST(test("1.0", lit(1.0l)));
153 
154         BOOST_TEST(test("1.0", double_(1.0), 1.0));
155         BOOST_TEST(test("1.0", float_(1.0), 1.0f));
156         BOOST_TEST(test("1.0", long_double(1.0), 1.0l));
157         BOOST_TEST(!test("", double_(1.0), 2.0));
158         BOOST_TEST(!test("", float_(1.0), 2.0f));
159         BOOST_TEST(!test("", long_double(1.0), 2.0l));
160     }
161 
162     return boost::report_errors();
163 }
164