no_case.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /*=============================================================================
  2. Copyright (c) 2001-2011 Joel de Guzman
  3. http://spirit.sourceforge.net/
  4. Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. =============================================================================*/
  7. #include <boost/detail/lightweight_test.hpp>
  8. #include <boost/spirit/include/qi_char.hpp>
  9. #include <boost/spirit/include/qi_string.hpp>
  10. #include <boost/spirit/include/qi_directive.hpp>
  11. #include <boost/spirit/include/qi_action.hpp>
  12. #include <boost/spirit/include/phoenix_core.hpp>
  13. #include <boost/spirit/include/phoenix_operator.hpp>
  14. #include <iostream>
  15. #include "test.hpp"
  16. int
  17. main()
  18. {
  19. using spirit_test::test;
  20. using spirit_test::test_attr;
  21. using boost::spirit::qi::lit;
  22. {
  23. using namespace boost::spirit::ascii;
  24. BOOST_TEST(test("x", no_case[char_]));
  25. BOOST_TEST(test("X", no_case[char_('x')]));
  26. BOOST_TEST(test("X", no_case[char_('X')]));
  27. BOOST_TEST(test("x", no_case[char_('X')]));
  28. BOOST_TEST(test("x", no_case[char_('x')]));
  29. BOOST_TEST(!test("z", no_case[char_('X')]));
  30. BOOST_TEST(!test("z", no_case[char_('x')]));
  31. BOOST_TEST(test("x", no_case[char_('a', 'z')]));
  32. BOOST_TEST(test("X", no_case[char_('a', 'z')]));
  33. BOOST_TEST(!test("a", no_case[char_('b', 'z')]));
  34. BOOST_TEST(!test("z", no_case[char_('a', 'y')]));
  35. }
  36. {
  37. using namespace boost::spirit::ascii;
  38. BOOST_TEST(test("X", no_case['x']));
  39. BOOST_TEST(test("X", no_case['X']));
  40. BOOST_TEST(test("x", no_case['X']));
  41. BOOST_TEST(test("x", no_case['x']));
  42. BOOST_TEST(!test("z", no_case['X']));
  43. BOOST_TEST(!test("z", no_case['x']));
  44. }
  45. {
  46. using namespace boost::spirit::iso8859_1;
  47. BOOST_TEST(test("X", no_case[char_("a-z")]));
  48. BOOST_TEST(!test("1", no_case[char_("a-z")]));
  49. }
  50. { // test extended ASCII characters
  51. using namespace boost::spirit::iso8859_1;
  52. BOOST_TEST(test("\xC1", no_case[char_('\xE1')]));
  53. BOOST_TEST(test("\xC9", no_case[char_("\xE5-\xEF")]));
  54. BOOST_TEST(!test("\xFF", no_case[char_("\xE5-\xEF")]));
  55. BOOST_TEST(test("\xC1\xE1", no_case[lit("\xE1\xC1")]));
  56. BOOST_TEST(test("\xE1\xE1", no_case[no_case[lit("\xE1\xC1")]]));
  57. }
  58. {
  59. using namespace boost::spirit::ascii;
  60. BOOST_TEST(test("Bochi Bochi", no_case[lit("bochi bochi")]));
  61. BOOST_TEST(test("BOCHI BOCHI", no_case[lit("bochi bochi")]));
  62. BOOST_TEST(!test("Vavoo", no_case[lit("bochi bochi")]));
  63. }
  64. {
  65. // should work!
  66. using namespace boost::spirit::ascii;
  67. BOOST_TEST(test("x", no_case[no_case[char_]]));
  68. BOOST_TEST(test("x", no_case[no_case[char_('x')]]));
  69. BOOST_TEST(test("yabadabadoo", no_case[no_case[lit("Yabadabadoo")]]));
  70. }
  71. {
  72. using namespace boost::spirit::ascii;
  73. BOOST_TEST(test("X", no_case[alnum]));
  74. BOOST_TEST(test("6", no_case[alnum]));
  75. BOOST_TEST(!test(":", no_case[alnum]));
  76. BOOST_TEST(test("X", no_case[lower]));
  77. BOOST_TEST(test("x", no_case[lower]));
  78. BOOST_TEST(test("X", no_case[upper]));
  79. BOOST_TEST(test("x", no_case[upper]));
  80. BOOST_TEST(!test(":", no_case[lower]));
  81. BOOST_TEST(!test(":", no_case[upper]));
  82. }
  83. {
  84. using namespace boost::spirit::iso8859_1;
  85. BOOST_TEST(test("X", no_case[alnum]));
  86. BOOST_TEST(test("6", no_case[alnum]));
  87. BOOST_TEST(!test(":", no_case[alnum]));
  88. BOOST_TEST(test("X", no_case[lower]));
  89. BOOST_TEST(test("x", no_case[lower]));
  90. BOOST_TEST(test("X", no_case[upper]));
  91. BOOST_TEST(test("x", no_case[upper]));
  92. BOOST_TEST(!test(":", no_case[lower]));
  93. BOOST_TEST(!test(":", no_case[upper]));
  94. }
  95. {
  96. using namespace boost::spirit::standard;
  97. BOOST_TEST(test("X", no_case[alnum]));
  98. BOOST_TEST(test("6", no_case[alnum]));
  99. BOOST_TEST(!test(":", no_case[alnum]));
  100. BOOST_TEST(test("X", no_case[lower]));
  101. BOOST_TEST(test("x", no_case[lower]));
  102. BOOST_TEST(test("X", no_case[upper]));
  103. BOOST_TEST(test("x", no_case[upper]));
  104. BOOST_TEST(!test(":", no_case[lower]));
  105. BOOST_TEST(!test(":", no_case[upper]));
  106. }
  107. {
  108. // chsets
  109. namespace standard = boost::spirit::standard;
  110. namespace standard_wide = boost::spirit::standard_wide;
  111. BOOST_TEST(test("x", standard::no_case[standard::char_("a-z")]));
  112. BOOST_TEST(test("X", standard::no_case[standard::char_("a-z")]));
  113. BOOST_TEST(test(L"X", standard_wide::no_case[standard_wide::char_(L"a-z")]));
  114. BOOST_TEST(test(L"X", standard_wide::no_case[standard_wide::char_(L"X")]));
  115. }
  116. {
  117. using namespace boost::spirit::standard;
  118. std::string s("bochi bochi");
  119. BOOST_TEST(test("Bochi Bochi", no_case[lit(s.c_str())]));
  120. BOOST_TEST(test("Bochi Bochi", no_case[lit(s)]));
  121. BOOST_TEST(test("Bochi Bochi", no_case[s.c_str()]));
  122. BOOST_TEST(test("Bochi Bochi", no_case[s]));
  123. }
  124. { // lazy no_case chars
  125. using namespace boost::spirit::ascii;
  126. using boost::phoenix::val;
  127. using boost::phoenix::ref;
  128. using boost::spirit::_1;
  129. BOOST_TEST((test("X", no_case[val('x')])));
  130. BOOST_TEST((test("h", no_case[char_(val('a'), val('n'))])));
  131. BOOST_TEST(test("0", no_case[char_(val("a-z0-9"))]));
  132. char ch; // make sure lazy chars have an attribute
  133. BOOST_TEST(test("x", no_case[char_(val('x'))][ref(ch) = _1]));
  134. BOOST_TEST(ch == 'x');
  135. }
  136. { // lazy no_case lits
  137. using namespace boost::spirit::ascii;
  138. using boost::phoenix::val;
  139. BOOST_TEST(test("Bochi Bochi", no_case[val("bochi bochi")]));
  140. BOOST_TEST(test("BOCHI BOCHI", no_case[val("bochi bochi")]));
  141. BOOST_TEST(!test("Vavoo", no_case[val("bochi bochi")]));
  142. }
  143. return boost::report_errors();
  144. }