int1.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. /*=============================================================================
  2. Copyright (c) 2001-2015 Joel de Guzman
  3. Copyright (c) 2001-2011 Hartmut Kaiser
  4. Copyright (c) 2011 Bryce Lelbach
  5. Distributed under the Boost Software License, Version 1.0. (See accompanying
  6. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  7. =============================================================================*/
  8. #include "int.hpp"
  9. #include <boost/spirit/home/x3.hpp>
  10. #include <boost/fusion/include/vector.hpp>
  11. #include <boost/fusion/include/at.hpp>
  12. int
  13. main()
  14. {
  15. using spirit_test::test;
  16. using spirit_test::test_attr;
  17. ///////////////////////////////////////////////////////////////////////////
  18. // signed integer tests
  19. ///////////////////////////////////////////////////////////////////////////
  20. {
  21. using boost::spirit::x3::int_;
  22. int i;
  23. BOOST_TEST(test("123456", int_));
  24. BOOST_TEST(test_attr("123456", int_, i));
  25. BOOST_TEST(i == 123456);
  26. BOOST_TEST(test("+123456", int_));
  27. BOOST_TEST(test_attr("+123456", int_, i));
  28. BOOST_TEST(i == 123456);
  29. BOOST_TEST(test("-123456", int_));
  30. BOOST_TEST(test_attr("-123456", int_, i));
  31. BOOST_TEST(i == -123456);
  32. BOOST_TEST(test(max_int, int_));
  33. BOOST_TEST(test_attr(max_int, int_, i));
  34. BOOST_TEST(i == INT_MAX);
  35. BOOST_TEST(test(min_int, int_));
  36. BOOST_TEST(test_attr(min_int, int_, i));
  37. BOOST_TEST(i == INT_MIN);
  38. BOOST_TEST(!test(int_overflow, int_));
  39. BOOST_TEST(!test_attr(int_overflow, int_, i));
  40. BOOST_TEST(!test(int_underflow, int_));
  41. BOOST_TEST(!test_attr(int_underflow, int_, i));
  42. BOOST_TEST(!test("-", int_));
  43. BOOST_TEST(!test_attr("-", int_, i));
  44. BOOST_TEST(!test("+", int_));
  45. BOOST_TEST(!test_attr("+", int_, i));
  46. // Bug report from Steve Nutt
  47. BOOST_TEST(!test_attr("5368709120", int_, i));
  48. // with leading zeros
  49. BOOST_TEST(test("0000000000123456", int_));
  50. BOOST_TEST(test_attr("0000000000123456", int_, i));
  51. BOOST_TEST(i == 123456);
  52. }
  53. ///////////////////////////////////////////////////////////////////////////
  54. // long long tests
  55. ///////////////////////////////////////////////////////////////////////////
  56. {
  57. using boost::spirit::x3::long_long;
  58. boost::long_long_type ll;
  59. BOOST_TEST(test("1234567890123456789", long_long));
  60. BOOST_TEST(test_attr("1234567890123456789", long_long, ll));
  61. BOOST_TEST(ll == 1234567890123456789LL);
  62. BOOST_TEST(test("-1234567890123456789", long_long));
  63. BOOST_TEST(test_attr("-1234567890123456789", long_long, ll));
  64. BOOST_TEST(ll == -1234567890123456789LL);
  65. BOOST_TEST(test(max_long_long, long_long));
  66. BOOST_TEST(test_attr(max_long_long, long_long, ll));
  67. BOOST_TEST(ll == LLONG_MAX);
  68. BOOST_TEST(test(min_long_long, long_long));
  69. BOOST_TEST(test_attr(min_long_long, long_long, ll));
  70. BOOST_TEST(ll == LLONG_MIN);
  71. BOOST_TEST(!test(long_long_overflow, long_long));
  72. BOOST_TEST(!test_attr(long_long_overflow, long_long, ll));
  73. BOOST_TEST(!test(long_long_underflow, long_long));
  74. BOOST_TEST(!test_attr(long_long_underflow, long_long, ll));
  75. }
  76. ///////////////////////////////////////////////////////////////////////////
  77. // short_ and long_ tests
  78. ///////////////////////////////////////////////////////////////////////////
  79. {
  80. using boost::spirit::x3::short_;
  81. using boost::spirit::x3::long_;
  82. int i;
  83. BOOST_TEST(test("12345", short_));
  84. BOOST_TEST(test_attr("12345", short_, i));
  85. BOOST_TEST(i == 12345);
  86. BOOST_TEST(test("1234567890", long_));
  87. BOOST_TEST(test_attr("1234567890", long_, i));
  88. BOOST_TEST(i == 1234567890);
  89. }
  90. ///////////////////////////////////////////////////////////////////////////
  91. // Check overflow is parse error
  92. ///////////////////////////////////////////////////////////////////////////
  93. {
  94. boost::spirit::x3::int_parser<boost::int8_t> int8_;
  95. char c;
  96. BOOST_TEST(!test_attr("999", int8_, c));
  97. int i;
  98. using boost::spirit::x3::short_;
  99. BOOST_TEST(!test_attr("32769", short_, i, false));
  100. BOOST_TEST(!test_attr("41234", short_, i, false));
  101. }
  102. ///////////////////////////////////////////////////////////////////////////
  103. // int_parser<unused_type> tests
  104. ///////////////////////////////////////////////////////////////////////////
  105. {
  106. using boost::spirit::x3::int_parser;
  107. using boost::spirit::x3::unused_type;
  108. int_parser<unused_type> any_int;
  109. BOOST_TEST(test("123456", any_int));
  110. BOOST_TEST(test("-123456", any_int));
  111. BOOST_TEST(test("-1234567890123456789", any_int));
  112. }
  113. ///////////////////////////////////////////////////////////////////////////
  114. // action tests
  115. ///////////////////////////////////////////////////////////////////////////
  116. {
  117. using boost::spirit::x3::_attr;
  118. using boost::spirit::x3::ascii::space;
  119. using boost::spirit::x3::int_;
  120. int n = 0, m = 0;
  121. auto f = [&](auto& ctx){ n = _attr(ctx); };
  122. BOOST_TEST(test("123", int_[f]));
  123. BOOST_TEST(n == 123);
  124. BOOST_TEST(test_attr("789", int_[f], m));
  125. BOOST_TEST(n == 789 && m == 789);
  126. BOOST_TEST(test(" 456", int_[f], space));
  127. BOOST_TEST(n == 456);
  128. }
  129. ///////////////////////////////////////////////////////////////////////////
  130. // custom int tests
  131. ///////////////////////////////////////////////////////////////////////////
  132. {
  133. using boost::spirit::x3::int_;
  134. using boost::spirit::x3::int_parser;
  135. custom_int i;
  136. BOOST_TEST(test_attr("-123456", int_, i));
  137. int_parser<custom_int, 10, 1, 2> int2;
  138. BOOST_TEST(test_attr("-12", int2, i));
  139. }
  140. ///////////////////////////////////////////////////////////////////////////
  141. // single-element fusion vector tests
  142. ///////////////////////////////////////////////////////////////////////////
  143. {
  144. using boost::spirit::x3::int_;
  145. using boost::spirit::x3::int_parser;
  146. boost::fusion::vector<int> i;
  147. BOOST_TEST(test_attr("-123456", int_, i));
  148. BOOST_TEST(boost::fusion::at_c<0>(i) == -123456);
  149. }
  150. return boost::report_errors();
  151. }