int3.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  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. #include <boost/spirit/include/qi_rule.hpp>
  10. int
  11. main()
  12. {
  13. using spirit_test::test;
  14. using spirit_test::test_attr;
  15. ///////////////////////////////////////////////////////////////////////////
  16. // parameterized signed integer tests
  17. ///////////////////////////////////////////////////////////////////////////
  18. {
  19. using boost::spirit::int_;
  20. int i;
  21. BOOST_TEST(test("123456", int_(123456)));
  22. BOOST_TEST(!test("123456", int_(654321)));
  23. BOOST_TEST(test_attr("123456", int_(123456), i));
  24. BOOST_TEST(i == 123456);
  25. BOOST_TEST(!test_attr("123456", int_(654321), i));
  26. BOOST_TEST(test("+123456", int_(123456)));
  27. BOOST_TEST(!test("+123456", int_(654321)));
  28. BOOST_TEST(test_attr("+123456", int_(123456), i));
  29. BOOST_TEST(i == 123456);
  30. BOOST_TEST(!test_attr("+123456", int_(654321), i));
  31. BOOST_TEST(test("-123456", int_(-123456)));
  32. BOOST_TEST(!test("-123456", int_(123456)));
  33. BOOST_TEST(test_attr("-123456", int_(-123456), i));
  34. BOOST_TEST(i == -123456);
  35. BOOST_TEST(!test_attr("-123456", int_(123456), i));
  36. BOOST_TEST(test(max_int, int_(INT_MAX)));
  37. BOOST_TEST(test_attr(max_int, int_(INT_MAX), i));
  38. BOOST_TEST(i == INT_MAX);
  39. BOOST_TEST(test(min_int, int_(INT_MIN)));
  40. BOOST_TEST(test_attr(min_int, int_(INT_MIN), i));
  41. BOOST_TEST(i == INT_MIN);
  42. // with leading zeros
  43. BOOST_TEST(test("0000000000123456", int_(123456)));
  44. BOOST_TEST(test_attr("0000000000123456", int_(123456), i));
  45. BOOST_TEST(i == 123456);
  46. }
  47. ///////////////////////////////////////////////////////////////////////////
  48. // parameterized long long tests
  49. ///////////////////////////////////////////////////////////////////////////
  50. #ifdef BOOST_HAS_LONG_LONG
  51. {
  52. using boost::spirit::long_long;
  53. boost::long_long_type ll;
  54. BOOST_TEST(test("1234567890123456789"
  55. , long_long(1234567890123456789LL)));
  56. BOOST_TEST(!test("1234567890123456789"
  57. , long_long(0)));
  58. BOOST_TEST(test_attr("1234567890123456789"
  59. , long_long(1234567890123456789LL), ll));
  60. BOOST_TEST(ll == 1234567890123456789LL);
  61. BOOST_TEST(!test_attr("1234567890123456789"
  62. , long_long(0), ll));
  63. BOOST_TEST(test("-1234567890123456789"
  64. , long_long(-1234567890123456789LL)));
  65. BOOST_TEST(!test("-1234567890123456789"
  66. , long_long(1234567890123456789LL)));
  67. BOOST_TEST(test_attr("-1234567890123456789"
  68. , long_long(-1234567890123456789LL), ll));
  69. BOOST_TEST(ll == -1234567890123456789LL);
  70. BOOST_TEST(!test_attr("-1234567890123456789"
  71. , long_long(1234567890123456789LL), ll));
  72. BOOST_TEST(test(max_long_long, long_long(LONG_LONG_MAX)));
  73. BOOST_TEST(test_attr(max_long_long, long_long(LONG_LONG_MAX), ll));
  74. BOOST_TEST(ll == LONG_LONG_MAX);
  75. BOOST_TEST(test(min_long_long, long_long(LONG_LONG_MIN)));
  76. BOOST_TEST(test_attr(min_long_long, long_long(LONG_LONG_MIN), ll));
  77. BOOST_TEST(ll == LONG_LONG_MIN);
  78. }
  79. #endif
  80. ///////////////////////////////////////////////////////////////////////////
  81. // parameterized short_ and long_ tests
  82. ///////////////////////////////////////////////////////////////////////////
  83. {
  84. using boost::spirit::short_;
  85. using boost::spirit::long_;
  86. int i;
  87. BOOST_TEST(test("12345", short_(12345)));
  88. BOOST_TEST(!test("12345", short_(54321)));
  89. BOOST_TEST(test_attr("12345", short_(12345), i));
  90. BOOST_TEST(i == 12345);
  91. BOOST_TEST(!test_attr("12345", short_(54321), i));
  92. BOOST_TEST(test("1234567890", long_(1234567890L)));
  93. BOOST_TEST(!test("1234567890", long_(987654321L)));
  94. BOOST_TEST(test_attr("1234567890", long_(1234567890L), i));
  95. BOOST_TEST(i == 1234567890);
  96. BOOST_TEST(!test_attr("1234567890", long_(987654321L), i));
  97. }
  98. ///////////////////////////////////////////////////////////////////////////
  99. // parameterized action tests
  100. ///////////////////////////////////////////////////////////////////////////
  101. {
  102. using boost::phoenix::ref;
  103. using boost::spirit::ascii::space;
  104. using boost::spirit::qi::int_;
  105. using boost::spirit::qi::_1;
  106. int n = 0, m = 0;
  107. BOOST_TEST(test("123", int_(123)[ref(n) = _1]));
  108. BOOST_TEST(n == 123);
  109. BOOST_TEST(!test("123", int_(321)[ref(n) = _1]));
  110. BOOST_TEST(test_attr("789", int_(789)[ref(n) = _1], m));
  111. BOOST_TEST(n == 789 && m == 789);
  112. BOOST_TEST(!test_attr("789", int_(987)[ref(n) = _1], m));
  113. BOOST_TEST(test(" 456", int_(456)[ref(n) = _1], space));
  114. BOOST_TEST(n == 456);
  115. BOOST_TEST(!test(" 456", int_(654)[ref(n) = _1], space));
  116. }
  117. ///////////////////////////////////////////////////////////////////////////
  118. {
  119. using boost::spirit::qi::int_;
  120. using boost::spirit::qi::_1;
  121. using boost::spirit::qi::_val;
  122. using boost::spirit::qi::space;
  123. int i = 0;
  124. int j = 0;
  125. BOOST_TEST(test_attr("456", int_[_val = _1], i) && i == 456);
  126. BOOST_TEST(test_attr(" 456", int_[_val = _1], j, space) && j == 456);
  127. }
  128. ///////////////////////////////////////////////////////////////////////////
  129. // parameterized lazy tests
  130. ///////////////////////////////////////////////////////////////////////////
  131. {
  132. using boost::phoenix::ref;
  133. using boost::spirit::qi::int_;
  134. int n = 123, m = 321;
  135. BOOST_TEST(test("123", int_(ref(n))));
  136. BOOST_TEST(!test("123", int_(ref(m))));
  137. }
  138. ///////////////////////////////////////////////////////////////////////////
  139. // parameterized custom int tests
  140. ///////////////////////////////////////////////////////////////////////////
  141. {
  142. using boost::spirit::qi::int_;
  143. using boost::spirit::qi::int_parser;
  144. custom_int i;
  145. BOOST_TEST(test_attr("-123456", int_(-123456), i));
  146. int_parser<custom_int, 10, 1, 2> int2;
  147. BOOST_TEST(test_attr("-12", int2(-12), i));
  148. }
  149. return boost::report_errors();
  150. }