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