real1.cpp 4.2 KB

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