list.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /*=============================================================================
  2. Copyright (c) 2001-2013 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 <string>
  7. #include <vector>
  8. #include <set>
  9. #include <map>
  10. #include <boost/detail/lightweight_test.hpp>
  11. #include <boost/spirit/home/x3.hpp>
  12. #include <string>
  13. #include <iostream>
  14. #include "test.hpp"
  15. #include "utils.hpp"
  16. using namespace spirit_test;
  17. int
  18. main()
  19. {
  20. using namespace boost::spirit::x3::ascii;
  21. {
  22. BOOST_TEST(test("a,b,c,d,e,f,g,h", char_ % ','));
  23. BOOST_TEST(test("a,b,c,d,e,f,g,h,", char_ % ',', false));
  24. }
  25. {
  26. BOOST_TEST(test("a, b, c, d, e, f, g, h", char_ % ',', space));
  27. BOOST_TEST(test("a, b, c, d, e, f, g, h,", char_ % ',', space, false));
  28. }
  29. {
  30. std::string s;
  31. BOOST_TEST(test_attr("a,b,c,d,e,f,g,h", char_ % ',', s));
  32. BOOST_TEST(s == "abcdefgh");
  33. BOOST_TEST(!test("a,b,c,d,e,f,g,h,", char_ % ','));
  34. }
  35. {
  36. std::string s;
  37. BOOST_TEST(test_attr("ab,cd,ef,gh", (char_ >> char_) % ',', s));
  38. BOOST_TEST(s == "abcdefgh");
  39. BOOST_TEST(!test("ab,cd,ef,gh,", (char_ >> char_) % ','));
  40. BOOST_TEST(!test("ab,cd,ef,g", (char_ >> char_) % ','));
  41. s.clear();
  42. BOOST_TEST(test_attr("ab,cd,efg", (char_ >> char_) % ',' >> char_, s));
  43. BOOST_TEST(s == "abcdefg");
  44. }
  45. {
  46. using boost::spirit::x3::int_;
  47. std::vector<int> v;
  48. BOOST_TEST(test_attr("1,2", int_ % ',', v));
  49. BOOST_TEST(2 == v.size() && 1 == v[0] && 2 == v[1]);
  50. }
  51. {
  52. using boost::spirit::x3::int_;
  53. std::vector<int> v;
  54. BOOST_TEST(test_attr("(1,2)", '(' >> int_ % ',' >> ')', v));
  55. BOOST_TEST(2 == v.size() && 1 == v[0] && 2 == v[1]);
  56. }
  57. {
  58. std::vector<std::string> v;
  59. BOOST_TEST(test_attr("a,b,c,d", +alpha % ',', v));
  60. BOOST_TEST(4 == v.size() && "a" == v[0] && "b" == v[1]
  61. && "c" == v[2] && "d" == v[3]);
  62. }
  63. {
  64. std::vector<boost::optional<char> > v;
  65. BOOST_TEST(test_attr("#a,#", ('#' >> -alpha) % ',', v));
  66. BOOST_TEST(2 == v.size() &&
  67. !!v[0] && 'a' == boost::get<char>(v[0]) && !v[1]);
  68. std::vector<char> v2;
  69. BOOST_TEST(test_attr("#a,#", ('#' >> -alpha) % ',', v2));
  70. BOOST_TEST(1 == v2.size() && 'a' == v2[0]);
  71. }
  72. { // actions
  73. using boost::spirit::x3::_attr;
  74. std::string s;
  75. auto f = [&](auto& ctx){ s = std::string(_attr(ctx).begin(), _attr(ctx).end()); };
  76. BOOST_TEST(test("a,b,c,d,e,f,g,h", (char_ % ',')[f]));
  77. BOOST_TEST(s == "abcdefgh");
  78. }
  79. { // test move only types
  80. std::vector<move_only> v;
  81. BOOST_TEST(test_attr("s.s.s.s", synth_move_only % '.', v));
  82. BOOST_TEST_EQ(v.size(), 4);
  83. }
  84. return boost::report_errors();
  85. }