utree1.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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. // primitive data types
  32. {
  33. utree ut('x');
  34. BOOST_TEST(test("x", char_, ut));
  35. ut = false;
  36. BOOST_TEST(test("false", bool_, ut));
  37. ut = 123;
  38. BOOST_TEST(test("123", int_, ut));
  39. ut = 123.45;
  40. BOOST_TEST(test("123.45", double_, ut));
  41. ut = "abc";
  42. BOOST_TEST(test("abc", string, ut));
  43. ut = utf8_symbol_type("xyz");
  44. BOOST_TEST(test("xyz", string, ut));
  45. }
  46. // sequences
  47. {
  48. using boost::spirit::karma::digit;
  49. using boost::spirit::karma::repeat;
  50. utree ut;
  51. ut.push_back('x');
  52. ut.push_back('y');
  53. BOOST_TEST(test("xy", char_ << char_, ut));
  54. ut.clear();
  55. ut.push_back(123);
  56. ut.push_back(456);
  57. BOOST_TEST(test_delimited("123 456 ", int_ << int_, ut, space));
  58. ut.clear();
  59. ut.push_back(1.23);
  60. ut.push_back(4.56);
  61. BOOST_TEST(test_delimited("1.23 4.56 ", double_ << double_, ut, space));
  62. ut.clear();
  63. ut.push_back(1.23);
  64. ut.push_back("ab");
  65. BOOST_TEST(test("1.23ab", double_ << string, ut));
  66. ut.clear();
  67. rule<output_iterator, double()> r1 = double_;
  68. rule<output_iterator, utree()> r2 = double_;
  69. // ( 1.23 "a" "b" )
  70. ut.push_back(1.23);
  71. ut.push_back('a');
  72. ut.push_back('b');
  73. BOOST_TEST(test("1.23ab", double_ << *char_, ut));
  74. BOOST_TEST(test("1.23ab", r1 << *char_, ut));
  75. BOOST_TEST(test("1.23ab", r2 << *char_, ut));
  76. // ( ( 1.23 ) "a" "b" )
  77. ut.clear();
  78. utree ut1;
  79. ut1.push_back(1.23);
  80. ut.push_back(ut1);
  81. ut.push_back('a');
  82. ut.push_back('b');
  83. BOOST_TEST(test("1.23ab", r1 << *char_, ut));
  84. BOOST_TEST(test("1.23ab", r2 << *char_, ut));
  85. // ( "a" "b" 1.23 )
  86. ut.clear();
  87. ut.push_back('a');
  88. ut.push_back('b');
  89. ut.push_back(1.23);
  90. BOOST_TEST(test("ab1.23", repeat(2)[~digit] << double_, ut));
  91. BOOST_TEST(test("ab1.23", repeat(2)[~digit] << r1, ut));
  92. BOOST_TEST(test("ab1.23", repeat(2)[~digit] << r2, ut));
  93. // ( "a" "b" ( 1.23 ) )
  94. ut.clear();
  95. ut.push_back('a');
  96. ut.push_back('b');
  97. ut.push_back(ut1);
  98. BOOST_TEST(test("ab1.23", repeat(2)[~digit] << r1, ut));
  99. BOOST_TEST(test("ab1.23", repeat(2)[~digit] << r2, ut));
  100. }
  101. return boost::report_errors();
  102. }