sequential_or.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /*=============================================================================
  2. Copyright (c) 2001-2011 Joel de Guzman
  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. =============================================================================*/
  6. #include <boost/detail/lightweight_test.hpp>
  7. #include <boost/spirit/include/qi_operator.hpp>
  8. #include <boost/spirit/include/qi_char.hpp>
  9. #include <boost/spirit/include/qi_string.hpp>
  10. #include <boost/spirit/include/qi_numeric.hpp>
  11. #include <boost/spirit/include/qi_action.hpp>
  12. #include <boost/spirit/include/support_argument.hpp>
  13. #include <boost/fusion/include/vector.hpp>
  14. #include <boost/fusion/include/at.hpp>
  15. #include <boost/spirit/include/phoenix_core.hpp>
  16. #include <boost/spirit/include/phoenix_operator.hpp>
  17. #include <boost/optional.hpp>
  18. #include <string>
  19. #include <iostream>
  20. #include "test.hpp"
  21. int
  22. main()
  23. {
  24. using spirit_test::test;
  25. using spirit_test::test_attr;
  26. using boost::spirit::qi::int_;
  27. using boost::spirit::qi::_1;
  28. using boost::spirit::qi::_2;
  29. using boost::spirit::ascii::char_;
  30. using boost::spirit::ascii::alpha;
  31. using boost::fusion::vector;
  32. using boost::fusion::at_c;
  33. using boost::optional;
  34. {
  35. BOOST_TEST((test("a", char_('a') || char_('b'))));
  36. BOOST_TEST((test("b", char_('a') || char_('b'))));
  37. BOOST_TEST((test("ab", char_('a') || char_('b'))));
  38. }
  39. {
  40. vector<optional<int>, optional<char> > attr;
  41. BOOST_TEST((test_attr("a", int_ || alpha, attr)));
  42. BOOST_TEST((!at_c<0>(attr)));
  43. BOOST_TEST((at_c<1>(attr).get() == 'a'));
  44. at_c<1>(attr) = optional<char>(); // clear the optional
  45. BOOST_TEST((test_attr("123", int_ || alpha, attr)));
  46. BOOST_TEST((at_c<0>(attr).get() == 123));
  47. BOOST_TEST((!at_c<1>(attr)));
  48. at_c<0>(attr) = optional<int>(); // clear the optional
  49. BOOST_TEST((test_attr("123a", int_ || alpha, attr)));
  50. BOOST_TEST((at_c<0>(attr).get() == 123));
  51. BOOST_TEST((at_c<1>(attr).get() == 'a'));
  52. BOOST_TEST((!test("a123", int_ || alpha)));
  53. }
  54. { // test whether optional<optional<>> gets properly handled
  55. vector<optional<int>, optional<int> > attr1;
  56. BOOST_TEST((test_attr("123", int_ || '[' >> -int_ >> ']', attr1)));
  57. BOOST_TEST((at_c<0>(attr1) && at_c<0>(attr1).get() == 123));
  58. BOOST_TEST((!at_c<1>(attr1)));
  59. vector<optional<int>, optional<int> > attr2;
  60. BOOST_TEST((test_attr("[123]", int_ || '[' >> -int_ >> ']', attr2)));
  61. BOOST_TEST((!at_c<0>(attr2)));
  62. BOOST_TEST((at_c<1>(attr2) && at_c<1>(attr2).get() == 123));
  63. vector<optional<int>, optional<optional<int> > > attr3;
  64. BOOST_TEST((test_attr("[]", int_ || '[' >> -int_ >> ']', attr3)));
  65. BOOST_TEST((!at_c<0>(attr3)));
  66. BOOST_TEST((at_c<1>(attr3) && !at_c<1>(attr3).get()));
  67. }
  68. { // test unused attribute handling
  69. vector<optional<int>, optional<char> > attr;
  70. BOOST_TEST((test_attr("123abc", int_ || ("ab" >> char_), attr)));
  71. BOOST_TEST((at_c<0>(attr).get() == 123));
  72. BOOST_TEST((at_c<1>(attr).get() == 'c'));
  73. }
  74. { // test unused attribute handling
  75. optional<int> attr;
  76. BOOST_TEST((test_attr("123ab", int_ || "ab", attr)));
  77. BOOST_TEST((attr == 123));
  78. }
  79. { // test action
  80. namespace phx = boost::phoenix;
  81. optional<int> i;
  82. optional<char> c;
  83. BOOST_TEST((test("123a", (int_ || alpha)[phx::ref(i) = _1, phx::ref(c) = _2])));
  84. BOOST_TEST((i.get() == 123));
  85. BOOST_TEST((c.get() == 'a'));
  86. }
  87. return boost::report_errors();
  88. }