loops_tests.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. /*=============================================================================
  2. Copyright (c) 1998-2003 Joel de Guzman
  3. http://spirit.sourceforge.net/
  4. Use, modification and distribution is subject to the Boost Software
  5. License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  6. http://www.boost.org/LICENSE_1_0.txt)
  7. =============================================================================*/
  8. #include <iostream>
  9. #include <boost/detail/lightweight_test.hpp>
  10. #include <boost/spirit/include/classic_core.hpp>
  11. #include <boost/spirit/include/classic_loops.hpp>
  12. using namespace BOOST_SPIRIT_CLASSIC_NS;
  13. ///////////////////////////////////////////////////////////////////////////////
  14. //
  15. // Loops tests
  16. //
  17. ///////////////////////////////////////////////////////////////////////////////
  18. void
  19. loops_tests()
  20. {
  21. parse_info<char const*> pi;
  22. pi = parse("\"Hello World\"", "\"" >> *(anychar_p - "\"") >> "\"");
  23. BOOST_TEST(pi.hit);
  24. BOOST_TEST(pi.full);
  25. BOOST_TEST(pi.length == 13);
  26. BOOST_TEST(*pi.stop == 0);
  27. pi = parse("\"Hello World\"", "\"" >> repeat_p(0, more)[anychar_p - "\""] >> "\"");
  28. BOOST_TEST(pi.hit);
  29. BOOST_TEST(pi.full);
  30. BOOST_TEST(pi.length == 13);
  31. BOOST_TEST(*pi.stop == 0);
  32. pi = parse("xx", +ch_p('x'));
  33. BOOST_TEST(pi.hit);
  34. BOOST_TEST(pi.full);
  35. BOOST_TEST(pi.length == 2);
  36. BOOST_TEST(*pi.stop == 0);
  37. pi = parse("xx", repeat_p(1, more)[ch_p('x')]);
  38. BOOST_TEST(pi.hit);
  39. BOOST_TEST(pi.full);
  40. BOOST_TEST(pi.length == 2);
  41. BOOST_TEST(*pi.stop == 0);
  42. pi = parse("", +ch_p('x'));
  43. BOOST_TEST(!pi.hit);
  44. pi = parse("", repeat_p(1, more)[ch_p('x')]);
  45. BOOST_TEST(!pi.hit);
  46. pi = parse("", *ch_p('x'));
  47. BOOST_TEST(pi.hit);
  48. BOOST_TEST(pi.full);
  49. BOOST_TEST(pi.length == 0);
  50. BOOST_TEST(*pi.stop == 0);
  51. pi = parse("", repeat_p(0, more)[ch_p('x')]);
  52. BOOST_TEST(pi.hit);
  53. BOOST_TEST(pi.full);
  54. BOOST_TEST(pi.length == 0);
  55. BOOST_TEST(*pi.stop == 0);
  56. // repeat exact 8
  57. rule<> rep8 = repeat_p(8)[alpha_p] >> 'X';
  58. BOOST_TEST(!parse("abcdefgX", rep8).hit);
  59. BOOST_TEST(parse("abcdefghX", rep8).full);
  60. BOOST_TEST(!parse("abcdefghiX", rep8).hit);
  61. BOOST_TEST(!parse("abcdefgX", rep8).hit);
  62. BOOST_TEST(!parse("aX", rep8).hit);
  63. // repeat 2 to 8
  64. rule<> rep28 = repeat_p(2, 8)[alpha_p] >> '*';
  65. BOOST_TEST(parse("abcdefg*", rep28).full);
  66. BOOST_TEST(parse("abcdefgh*", rep28).full);
  67. BOOST_TEST(!parse("abcdefghi*", rep28).hit);
  68. BOOST_TEST(!parse("a*", rep28).hit);
  69. // repeat 2 or more
  70. rule<> rep2_ = repeat_p(2, more)[alpha_p] >> '+';
  71. BOOST_TEST(parse("abcdefg+", rep2_).full);
  72. BOOST_TEST(parse("abcdefgh+", rep2_).full);
  73. BOOST_TEST(parse("abcdefghi+", rep2_).full);
  74. BOOST_TEST(parse("abcdefg+", rep2_).full);
  75. BOOST_TEST(!parse("a+", rep2_).hit);
  76. // repeat 0
  77. rule<> rep0 = repeat_p(0)[alpha_p] >> '/';
  78. BOOST_TEST(parse("/", rep0).full);
  79. BOOST_TEST(!parse("a/", rep0).hit);
  80. // repeat 0 or 1
  81. rule<> rep01 = repeat_p(0, 1)[alpha_p >> digit_p] >> '?';
  82. BOOST_TEST(!parse("abcdefg?", rep01).hit);
  83. BOOST_TEST(!parse("a?", rep01).hit);
  84. BOOST_TEST(!parse("1?", rep01).hit);
  85. BOOST_TEST(!parse("11?", rep01).hit);
  86. BOOST_TEST(!parse("aa?", rep01).hit);
  87. BOOST_TEST(parse("?", rep01).full);
  88. BOOST_TEST(parse("a1?", rep01).full);
  89. }
  90. ///////////////////////////////////////////////////////////////////////////////
  91. //
  92. // Main
  93. //
  94. ///////////////////////////////////////////////////////////////////////////////
  95. int
  96. main()
  97. {
  98. loops_tests();
  99. return boost::report_errors();
  100. }