parametric_tests.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. /*=============================================================================
  2. Copyright (c) 2001-2003 Joel de Guzman
  3. Copyright (c) 2003 Martin Wille
  4. http://spirit.sourceforge.net/
  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 <iostream>
  10. #include <boost/detail/lightweight_test.hpp>
  11. #include <string>
  12. #include <boost/spirit/include/classic_core.hpp>
  13. #include <boost/spirit/include/classic_parametric.hpp>
  14. #include <boost/spirit/include/phoenix1_primitives.hpp>
  15. #include <boost/spirit/include/phoenix1_operators.hpp>
  16. using namespace BOOST_SPIRIT_CLASSIC_NS;
  17. using namespace phoenix;
  18. #include <boost/detail/lightweight_test.hpp>
  19. ///////////////////////////////////////////////////////////////////////////////
  20. //
  21. // Parametric tests
  22. //
  23. ///////////////////////////////////////////////////////////////////////////////
  24. template <typename T>
  25. static unsigned
  26. length(T const *p)
  27. {
  28. unsigned result = 0;
  29. while (*p++)
  30. ++result;
  31. return result;
  32. }
  33. template <typename T>
  34. bool
  35. is_equal(T const* a, T const* b)
  36. {
  37. while (*a && *b)
  38. if (*a++ != *b++)
  39. return false;
  40. return true;
  41. }
  42. typedef rule< scanner<wchar_t const *> > wrule_t;
  43. void
  44. narrow_f_ch_p()
  45. {
  46. char ch;
  47. rule<> r = anychar_p[var(ch) = arg1] >> *f_ch_p(const_(ch));
  48. parse_info<char const*> pi;
  49. pi = parse("aaaaaaaaa", r);
  50. BOOST_TEST(pi.hit);
  51. BOOST_TEST(pi.full);
  52. pi = parse("aaaaabaaa", r);
  53. BOOST_TEST(pi.hit);
  54. BOOST_TEST(!pi.full);
  55. BOOST_TEST(is_equal(pi.stop, "baaa"));
  56. }
  57. void
  58. wide_f_ch_p()
  59. {
  60. wchar_t ch;
  61. wrule_t r = anychar_p[var(ch) = arg1] >> *f_ch_p(const_(ch));
  62. parse_info<wchar_t const*> pi;
  63. pi = parse(L"aaaaaaaaa", r);
  64. BOOST_TEST(pi.hit);
  65. BOOST_TEST(pi.full);
  66. pi = parse(L"aaaaabaaa", r);
  67. BOOST_TEST(pi.hit);
  68. BOOST_TEST(!pi.full);
  69. BOOST_TEST(is_equal(pi.stop, L"baaa"));
  70. }
  71. void
  72. narrow_f_range_p()
  73. {
  74. char from = 'a';
  75. char to = 'z';
  76. parse_info<char const*> pi;
  77. rule<> r2 = *f_range_p(const_(from), const_(to));
  78. pi = parse("abcdefghijklmnopqrstuvwxyz", r2);
  79. BOOST_TEST(pi.hit);
  80. BOOST_TEST(pi.full);
  81. pi = parse("abcdefghijklmnopqrstuvwxyz123", r2);
  82. BOOST_TEST(pi.hit);
  83. BOOST_TEST(!pi.full);
  84. BOOST_TEST(is_equal(pi.stop, "123"));
  85. }
  86. void
  87. wide_f_range_p()
  88. {
  89. wchar_t from = L'a';
  90. wchar_t to = L'z';
  91. parse_info<wchar_t const*> pi;
  92. wrule_t r2 = *f_range_p(const_(from), const_(to));
  93. pi = parse(L"abcdefghijklmnopqrstuvwxyz", r2);
  94. BOOST_TEST(pi.hit);
  95. BOOST_TEST(pi.full);
  96. pi = parse(L"abcdefghijklmnopqrstuvwxyz123", r2);
  97. BOOST_TEST(pi.hit);
  98. BOOST_TEST(!pi.full);
  99. BOOST_TEST(is_equal(pi.stop, L"123"));
  100. }
  101. void
  102. narrow_f_str_p()
  103. {
  104. parse_info<char const*> pi;
  105. char const* start = "kim";
  106. char const* end = start + length(start);
  107. rule<> r3 = +f_str_p(const_(start), const_(end));
  108. pi = parse("kimkimkimkimkimkimkimkimkim", r3);
  109. BOOST_TEST(pi.hit);
  110. BOOST_TEST(pi.full);
  111. pi = parse("kimkimkimkimkimkimkimkimkimmama", r3);
  112. BOOST_TEST(pi.hit);
  113. BOOST_TEST(!pi.full);
  114. BOOST_TEST(is_equal(pi.stop, "mama"));
  115. pi = parse("joel", r3);
  116. BOOST_TEST(!pi.hit);
  117. }
  118. void
  119. wide_f_str_p()
  120. {
  121. parse_info<wchar_t const*> pi;
  122. wchar_t const* start = L"kim";
  123. wchar_t const* end = start + length(start);
  124. wrule_t r3 = +f_str_p(const_(start), const_(end));
  125. pi = parse(L"kimkimkimkimkimkimkimkimkim", r3);
  126. BOOST_TEST(pi.hit);
  127. BOOST_TEST(pi.full);
  128. pi = parse(L"kimkimkimkimkimkimkimkimkimmama", r3);
  129. BOOST_TEST(pi.hit);
  130. BOOST_TEST(!pi.full);
  131. BOOST_TEST(is_equal(pi.stop, L"mama"));
  132. pi = parse(L"joel", r3);
  133. BOOST_TEST(!pi.hit);
  134. }
  135. ///////////////////////////////////////////////////////////////////////////////
  136. //
  137. // test suite
  138. //
  139. ///////////////////////////////////////////////////////////////////////////////
  140. int
  141. main()
  142. {
  143. narrow_f_ch_p();
  144. wide_f_ch_p();
  145. narrow_f_range_p();
  146. wide_f_range_p();
  147. narrow_f_str_p();
  148. wide_f_str_p();
  149. return boost::report_errors();
  150. }