pattern3.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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_operator.hpp>
  8. #include <boost/spirit/include/karma_char.hpp>
  9. #include <boost/spirit/include/karma_auxiliary.hpp>
  10. #include <boost/spirit/include/karma_string.hpp>
  11. #include <boost/spirit/include/karma_numeric.hpp>
  12. #include <boost/spirit/include/karma_nonterminal.hpp>
  13. #include <boost/spirit/include/karma_action.hpp>
  14. #include <boost/spirit/include/phoenix_core.hpp>
  15. #include <boost/spirit/include/phoenix_operator.hpp>
  16. #include "test.hpp"
  17. using namespace spirit_test;
  18. ///////////////////////////////////////////////////////////////////////////////
  19. int main()
  20. {
  21. using namespace boost;
  22. using namespace boost::spirit;
  23. using namespace boost::spirit::ascii;
  24. typedef spirit_test::output_iterator<char>::type outiter_type;
  25. // basic tests
  26. {
  27. karma::rule<outiter_type> start;
  28. start = char_[_1 = 'a'] << int_[_1 = 10] << double_[_1 = 12.4];
  29. BOOST_TEST(test("a1012.4", start));
  30. start = (char_ << int_ << double_)[_1 = 'a', _2 = 10, _3 = 12.4];
  31. BOOST_TEST(test("a1012.4", start));
  32. karma::rule<outiter_type> a, b, c;
  33. a = char_[_1 = 'a'];
  34. b = int_[_1 = 10];
  35. c = double_[_1 = 12.4];
  36. start = a << b << c;
  37. BOOST_TEST(test("a1012.4", start));
  38. }
  39. // basic tests with delimiter
  40. {
  41. karma::rule<outiter_type, space_type> start;
  42. start = char_[_1 = 'a'] << int_[_1 = 10] << double_[_1 = 12.4];
  43. BOOST_TEST(test_delimited("a 10 12.4 ", start, space));
  44. start = (char_ << int_ << double_)[_1 = 'a', _2 = 10, _3 = 12.4];
  45. BOOST_TEST(test_delimited("a 10 12.4 ", start, space));
  46. karma::rule<outiter_type, space_type> a, b, c;
  47. a = char_[_1 = 'a'];
  48. b = int_[_1 = 10];
  49. c = double_[_1 = 12.4];
  50. start = a << b << c;
  51. BOOST_TEST(test_delimited("a 10 12.4 ", start, space));
  52. }
  53. // basic tests involving a direct parameter
  54. {
  55. typedef variant<char, int, double> var_type;
  56. karma::rule<outiter_type, var_type()> start;
  57. start = (char_ | int_ | double_)[_1 = _r0];
  58. var_type v ('a');
  59. BOOST_TEST(test("a", start, v));
  60. v = 10;
  61. BOOST_TEST(test("10", start, v));
  62. v = 12.4;
  63. BOOST_TEST(test("12.4", start, v));
  64. }
  65. {
  66. typedef variant<char, int, double> var_type;
  67. karma::rule<outiter_type, space_type, var_type()> start;
  68. start = (char_ | int_ | double_)[_1 = _r0];
  69. var_type v ('a');
  70. BOOST_TEST(test_delimited("a ", start, v, space));
  71. v = 10;
  72. BOOST_TEST(test_delimited("10 ", start, v, space));
  73. v = 12.4;
  74. BOOST_TEST(test_delimited("12.4 ", start, v, space));
  75. }
  76. // test handling of single element fusion sequences
  77. {
  78. using boost::fusion::vector;
  79. karma::rule<outiter_type, vector<int>()> r = int_;
  80. vector<int> v(1);
  81. BOOST_TEST(test("1", r, v));
  82. }
  83. {
  84. using boost::fusion::vector;
  85. karma::rule<outiter_type, space_type, vector<int>()> r = int_;
  86. vector<int> v(1);
  87. BOOST_TEST(test_delimited("1 ", r, v, space));
  88. }
  89. return boost::report_errors();
  90. }