/*============================================================================= Copyright (c) 2001-2015 Joel de Guzman Copyright (c) 2001-2011 Hartmut Kaiser Copyright (c) 2011 Bryce Lelbach Use, modification and distribution is subject to the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) =============================================================================*/ #include "real.hpp" int main() { using spirit_test::test; using spirit_test::test_attr; /////////////////////////////////////////////////////////////////////////// // thousand separated numbers /////////////////////////////////////////////////////////////////////////// { using boost::spirit::x3::uint_parser; using boost::spirit::x3::parse; uint_parser uint3; uint_parser uint3_3; #define r (uint3 >> *(',' >> uint3_3)) BOOST_TEST(test("1,234,567,890", r)); BOOST_TEST(test("12,345,678,900", r)); BOOST_TEST(test("123,456,789,000", r)); BOOST_TEST(!test("1000,234,567,890", r)); BOOST_TEST(!test("1,234,56,890", r)); BOOST_TEST(!test("1,66", r)); } /////////////////////////////////////////////////////////////////////////// // unsigned real number tests /////////////////////////////////////////////////////////////////////////// { using boost::spirit::x3::real_parser; using boost::spirit::x3::parse; using boost::spirit::x3::ureal_policies; real_parser > udouble; double d; BOOST_TEST(test("1234", udouble)); BOOST_TEST(test_attr("1234", udouble, d) && compare(d, 1234)); BOOST_TEST(test("1.2e3", udouble)); BOOST_TEST(test_attr("1.2e3", udouble, d) && compare(d, 1.2e3)); BOOST_TEST(test("1.2e-3", udouble)); BOOST_TEST(test_attr("1.2e-3", udouble, d) && compare(d, 1.2e-3)); BOOST_TEST(test("1.e2", udouble)); BOOST_TEST(test_attr("1.e2", udouble, d) && compare(d, 1.e2)); BOOST_TEST(test("1.", udouble)); BOOST_TEST(test_attr("1.", udouble, d) && compare(d, 1.)); BOOST_TEST(test(".2e3", udouble)); BOOST_TEST(test_attr(".2e3", udouble, d) && compare(d, .2e3)); BOOST_TEST(test("2e3", udouble)); BOOST_TEST(test_attr("2e3", udouble, d) && compare(d, 2e3)); BOOST_TEST(test("2", udouble)); BOOST_TEST(test_attr("2", udouble, d) && compare(d, 2)); using boost::math::fpclassify; BOOST_TEST(test("inf", udouble)); BOOST_TEST(test("infinity", udouble)); BOOST_TEST(test("INF", udouble)); BOOST_TEST(test("INFINITY", udouble)); BOOST_TEST(test_attr("inf", udouble, d) && FP_INFINITE == fpclassify(d)); BOOST_TEST(test_attr("INF", udouble, d) && FP_INFINITE == fpclassify(d)); BOOST_TEST(test_attr("infinity", udouble, d) && FP_INFINITE == fpclassify(d)); BOOST_TEST(test_attr("INFINITY", udouble, d) && FP_INFINITE == fpclassify(d)); BOOST_TEST(test("nan", udouble)); BOOST_TEST(test_attr("nan", udouble, d) && FP_NAN == fpclassify(d)); BOOST_TEST(test("NAN", udouble)); BOOST_TEST(test_attr("NAN", udouble, d) && FP_NAN == fpclassify(d)); BOOST_TEST(test("nan(...)", udouble)); BOOST_TEST(test_attr("nan(...)", udouble, d) && FP_NAN == fpclassify(d)); BOOST_TEST(test("NAN(...)", udouble)); BOOST_TEST(test_attr("NAN(...)", udouble, d) && FP_NAN == fpclassify(d)); BOOST_TEST(!test("e3", udouble)); BOOST_TEST(!test_attr("e3", udouble, d)); BOOST_TEST(!test("-1.2e3", udouble)); BOOST_TEST(!test_attr("-1.2e3", udouble, d)); BOOST_TEST(!test("+1.2e3", udouble)); BOOST_TEST(!test_attr("+1.2e3", udouble, d)); BOOST_TEST(!test("1.2e", udouble)); BOOST_TEST(!test_attr("1.2e", udouble, d)); BOOST_TEST(!test("-.3", udouble)); BOOST_TEST(!test_attr("-.3", udouble, d)); } return boost::report_errors(); }