alternative1.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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. BOOST_TEST(test("x", char_('x') | char_('i')));
  27. BOOST_TEST(test("xi", char_('x') << char_('i') | char_('i')));
  28. BOOST_TEST(test("i", char_('i') | char_('x') << char_('i')));
  29. BOOST_TEST(test("x", buffer[char_('x')] | char_('i')));
  30. variant<int, char> v (10);
  31. BOOST_TEST(test("10", char_ | int_, v));
  32. BOOST_TEST(test("10", int_ | char_, v));
  33. BOOST_TEST(test("a", lit('a') | char_ | int_, v));
  34. BOOST_TEST(test("a", char_ | lit('a') | int_, v));
  35. BOOST_TEST(test("10", int_ | lit('a') | char_, v));
  36. v = 'c';
  37. BOOST_TEST(test("c", char_ | int_, v));
  38. BOOST_TEST(test("a", lit('a') | char_ | int_, v));
  39. BOOST_TEST(test("c", char_ | lit('a') | int_, v));
  40. BOOST_TEST(test("a", int_ | lit('a') | char_, v));
  41. BOOST_TEST(test("c", int_ | char_ | lit('a'), v));
  42. }
  43. // testing for alignment/truncation problems on little endian systems
  44. // (big endian systems will fail one of the other tests below)
  45. {
  46. // test optional attribute
  47. optional<variant<int, char> > v;
  48. BOOST_TEST(!test("", char_ | int_, v));
  49. BOOST_TEST(!test("", int_ | char_, v));
  50. BOOST_TEST(test("a", lit('a') | char_ | int_, v));
  51. BOOST_TEST(test("a", char_ | lit('a') | int_, v));
  52. BOOST_TEST(test("a", int_ | lit('a') | char_, v));
  53. v = 10;
  54. BOOST_TEST(test("10", char_ | int_, v));
  55. BOOST_TEST(test("10", int_ | char_, v));
  56. BOOST_TEST(test("a", lit('a') | char_ | int_, v));
  57. BOOST_TEST(test("a", char_ | lit('a') | int_, v));
  58. BOOST_TEST(test("10", int_ | lit('a') | char_, v));
  59. v = 'c';
  60. BOOST_TEST(test("c", char_ | int_, v));
  61. BOOST_TEST(test("a", lit('a') | char_ | int_, v));
  62. BOOST_TEST(test("c", char_ | lit('a') | int_, v));
  63. BOOST_TEST(test("a", int_ | lit('a') | char_, v));
  64. BOOST_TEST(test("c", int_ | char_ | lit('a'), v));
  65. }
  66. {
  67. // more tests for optional attribute
  68. optional<int> o;
  69. BOOST_TEST(test("a", lit('a') | int_, o));
  70. BOOST_TEST(test("a", int_ | lit('a'), o));
  71. o = 10;
  72. BOOST_TEST(test("a", lit('a') | int_, o));
  73. BOOST_TEST(test("10", int_ | lit('a'), o));
  74. }
  75. {
  76. int i = 10;
  77. BOOST_TEST(test("a", lit('a') | int_, i));
  78. BOOST_TEST(test("10", int_ | lit('a'), i));
  79. }
  80. {
  81. optional<std::string> o;
  82. BOOST_TEST(test("xyzzy", ("(" << string << ")") | lit("xyzzy"), o));
  83. o = "plugh";
  84. BOOST_TEST(test("(plugh)", ("(" << string << ")") | lit("xyzzy"), o));
  85. }
  86. {
  87. BOOST_TEST(test("abc", string | int_, std::string("abc")));
  88. BOOST_TEST(test("1234", string | int_, 1234));
  89. BOOST_TEST(test("abc", int_ | string, std::string("abc")));
  90. BOOST_TEST(test("1234", int_ | string, 1234));
  91. }
  92. {
  93. // testing for alignment/truncation problems on little endian systems
  94. // (big endian systems will fail one of the other tests below)
  95. std::basic_string<wchar_t> generated;
  96. std::back_insert_iterator<std::basic_string<wchar_t> > outit(generated);
  97. boost::variant<int, char> v(10);
  98. bool result = karma::generate_delimited(outit
  99. , karma::int_ | karma::char_, karma::char_(' '), v);
  100. BOOST_TEST(result && generated == L"10 ");
  101. }
  102. {
  103. boost::optional<int> v;
  104. BOOST_TEST(test("error", int_ | "error" << omit[-int_], v));
  105. BOOST_TEST(!test("error", int_ | "error" << omit[int_], v));
  106. BOOST_TEST(test("error", int_ | "error" << skip[int_], v));
  107. v = 1;
  108. BOOST_TEST(test("1", int_ | "error" << omit[-int_], v));
  109. BOOST_TEST(test("1", int_ | "error" << omit[int_], v));
  110. BOOST_TEST(test("1", int_ | "error" << skip[int_], v));
  111. }
  112. {
  113. typedef spirit_test::output_iterator<char>::type outiter_type;
  114. namespace karma = boost::spirit::karma;
  115. karma::rule<outiter_type, int()> r = int_;
  116. std::vector<int> v;
  117. BOOST_TEST(test("", '>' << r % ',' | karma::eps, v));
  118. v.push_back(1);
  119. v.push_back(2);
  120. v.push_back(3);
  121. v.push_back(4);
  122. BOOST_TEST(test(">1,2,3,4", '>' << r % ',' | karma::eps, v));
  123. }
  124. {
  125. typedef spirit_test::output_iterator<char>::type outiter_type;
  126. namespace karma = boost::spirit::karma;
  127. karma::rule<outiter_type, boost::optional<int>()> r = int_;
  128. boost::optional<int> o;
  129. BOOST_TEST(test("error", r | "error", o));
  130. o = 10;
  131. BOOST_TEST(test("10", r | "error", o));
  132. }
  133. return boost::report_errors();
  134. }