utree2.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. // Copyright (c) 2001-2011 Hartmut Kaiser
  2. // Copyright (c) 2001-2011 Joel de Guzman
  3. // Copyright (c) 2010 Bryce Lelbach
  4. //
  5. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  6. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  7. #include <boost/config/warning_disable.hpp>
  8. #include <boost/detail/lightweight_test.hpp>
  9. #include <boost/mpl/print.hpp>
  10. #include <boost/spirit/include/karma.hpp>
  11. #include <boost/spirit/include/support_utree.hpp>
  12. #include <sstream>
  13. #include "test.hpp"
  14. int main()
  15. {
  16. using spirit_test::test;
  17. using spirit_test::test_delimited;
  18. using boost::spirit::utree;
  19. using boost::spirit::utree_type;
  20. using boost::spirit::utf8_string_range_type;
  21. using boost::spirit::utf8_string_type;
  22. using boost::spirit::utf8_symbol_type;
  23. using boost::spirit::karma::char_;
  24. using boost::spirit::karma::bool_;
  25. using boost::spirit::karma::int_;
  26. using boost::spirit::karma::double_;
  27. using boost::spirit::karma::string;
  28. using boost::spirit::karma::space;
  29. using boost::spirit::karma::rule;
  30. typedef spirit_test::output_iterator<char>::type output_iterator;
  31. // kleene star
  32. {
  33. utree ut;
  34. ut.push_back('a');
  35. ut.push_back('b');
  36. BOOST_TEST(test("ab", *char_, ut));
  37. ut.clear();
  38. ut.push_back(123);
  39. ut.push_back(456);
  40. BOOST_TEST(test_delimited("123 456 ", *int_, ut, space));
  41. ut.clear();
  42. ut.push_back(1.23);
  43. ut.push_back(4.56);
  44. BOOST_TEST(test_delimited("1.23 4.56 ", *double_, ut, space));
  45. }
  46. // lists
  47. {
  48. rule<output_iterator, utree()> r1, r1ref;
  49. rule<output_iterator, utf8_string_range_type()> r1str;
  50. rule<output_iterator, utree::const_range()> r1list;
  51. r1 = double_ | int_ | r1str | r1list | r1ref;
  52. r1ref = r1.alias();
  53. r1str = string;
  54. r1list = '(' << -(r1 % ',') << ')';
  55. // ( "abc" "def" )
  56. utree ut;
  57. ut.push_back("abc");
  58. ut.push_back("def");
  59. BOOST_TEST(test("abc,def", string % ',', ut));
  60. BOOST_TEST(test("(abc,def)", r1, ut));
  61. // ( ( "abc" "def" ) )
  62. utree ut1;
  63. ut1.push_back(ut);
  64. BOOST_TEST(test("((abc,def))", r1, ut1));
  65. // rule<output_iterator, std::vector<char>()> r2 = char_ % ',';
  66. // BOOST_TEST(test("abc,def", r2, ut));
  67. // BOOST_TEST(test("abc,def", r2, ut1));
  68. // ( ( "abc" "def" ) ( "abc" "def" ) )
  69. ut1.push_back(ut);
  70. BOOST_TEST(test("(abc,def) (abc,def)", r1 << ' ' << r1, ut1));
  71. // ( 123 456 )
  72. ut.clear();
  73. ut.push_back(123);
  74. ut.push_back(456);
  75. BOOST_TEST(test("123,456", int_ % ',', ut));
  76. BOOST_TEST(test("(123,456)", r1, ut));
  77. // ( ( 123 456 ) )
  78. ut1.clear();
  79. ut1.push_back(ut);
  80. BOOST_TEST(test("((123,456))", r1, ut1));
  81. // rule<output_iterator, std::vector<int>()> r4 = int_ % ',';
  82. // BOOST_TEST(test("123,456", r4, ut));
  83. // BOOST_TEST(test("123,456", r4, ut1));
  84. // ( ( 123 456 ) ( 123 456 ) )
  85. ut1.push_back(ut);
  86. BOOST_TEST(test("(123,456) (123,456)", r1 << ' ' << r1, ut1));
  87. // ( 1.23 4.56 )
  88. ut.clear();
  89. ut.push_back(1.23);
  90. ut.push_back(4.56);
  91. BOOST_TEST(test("1.23,4.56", double_ % ',', ut));
  92. BOOST_TEST(test("(1.23,4.56)", r1, ut));
  93. // ( ( 1.23 4.56 ) )
  94. ut1.clear();
  95. ut1.push_back(ut);
  96. BOOST_TEST(test("((1.23,4.56))", r1, ut1));
  97. // rule<output_iterator, std::vector<double>()> r6 = double_ % ',';
  98. // BOOST_TEST(test("1.23,4.56", r6, ut));
  99. // BOOST_TEST(test("1.23,4.56", r6, ut1));
  100. // ( ( 1.23 4.56 ) ( 1.23 4.56 ) )
  101. ut1.push_back(ut);
  102. BOOST_TEST(test("(1.23,4.56) (1.23,4.56)", r1 <<' ' << r1, ut1));
  103. }
  104. // alternatives
  105. {
  106. rule<output_iterator, utree()> r1 = int_ | double_;
  107. utree ut(10);
  108. BOOST_TEST(test("10", int_ | double_, ut));
  109. BOOST_TEST(test("10", r1, ut));
  110. ut = 10.2;
  111. BOOST_TEST(test("10.2", int_ | double_, ut));
  112. BOOST_TEST(test("10.2", r1, ut));
  113. }
  114. // optionals
  115. {
  116. utree ut('x');
  117. BOOST_TEST(test("x", -char_, ut));
  118. ut.clear();
  119. BOOST_TEST(test("", -char_, ut));
  120. }
  121. return boost::report_errors();
  122. }