1 /*=============================================================================
2     Copyright (c) 2001-2013 Joel de Guzman
3 
4     Distributed under the Boost Software License, Version 1.0. (See accompanying
5     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 =============================================================================*/
7 #include <string>
8 #include <vector>
9 #include <set>
10 #include <map>
11 
12 #include <boost/detail/lightweight_test.hpp>
13 #include <boost/spirit/home/x3.hpp>
14 
15 #include <string>
16 #include <iostream>
17 #include "test.hpp"
18 #include "utils.hpp"
19 
20 using namespace spirit_test;
21 
22 int
main()23 main()
24 {
25     using namespace boost::spirit::x3::ascii;
26 
27     BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(char_ % ',');
28 
29     {
30         BOOST_TEST(test("a,b,c,d,e,f,g,h", char_ % ','));
31         BOOST_TEST(test("a,b,c,d,e,f,g,h,", char_ % ',', false));
32     }
33 
34     {
35         BOOST_TEST(test("a, b, c, d, e, f, g, h", char_ % ',', space));
36         BOOST_TEST(test("a, b, c, d, e, f, g, h,", char_ % ',', space, false));
37     }
38 
39     {
40         std::string s;
41         BOOST_TEST(test_attr("a,b,c,d,e,f,g,h", char_ % ',', s));
42         BOOST_TEST(s == "abcdefgh");
43 
44         BOOST_TEST(!test("a,b,c,d,e,f,g,h,", char_ % ','));
45     }
46 
47     {
48         std::string s;
49         BOOST_TEST(test_attr("ab,cd,ef,gh", (char_ >> char_) % ',', s));
50         BOOST_TEST(s == "abcdefgh");
51 
52         BOOST_TEST(!test("ab,cd,ef,gh,", (char_ >> char_) % ','));
53         BOOST_TEST(!test("ab,cd,ef,g", (char_ >> char_) % ','));
54 
55         s.clear();
56         BOOST_TEST(test_attr("ab,cd,efg", (char_ >> char_) % ',' >> char_, s));
57         BOOST_TEST(s == "abcdefg");
58     }
59 
60     {
61         using boost::spirit::x3::int_;
62 
63         std::vector<int> v;
64         BOOST_TEST(test_attr("1,2", int_ % ',', v));
65         BOOST_TEST(2 == v.size() && 1 == v[0] && 2 == v[1]);
66     }
67 
68     {
69         using boost::spirit::x3::int_;
70 
71         std::vector<int> v;
72         BOOST_TEST(test_attr("(1,2)", '(' >> int_ % ',' >> ')', v));
73         BOOST_TEST(2 == v.size() && 1 == v[0] && 2 == v[1]);
74     }
75 
76     {
77         std::vector<std::string> v;
78         BOOST_TEST(test_attr("a,b,c,d", +alpha % ',', v));
79         BOOST_TEST(4 == v.size() && "a" == v[0] && "b" == v[1]
80             && "c" == v[2] && "d" == v[3]);
81     }
82 
83     {
84         std::vector<boost::optional<char> > v;
85         BOOST_TEST(test_attr("#a,#", ('#' >> -alpha) % ',', v));
86         BOOST_TEST(2 == v.size() &&
87             !!v[0] && 'a' == boost::get<char>(v[0]) && !v[1]);
88 
89         std::vector<char> v2;
90         BOOST_TEST(test_attr("#a,#", ('#' >> -alpha) % ',', v2));
91         BOOST_TEST(1 == v2.size() && 'a' == v2[0]);
92     }
93 
94     { // actions
95         using boost::spirit::x3::_attr;
96 
97         std::string s;
98         auto f = [&](auto& ctx){ s = std::string(_attr(ctx).begin(), _attr(ctx).end()); };
99 
100         BOOST_TEST(test("a,b,c,d,e,f,g,h", (char_ % ',')[f]));
101         BOOST_TEST(s == "abcdefgh");
102     }
103 
104     { // test move only types
105         std::vector<move_only> v;
106         BOOST_TEST(test_attr("s.s.s.s", synth_move_only % '.', v));
107         BOOST_TEST_EQ(v.size(), 4);
108     }
109 
110     return boost::report_errors();
111 }
112