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