alternative2.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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_auxiliary.hpp>
  8. #include <boost/spirit/include/karma_char.hpp>
  9. #include <boost/spirit/include/karma_string.hpp>
  10. #include <boost/spirit/include/karma_numeric.hpp>
  11. #include <boost/spirit/include/karma_generate.hpp>
  12. #include <boost/spirit/include/karma_operator.hpp>
  13. #include <boost/spirit/include/karma_directive.hpp>
  14. #include <boost/spirit/include/karma_nonterminal.hpp>
  15. #include <boost/spirit/include/karma_auxiliary.hpp>
  16. #include "test.hpp"
  17. using namespace spirit_test;
  18. ///////////////////////////////////////////////////////////////////////////////
  19. int
  20. main()
  21. {
  22. using namespace boost;
  23. using namespace boost::spirit;
  24. using namespace boost::spirit::ascii;
  25. {
  26. // test if alternatives with all components having unused
  27. // attribute generate first alternative
  28. fusion::vector<char, char> v('a', 'b');
  29. BOOST_TEST(test("axb", char_ << (lit('x') | lit('i')) << char_, v));
  30. BOOST_TEST(test("axib",
  31. char_ << (lit('x') << lit('i') | lit('i')) << char_, v));
  32. }
  33. {
  34. BOOST_TEST(test_delimited("x ", char_('x') | char_('i'), char_(' ')));
  35. BOOST_TEST(test_delimited("x i ",
  36. char_('x') << char_('i') | char_('i'), char_(' ')));
  37. BOOST_TEST(test_delimited("i ",
  38. char_('i') | char_('x') << char_('i'), char_(' ')));
  39. variant<int, char> v (10);
  40. BOOST_TEST(test_delimited("10 ", char_ | int_, v, char_(' ')));
  41. BOOST_TEST(test_delimited("10 ", int_ | char_, v, char_(' ')));
  42. BOOST_TEST(test_delimited("a ", lit('a') | char_ | int_, v, char_(' ')));
  43. BOOST_TEST(test_delimited("a ", char_ | lit('a') | int_, v, char_(' ')));
  44. BOOST_TEST(test_delimited("10 ", int_ | lit('a') | char_, v, char_(' ')));
  45. v = 'c';
  46. BOOST_TEST(test_delimited("c ", char_ | int_, v, char_(' ')));
  47. BOOST_TEST(test_delimited("a ", lit('a') | char_ | int_, v, char_(' ')));
  48. BOOST_TEST(test_delimited("c ", char_ | lit('a') | int_, v, char_(' ')));
  49. BOOST_TEST(test_delimited("a ", int_ | lit('a') | char_, v, char_(' ')));
  50. BOOST_TEST(test_delimited("c ", int_ | char_ | lit('a'), v, char_(' ')));
  51. }
  52. // this leads to infinite loops
  53. // {
  54. // variant<int, std::string> v(10);
  55. // BOOST_TEST(test("10", int_ | +char_, v));
  56. //
  57. // v = "abc";
  58. // BOOST_TEST(test("abc", int_ | +char_, v));
  59. // }
  60. {
  61. // if nothing matches, the first explicit alternative will be chosen
  62. variant<double, char const*> v (10.0);
  63. BOOST_TEST(test("11", char_ | lit(11), v));
  64. BOOST_TEST(test("11", lit(11) | char_ , v));
  65. BOOST_TEST(test("10.0", double_ | lit(11), v));
  66. BOOST_TEST(test("11", lit(11) | double_, v));
  67. BOOST_TEST(!test("", char_ | int_, v));
  68. v = "c";
  69. BOOST_TEST(test("11", char_ | lit(11), v));
  70. BOOST_TEST(test("11", double_ | lit(11), v));
  71. BOOST_TEST(!test("", char_ | int_, v));
  72. }
  73. {
  74. // in strict mode if nothing matches, the alternative will fail
  75. variant<double, char const*> v (10.0);
  76. BOOST_TEST(!test("11", strict[char_ | lit(11)], v));
  77. BOOST_TEST(test("11", strict[lit(11) | char_] , v));
  78. v = "c";
  79. BOOST_TEST(!test("11", strict[char_ | lit(11)], v));
  80. }
  81. {
  82. // if nothing matches, the first explicit alternative will be chosen
  83. variant<double, char const*> v (10.0);
  84. BOOST_TEST(test_delimited("11 ", char_ | lit(11), v, char_(' ')));
  85. BOOST_TEST(test_delimited("11 ", lit(11) | char_ , v, char_(' ')));
  86. BOOST_TEST(test_delimited("10.0 ", double_ | lit(11), v, char_(' ')));
  87. BOOST_TEST(test_delimited("11 ", lit(11) | double_, v, char_(' ')));
  88. BOOST_TEST(!test_delimited("", char_ | int_, v, char_(' ')));
  89. v = "c";
  90. BOOST_TEST(test_delimited("11 ", char_ | lit(11), v, char_(' ')));
  91. BOOST_TEST(test_delimited("11 ", double_ | lit(11), v, char_(' ')));
  92. BOOST_TEST(!test_delimited("", char_ | int_, v, char_(' ')));
  93. }
  94. {
  95. // if nothing matches, the first explicit alternative will be chosen,
  96. // optionals need to be accepted
  97. optional<variant<double, char const*> > v (10.0);
  98. BOOST_TEST(test_delimited("11 ", char_ | lit(11), v, char_(' ')));
  99. BOOST_TEST(test_delimited("11 ", lit(11) | char_ , v, char_(' ')));
  100. BOOST_TEST(test_delimited("10.0 ", double_ | lit(11), v, char_(' ')));
  101. BOOST_TEST(test_delimited("11 ", lit(11) | double_, v, char_(' ')));
  102. BOOST_TEST(!test_delimited("", char_ | int_, v, char_(' ')));
  103. v = "c";
  104. BOOST_TEST(test_delimited("11 ", char_ | lit(11), v, char_(' ')));
  105. BOOST_TEST(test_delimited("11 ", double_ | lit(11), v, char_(' ')));
  106. BOOST_TEST(!test_delimited("", char_ | int_, v, char_(' ')));
  107. }
  108. {
  109. std::vector<int> v;
  110. BOOST_TEST(test("[]", '[' << (int_ % ", ") << ']' | "[]", v));
  111. BOOST_TEST(test("[]", '[' << -(int_ % ", ") << ']', v));
  112. BOOST_TEST(test("[]", '[' << ((int_ % ", ") | eps) << ']', v));
  113. v.push_back(5);
  114. v.push_back(5);
  115. v.push_back(5);
  116. BOOST_TEST(test("[5, 5, 5]", '[' << (int_ % ", ") << ']' | "[]", v));
  117. }
  118. return boost::report_errors();
  119. }