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 
6 #include <string>
7 #include <vector>
8 #include <set>
9 #include <map>
10 
11 #include <boost/detail/lightweight_test.hpp>
12 
13 #include <boost/spirit/include/qi_operator.hpp>
14 #include <boost/spirit/include/qi_char.hpp>
15 #include <boost/spirit/include/qi_string.hpp>
16 #include <boost/spirit/include/qi_numeric.hpp>
17 #include <boost/spirit/include/qi_directive.hpp>
18 #include <boost/spirit/include/qi_action.hpp>
19 #include <boost/spirit/include/qi_auxiliary.hpp>
20 #include <boost/spirit/include/support_argument.hpp>
21 #include <boost/spirit/include/phoenix_core.hpp>
22 #include <boost/spirit/include/phoenix_operator.hpp>
23 #include <boost/spirit/include/phoenix_object.hpp>
24 #include <boost/spirit/include/phoenix_stl.hpp>
25 #include <boost/fusion/include/std_pair.hpp>
26 
27 #include <string>
28 #include <iostream>
29 #include "test.hpp"
30 
31 using namespace spirit_test;
32 
compare(std::vector<char> const & v,std::string const & s)33 inline bool compare(std::vector<char> const& v, std::string const& s)
34 {
35     return v.size() == s.size() && std::equal(v.begin(), v.end(), s.begin());
36 }
37 
main()38 int main()
39 {
40     using boost::spirit::qi::char_;
41     using boost::spirit::qi::omit;
42 
43     {
44         std::vector<char> v;
45         BOOST_TEST(test_attr("a,b,c,d,e,f,g,h", char_ % ',', v) &&
46             compare(v, "abcdefgh"));
47 
48         std::string s;
49         BOOST_TEST(test_attr("a,b,c,d,e,f,g,h", char_ % ',', s) &&
50             s == "abcdefgh");
51 
52         BOOST_TEST(test("a,b,c,d,e,f,g,h", char_ % ','));
53         BOOST_TEST(test("a,b,c,d,e,f,g,h", omit[char_] % ','));
54     }
55 
56     {
57         std::vector<char> v1;
58         BOOST_TEST(test_attr("ab,cd,ef,gh", (char_ >> char_) % ',', v1) &&
59             compare(v1, "abcdefgh"));
60         v1.clear();
61         BOOST_TEST(test_attr("ab,cd,ef,gh", (char_ >> omit[char_]) % ',', v1) &&
62             compare(v1, "aceg"));
63 
64         std::string s;
65         BOOST_TEST(test_attr("ab,cd,ef,gh", (char_ >> char_) % ',', s) &&
66             s == "abcdefgh");
67         s.clear();
68         BOOST_TEST(test_attr("ab,cd,ef,gh", (char_ >> omit[char_]) % ',', s) &&
69             s == "aceg");
70 
71         std::vector<std::pair<char, char> > v2;
72         BOOST_TEST(test_attr("ab,cd,ef,gh", (char_ >> char_) % ',', v2) &&
73             v2.size() == 4 &&
74             v2[0] == std::make_pair('a', 'b') &&
75             v2[1] == std::make_pair('c', 'd') &&
76             v2[2] == std::make_pair('e', 'f') &&
77             v2[3] == std::make_pair('g', 'h'));
78 
79         s.clear();
80         BOOST_TEST(test_attr("ab,cd,efg", (char_ >> char_) % ',' >> char_, s) &&
81             s == "abcdefg");
82 
83         BOOST_TEST(test("ab,cd,ef,gh", (char_ >> char_) % ','));
84         BOOST_TEST(test("ab,cd,ef,gh", (omit[char_ >> char_]) % ','));
85     }
86 
87     {
88         std::vector<char> v1;
89         BOOST_TEST(test_attr("abc,def,gh", (char_ >> *~char_(',')) % ',', v1) &&
90             compare(v1, "abcdefgh"));
91         v1.clear();
92         BOOST_TEST(test_attr("abc,def,gh", (char_ >> omit[*~char_(',')]) % ',', v1) &&
93             compare(v1, "adg"));
94         v1.clear();
95         BOOST_TEST(test_attr("abc,def,gh", (omit[char_] >> *~char_(',')) % ',', v1) &&
96             compare(v1, "bcefh"));
97 
98         std::string s1;
99         BOOST_TEST(test_attr("abc,def,gh", (char_ >> *~char_(',')) % ',', s1) &&
100             s1 == "abcdefgh");
101         s1.clear();
102         BOOST_TEST(test_attr("abc,def,gh", (char_ >> omit[*~char_(',')]) % ',', s1) &&
103             s1 == "adg");
104         s1.clear();
105         BOOST_TEST(test_attr("abc,def,gh", (omit[char_] >> *~char_(',')) % ',', s1) &&
106             s1 == "bcefh");
107 
108         std::vector<std::pair<char, std::vector<char> > > v2;
109         BOOST_TEST(test_attr("abc,def,gh", (char_ >> *~char_(',')) % ',', v2) &&
110             v2.size() == 3 &&
111             v2[0].first == 'a' && compare(v2[0].second, "bc") &&
112             v2[1].first == 'd' && compare(v2[1].second, "ef") &&
113             v2[2].first == 'g' && compare(v2[2].second, "h"));
114 
115         std::vector<std::vector<char> > v3;
116         BOOST_TEST(test_attr("abc,def,gh", (omit[char_] >> *~char_(',')) % ',', v3) &&
117             v3.size() == 3 &&
118             compare(v3[0], "bc") && compare(v3[1], "ef") &&
119             compare(v3[2], "h"));
120 
121         std::vector<char> v4;
122         BOOST_TEST(test_attr("abc,def,gh", (char_ >> omit[*~char_(',')]) % ',', v4) &&
123             v4.size() == 3 &&
124             v4[0] == 'a' &&  v4[1] == 'd' && v4[2] == 'g');
125 
126         std::vector<std::string> v5;
127         BOOST_TEST(test_attr("abc,def,gh", (omit[char_] >> *~char_(',')) % ',', v5) &&
128             v5.size() == 3 &&
129             v5[0] == "bc" && v5[1] == "ef" && v5[2] == "h");
130 
131         std::string s2;
132         BOOST_TEST(test_attr("abc,def,gh", (char_ >> omit[*~char_(',')]) % ',', s2) &&
133             s2.size() == 3 &&
134             s2 == "adg");
135 
136         BOOST_TEST(test("abc,def,gh", (char_ >> *~char_(',')) % ','));
137         BOOST_TEST(test("abc,def,gh", (omit[char_ >> *~char_(',')]) % ','));
138     }
139 
140     {
141         using boost::spirit::qi::alpha;
142         using boost::spirit::qi::digit;
143 
144         std::vector<char> v1;
145         BOOST_TEST(test_attr("ab12,cd34,ef56", (*alpha >> *digit) % ',', v1) &&
146             compare(v1, "ab12cd34ef56"));
147         v1.clear();
148         BOOST_TEST(test_attr("ab12,cd34,ef56", (omit[*alpha] >> *digit) % ',', v1) &&
149             compare(v1, "123456"));
150         v1.clear();
151         BOOST_TEST(test_attr("ab12,cd34,ef56", (*alpha >> omit[*digit]) % ',', v1) &&
152             compare(v1, "abcdef"));
153 
154         std::string s1;
155         BOOST_TEST(test_attr("ab12,cd34,ef56", (*alpha >> *digit) % ',', s1) &&
156             s1 == "ab12cd34ef56");
157         s1.clear();
158         BOOST_TEST(test_attr("ab12,cd34,ef56", (omit[*alpha] >> *digit) % ',', s1) &&
159             s1 == "123456");
160         s1.clear();
161         BOOST_TEST(test_attr("ab12,cd34,ef56", (*alpha >> omit[*digit]) % ',', s1) &&
162             s1 == "abcdef");
163 
164         std::vector<std::pair<std::vector<char>, std::vector<char> > > v2;
165         BOOST_TEST(test_attr("ab12,cd34,ef56", (*alpha >> *digit) % ',', v2) &&
166             v2.size() == 3 &&
167             compare(v2[0].first, "ab") && compare(v2[0].second, "12") &&
168             compare(v2[1].first, "cd") && compare(v2[1].second, "34") &&
169             compare(v2[2].first, "ef") && compare(v2[2].second, "56"));
170 
171         std::vector<std::pair<std::string, std::string> > v3;
172         BOOST_TEST(test_attr("ab12,cd34,ef56", (*alpha >> *digit) % ',', v3) &&
173             v3.size() == 3 &&
174             v3[0].first == "ab" && v3[0].second == "12" &&
175             v3[1].first == "cd" && v3[1].second == "34" &&
176             v3[2].first == "ef" && v3[2].second == "56");
177 
178         std::vector<std::vector<char> > v4;
179         BOOST_TEST(test_attr("ab12,cd34,ef56", (omit[*alpha] >> *digit) % ',', v4) &&
180             v4.size() == 3 &&
181             compare(v4[0], "12") &&
182             compare(v4[1], "34") &&
183             compare(v4[2], "56"));
184 
185         BOOST_TEST(test("ab12,cd34,ef56", (*alpha >> *digit) % ','));
186         BOOST_TEST(test("ab12,cd34,ef56", omit[*alpha >> *digit] % ','));
187     }
188 
189     return boost::report_errors();
190 }
191 
192