char1.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. // Copyright (c) 2001-2011 Hartmut Kaiser
  2. //
  3. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. #include <boost/config/warning_disable.hpp>
  6. #include <boost/detail/lightweight_test.hpp>
  7. #include <boost/spirit/include/karma_char.hpp>
  8. #include <boost/spirit/include/karma_generate.hpp>
  9. #include <boost/spirit/include/karma_action.hpp>
  10. #include <boost/spirit/include/karma_phoenix_attributes.hpp>
  11. #include <boost/spirit/include/phoenix_core.hpp>
  12. #include <boost/spirit/include/phoenix_operator.hpp>
  13. #include <boost/spirit/include/phoenix_statement.hpp>
  14. #include "test.hpp"
  15. using namespace spirit_test;
  16. ///////////////////////////////////////////////////////////////////////////////
  17. int
  18. main()
  19. {
  20. using namespace boost::spirit;
  21. using namespace boost::phoenix;
  22. {
  23. using namespace boost::spirit::ascii;
  24. BOOST_TEST(test("x", 'x'));
  25. BOOST_TEST(test(L"x", L'x'));
  26. BOOST_TEST(!test("x", 'y'));
  27. BOOST_TEST(!test(L"x", L'y'));
  28. BOOST_TEST(test("x", "x"));
  29. BOOST_TEST(test(L"x", L"x"));
  30. BOOST_TEST(!test("x", "y"));
  31. BOOST_TEST(!test(L"x", L"y"));
  32. BOOST_TEST(test("x", char_, 'x'));
  33. BOOST_TEST(test(L"x", char_, L'x'));
  34. BOOST_TEST(!test("x", char_, 'y'));
  35. BOOST_TEST(!test(L"x", char_, L'y'));
  36. BOOST_TEST(test("x", char_('x')));
  37. BOOST_TEST(!test("x", char_('y')));
  38. BOOST_TEST(test("x", char_('x'), 'x'));
  39. BOOST_TEST(!test("", char_('y'), 'x'));
  40. BOOST_TEST(test("x", char_("x")));
  41. BOOST_TEST(test("a", char_('a', 'z'), 'a'));
  42. BOOST_TEST(test("b", char_('a', 'z'), 'b'));
  43. BOOST_TEST(!test("", char_('a', 'z'), 'A'));
  44. BOOST_TEST(test("a", char_("a-z"), 'a'));
  45. BOOST_TEST(test("b", char_("a-z"), 'b'));
  46. BOOST_TEST(!test("", char_("a-z"), 'A'));
  47. #if defined(KARMA_FAIL_COMPILATION)
  48. BOOST_TEST(test("x", char_)); // anychar without a parameter doesn't make any sense
  49. BOOST_TEST(test("", char_('a', 'z'))); // char sets without attribute neither
  50. #endif
  51. BOOST_TEST(!test("", ~char_('x')));
  52. BOOST_TEST(!test("", ~char_('x'), 'x'));
  53. BOOST_TEST(test("x", ~char_('y'), 'x'));
  54. BOOST_TEST(!test("", ~char_("x")));
  55. BOOST_TEST(!test("", ~char_('a', 'z'), 'a'));
  56. BOOST_TEST(!test("", ~char_('a', 'z'), 'b'));
  57. BOOST_TEST(test("A", ~char_('a', 'z'), 'A'));
  58. BOOST_TEST(!test("", ~char_("a-z"), 'a'));
  59. BOOST_TEST(!test("", ~char_("a-z"), 'b'));
  60. BOOST_TEST(test("A", ~char_("a-z"), 'A'));
  61. BOOST_TEST(test("x", ~~char_('x')));
  62. BOOST_TEST(!test("x", ~~char_('y')));
  63. BOOST_TEST(test("x", ~~char_('x'), 'x'));
  64. BOOST_TEST(!test("", ~~char_('y'), 'x'));
  65. BOOST_TEST(test("x", ~~char_("x")));
  66. BOOST_TEST(test("a", ~~char_('a', 'z'), 'a'));
  67. BOOST_TEST(test("b", ~~char_('a', 'z'), 'b'));
  68. BOOST_TEST(!test("", ~~char_('a', 'z'), 'A'));
  69. BOOST_TEST(test("a", ~~char_("a-z"), 'a'));
  70. BOOST_TEST(test("b", ~~char_("a-z"), 'b'));
  71. BOOST_TEST(!test("", ~~char_("a-z"), 'A'));
  72. }
  73. {
  74. using namespace boost::spirit::standard_wide;
  75. BOOST_TEST(test(L"x", 'x'));
  76. BOOST_TEST(test(L"x", L'x'));
  77. BOOST_TEST(!test(L"x", 'y'));
  78. BOOST_TEST(!test(L"x", L'y'));
  79. BOOST_TEST(test(L"x", "x"));
  80. BOOST_TEST(test(L"x", L"x"));
  81. BOOST_TEST(!test(L"x", "y"));
  82. BOOST_TEST(!test(L"x", L"y"));
  83. BOOST_TEST(test(L"x", char_, 'x'));
  84. BOOST_TEST(test(L"x", char_, L'x'));
  85. BOOST_TEST(!test(L"x", char_, 'y'));
  86. BOOST_TEST(!test(L"x", char_, L'y'));
  87. BOOST_TEST(test(L"x", char_('x')));
  88. BOOST_TEST(test(L"x", char_(L'x')));
  89. BOOST_TEST(!test(L"x", char_('y')));
  90. BOOST_TEST(!test(L"x", char_(L'y')));
  91. BOOST_TEST(test(L"x", char_(L'x'), L'x'));
  92. BOOST_TEST(!test(L"", char_('y'), L'x'));
  93. BOOST_TEST(test(L"x", char_(L"x")));
  94. BOOST_TEST(test("a", char_("a", "z"), 'a'));
  95. BOOST_TEST(test(L"a", char_(L"a", L"z"), L'a'));
  96. #if defined(KARMA_FAIL_COMPILATION)
  97. BOOST_TEST(test("x", char_)); // anychar without a parameter doesn't make any sense
  98. #endif
  99. BOOST_TEST(!test(L"", ~char_('x')));
  100. BOOST_TEST(!test(L"", ~char_(L'x')));
  101. BOOST_TEST(!test(L"", ~char_(L'x'), L'x'));
  102. BOOST_TEST(test(L"x", ~char_('y'), L'x'));
  103. BOOST_TEST(!test(L"", ~char_(L"x")));
  104. }
  105. { // lazy chars
  106. namespace ascii = boost::spirit::ascii;
  107. namespace wide = boost::spirit::standard_wide;
  108. using namespace boost::phoenix;
  109. BOOST_TEST((test("x", ascii::char_(val('x')))));
  110. BOOST_TEST((test(L"x", wide::char_(val(L'x')))));
  111. BOOST_TEST((test("x", ascii::char_(val('x')), 'x')));
  112. BOOST_TEST((test(L"x", wide::char_(val(L'x')), L'x')));
  113. BOOST_TEST((!test("", ascii::char_(val('y')), 'x')));
  114. BOOST_TEST((!test(L"", wide::char_(val(L'y')), L'x')));
  115. }
  116. // we can pass optionals as attributes to any generator
  117. {
  118. namespace ascii = boost::spirit::ascii;
  119. namespace wide = boost::spirit::standard_wide;
  120. boost::optional<char> v;
  121. boost::optional<wchar_t> w;
  122. BOOST_TEST(!test("", ascii::char_, v));
  123. BOOST_TEST(!test(L"", wide::char_, w));
  124. BOOST_TEST(!test("", ascii::char_('x'), v));
  125. BOOST_TEST(!test(L"", wide::char_(L'x'), w));
  126. }
  127. return boost::report_errors();
  128. }