int1.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. /*=============================================================================
  2. Copyright (c) 2001-2011 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. int
  10. main()
  11. {
  12. using spirit_test::test;
  13. using spirit_test::test_attr;
  14. ///////////////////////////////////////////////////////////////////////////
  15. // signed integer tests
  16. ///////////////////////////////////////////////////////////////////////////
  17. {
  18. using boost::spirit::int_;
  19. int i;
  20. BOOST_TEST(test("123456", int_));
  21. BOOST_TEST(test_attr("123456", int_, i));
  22. BOOST_TEST(i == 123456);
  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(max_int, int_));
  30. BOOST_TEST(test_attr(max_int, int_, i));
  31. BOOST_TEST(i == INT_MAX);
  32. BOOST_TEST(test(min_int, int_));
  33. BOOST_TEST(test_attr(min_int, int_, i));
  34. BOOST_TEST(i == INT_MIN);
  35. BOOST_TEST(!test(int_overflow, int_));
  36. BOOST_TEST(!test_attr(int_overflow, int_, i));
  37. BOOST_TEST(!test(int_underflow, int_));
  38. BOOST_TEST(!test_attr(int_underflow, int_, i));
  39. BOOST_TEST(!test("-", int_));
  40. BOOST_TEST(!test_attr("-", int_, i));
  41. BOOST_TEST(!test("+", int_));
  42. BOOST_TEST(!test_attr("+", int_, i));
  43. // Bug report from Steve Nutt
  44. BOOST_TEST(!test_attr("5368709120", int_, i));
  45. // with leading zeros
  46. BOOST_TEST(test("0000000000123456", int_));
  47. BOOST_TEST(test_attr("0000000000123456", int_, i));
  48. BOOST_TEST(i == 123456);
  49. }
  50. ///////////////////////////////////////////////////////////////////////////
  51. // long long tests
  52. ///////////////////////////////////////////////////////////////////////////
  53. #ifdef BOOST_HAS_LONG_LONG
  54. {
  55. using boost::spirit::long_long;
  56. boost::long_long_type ll;
  57. BOOST_TEST(test("1234567890123456789", long_long));
  58. BOOST_TEST(test_attr("1234567890123456789", long_long, ll));
  59. BOOST_TEST(ll == 1234567890123456789LL);
  60. BOOST_TEST(test("-1234567890123456789", long_long));
  61. BOOST_TEST(test_attr("-1234567890123456789", long_long, ll));
  62. BOOST_TEST(ll == -1234567890123456789LL);
  63. BOOST_TEST(test(max_long_long, long_long));
  64. BOOST_TEST(test_attr(max_long_long, long_long, ll));
  65. BOOST_TEST(ll == LONG_LONG_MAX);
  66. BOOST_TEST(test(min_long_long, long_long));
  67. BOOST_TEST(test_attr(min_long_long, long_long, ll));
  68. BOOST_TEST(ll == LONG_LONG_MIN);
  69. BOOST_TEST(!test(long_long_overflow, long_long));
  70. BOOST_TEST(!test_attr(long_long_overflow, long_long, ll));
  71. BOOST_TEST(!test(long_long_underflow, long_long));
  72. BOOST_TEST(!test_attr(long_long_underflow, long_long, ll));
  73. }
  74. #endif
  75. ///////////////////////////////////////////////////////////////////////////
  76. // short_ and long_ tests
  77. ///////////////////////////////////////////////////////////////////////////
  78. {
  79. using boost::spirit::short_;
  80. using boost::spirit::long_;
  81. int i;
  82. BOOST_TEST(test("12345", short_));
  83. BOOST_TEST(test_attr("12345", short_, i));
  84. BOOST_TEST(i == 12345);
  85. BOOST_TEST(test("1234567890", long_));
  86. BOOST_TEST(test_attr("1234567890", long_, i));
  87. BOOST_TEST(i == 1234567890);
  88. }
  89. ///////////////////////////////////////////////////////////////////////////
  90. // Check overflow is parse error
  91. ///////////////////////////////////////////////////////////////////////////
  92. {
  93. boost::spirit::qi::int_parser<boost::int8_t> int8_;
  94. char c;
  95. BOOST_TEST(!test_attr("999", int8_, c));
  96. int i;
  97. using boost::spirit::short_;
  98. BOOST_TEST(!test_attr("32769", short_, i, false));
  99. BOOST_TEST(!test_attr("41234", short_, i, false));
  100. }
  101. ///////////////////////////////////////////////////////////////////////////
  102. // int_parser<unused_type> tests
  103. ///////////////////////////////////////////////////////////////////////////
  104. {
  105. using boost::spirit::qi::int_parser;
  106. using boost::spirit::unused_type;
  107. int_parser<unused_type> any_int;
  108. BOOST_TEST(test("123456", any_int));
  109. BOOST_TEST(test("-123456", any_int));
  110. BOOST_TEST(test("-1234567890123456789", any_int));
  111. }
  112. ///////////////////////////////////////////////////////////////////////////
  113. // action tests
  114. ///////////////////////////////////////////////////////////////////////////
  115. {
  116. using boost::phoenix::ref;
  117. using boost::spirit::_1;
  118. using boost::spirit::ascii::space;
  119. using boost::spirit::int_;
  120. int n = 0, m = 0;
  121. BOOST_TEST(test("123", int_[ref(n) = _1]));
  122. BOOST_TEST(n == 123);
  123. BOOST_TEST(test_attr("789", int_[ref(n) = _1], m));
  124. BOOST_TEST(n == 789 && m == 789);
  125. BOOST_TEST(test(" 456", int_[ref(n) = _1], space));
  126. BOOST_TEST(n == 456);
  127. }
  128. ///////////////////////////////////////////////////////////////////////////
  129. // custom int tests
  130. ///////////////////////////////////////////////////////////////////////////
  131. {
  132. using boost::spirit::qi::int_;
  133. using boost::spirit::qi::int_parser;
  134. custom_int i;
  135. BOOST_TEST(test_attr("-123456", int_, i));
  136. int_parser<custom_int, 10, 1, 2> int2;
  137. BOOST_TEST(test_attr("-12", int2, i));
  138. }
  139. return boost::report_errors();
  140. }