primitives_tests.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /*=============================================================================
  2. Copyright (c) 1998-2003 Joel de Guzman
  3. Copyright (c) 2002-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/spirit/include/classic_core.hpp>
  11. #include <boost/detail/lightweight_test.hpp>
  12. #include "impl/string_length.hpp"
  13. using namespace BOOST_SPIRIT_CLASSIC_NS;
  14. ///////////////////////////////////////////////////////////////////////////////
  15. //
  16. // Primitives tests
  17. //
  18. ///////////////////////////////////////////////////////////////////////////////
  19. void
  20. primitives_tests()
  21. {
  22. char const* cp = "xyz.Jambalaya";
  23. char const* cp_first = cp;
  24. char const* cp_last = cp + test_impl::string_length(cp);
  25. chlit<> cpx('x');
  26. parse_info<char const*> pi = parse(cp_first, cp_last, cpx);
  27. BOOST_TEST(pi.hit);
  28. BOOST_TEST(!pi.full);
  29. BOOST_TEST(pi.length == 1);
  30. BOOST_TEST(pi.stop == &cp[1]);
  31. pi = parse(pi.stop, ch_p('y'));
  32. BOOST_TEST(pi.hit);
  33. BOOST_TEST(!pi.full);
  34. BOOST_TEST(pi.length == 1);
  35. BOOST_TEST(pi.stop == &cp[2]);
  36. scanner<char const*> scan(pi.stop, cp_last);
  37. match<char> hit = ch_p('z').parse(scan);
  38. BOOST_TEST(hit);
  39. BOOST_TEST(hit.value() == 'z');
  40. BOOST_TEST(pi.stop == &cp[3]);
  41. pi = parse(pi.stop, eps_p);
  42. BOOST_TEST(pi.hit);
  43. BOOST_TEST(!pi.full);
  44. BOOST_TEST(pi.length == 0);
  45. BOOST_TEST(pi.stop == &cp[3]);
  46. pi = parse(pi.stop, nothing_p);
  47. BOOST_TEST(!pi.hit);
  48. BOOST_TEST(!pi.full);
  49. BOOST_TEST(pi.stop == &cp[3]);
  50. pi = parse(pi.stop, anychar_p);
  51. BOOST_TEST(pi.hit);
  52. BOOST_TEST(!pi.full);
  53. BOOST_TEST(pi.length == 1);
  54. BOOST_TEST(pi.stop == &cp[4]);
  55. scan.first = pi.stop;
  56. hit = range_p('A','Z').parse(scan);
  57. BOOST_TEST(hit);
  58. BOOST_TEST(hit.value() == 'J');
  59. BOOST_TEST(pi.stop == &cp[5]);
  60. strlit<char const*> sp("ambalaya");
  61. strlit<wchar_t const*> wsp(L"ambalaya");
  62. char const* save = pi.stop;
  63. pi = parse(save, sp);
  64. BOOST_TEST(pi.hit);
  65. BOOST_TEST(pi.full);
  66. BOOST_TEST(pi.length == 8);
  67. BOOST_TEST(pi.stop == cp_last);
  68. pi = parse(save, wsp);
  69. BOOST_TEST(pi.hit);
  70. BOOST_TEST(pi.full);
  71. BOOST_TEST(pi.length == 8);
  72. BOOST_TEST(pi.stop == cp_last);
  73. pi = parse("\n", eol_p);
  74. BOOST_TEST(pi.hit);
  75. BOOST_TEST(pi.full);
  76. pi = parse("\r", eol_p);
  77. BOOST_TEST(pi.hit);
  78. BOOST_TEST(pi.full);
  79. pi = parse("\r\n", eol_p);
  80. BOOST_TEST(pi.hit);
  81. BOOST_TEST(pi.full);
  82. pi = parse("\n\r", eol_p);
  83. BOOST_TEST(pi.hit);
  84. BOOST_TEST(!pi.full);
  85. pi = parse("", end_p);
  86. BOOST_TEST(pi.hit);
  87. BOOST_TEST(pi.full);
  88. pi = parse("1", ~alpha_p);
  89. BOOST_TEST(pi.hit);
  90. BOOST_TEST(pi.full);
  91. pi = parse("a", ~alpha_p);
  92. BOOST_TEST(!pi.hit);
  93. pi = parse("a", ~~alpha_p);
  94. BOOST_TEST(pi.hit);
  95. BOOST_TEST(pi.full);
  96. pi = parse("1", ~~alpha_p);
  97. BOOST_TEST(!pi.hit);
  98. }
  99. ///////////////////////////////////////////////////////////////////////////////
  100. //
  101. // Main
  102. //
  103. ///////////////////////////////////////////////////////////////////////////////
  104. int
  105. main()
  106. {
  107. primitives_tests();
  108. if (boost::report_errors() == 0)
  109. std::cout << "Tests concluded successfully\n";
  110. return boost::report_errors();
  111. }