1/*=============================================================================
2 Copyright (c) 2001-2010 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 <boost/spirit/include/qi_symbols.hpp>
8
9#include <boost/spirit/include/qi_string.hpp>
10#include <boost/spirit/include/qi_char.hpp>
11#include <boost/spirit/include/qi_action.hpp>
12#include <boost/spirit/include/qi_auxiliary.hpp>
13#include <boost/spirit/include/qi_directive.hpp>
14#include <boost/spirit/include/qi_operator.hpp>
15#include <boost/spirit/include/qi_nonterminal.hpp>
16#include <boost/spirit/include/support_argument.hpp>
17#include <boost/phoenix/core.hpp>
18#include <boost/phoenix/operator.hpp>
19
20#include <boost/core/lightweight_test_trait.hpp>
21
22#include <iostream>
23#include "test.hpp"
24
25// Custom string type with a C-style string conversion.
26struct custom_string_c
27{
28 custom_string_c(char c) { str[0] = c; str[1] = '\0'; }
29
30 operator char*() { return str; }
31 operator char const*() const { return str; }
32
33private:
34 char str[2];
35};
36
37int
38main()
39{
40 using spirit_test::test;
41 using spirit_test::test_attr;
42 using boost::spirit::qi::symbols;
43 using boost::spirit::qi::rule;
44 using boost::spirit::qi::lazy;
45 using boost::spirit::qi::_r1;
46
47 { // basics
48 symbols<char, int> sym;
49
50 sym.add
51 ("Joel")
52 ("Ruby")
53 ("Tenji")
54 ("Tutit")
55 ("Kim")
56 ("Joey")
57 ("Joeyboy")
58 ;
59
60 BOOST_TEST_TRAIT_TRUE((boost::spirit::traits::is_parser<symbols<char, int> >));
61
62 BOOST_TEST((test("Joel", sym)));
63 BOOST_TEST((test("Ruby", sym)));
64 BOOST_TEST((test("Tenji", sym)));
65 BOOST_TEST((test("Tutit", sym)));
66 BOOST_TEST((test("Kim", sym)));
67 BOOST_TEST((test("Joey", sym)));
68 BOOST_TEST((test("Joeyboy", sym)));
69 BOOST_TEST((!test("XXX", sym)));
70
71 // test copy
72 symbols<char, int> sym2;
73 sym2 = sym;
74 BOOST_TEST((test("Joel", sym2)));
75 BOOST_TEST((test("Ruby", sym2)));
76 BOOST_TEST((test("Tenji", sym2)));
77 BOOST_TEST((test("Tutit", sym2)));
78 BOOST_TEST((test("Kim", sym2)));
79 BOOST_TEST((test("Joey", sym2)));
80 BOOST_TEST((!test("XXX", sym2)));
81
82 // make sure it plays well with other parsers
83 BOOST_TEST((test("Joelyo", sym >> "yo")));
84
85 sym.remove
86 ("Joel")
87 ("Ruby")
88 ;
89
90 BOOST_TEST((!test("Joel", sym)));
91 BOOST_TEST((!test("Ruby", sym)));
92 }
93
94 { // comma syntax
95 symbols<char, int> sym;
96 sym += "Joel", "Ruby", "Tenji", "Tutit", "Kim", "Joey";
97
98 BOOST_TEST((test("Joel", sym)));
99 BOOST_TEST((test("Ruby", sym)));
100 BOOST_TEST((test("Tenji", sym)));
101 BOOST_TEST((test("Tutit", sym)));
102 BOOST_TEST((test("Kim", sym)));
103 BOOST_TEST((test("Joey", sym)));
104 BOOST_TEST((!test("XXX", sym)));
105
106 sym -= "Joel", "Ruby";
107
108 BOOST_TEST((!test("Joel", sym)));
109 BOOST_TEST((!test("Ruby", sym)));
110 }
111
112 { // no-case handling
113 using namespace boost::spirit::ascii;
114
115 symbols<char, int> sym;
116 // NOTE: make sure all entries are in lower-case!!!
117 sym = "joel", "ruby", "tenji", "tutit", "kim", "joey";
118
119 BOOST_TEST((test("joel", no_case[sym])));
120 BOOST_TEST((test("ruby", no_case[sym])));
121 BOOST_TEST((test("tenji", no_case[sym])));
122 BOOST_TEST((test("tutit", no_case[sym])));
123 BOOST_TEST((test("kim", no_case[sym])));
124 BOOST_TEST((test("joey", no_case[sym])));
125
126 BOOST_TEST((test("JOEL", no_case[sym])));
127 BOOST_TEST((test("RUBY", no_case[sym])));
128 BOOST_TEST((test("TENJI", no_case[sym])));
129 BOOST_TEST((test("TUTIT", no_case[sym])));
130 BOOST_TEST((test("KIM", no_case[sym])));
131 BOOST_TEST((test("JOEY", no_case[sym])));
132
133 // make sure it plays well with other parsers
134 BOOST_TEST((test("Joelyo", no_case[sym] >> "yo")));
135 }
136
137 { // attributes
138 symbols<char, int> sym;
139
140 sym.add
141 ("Joel", 1)
142 ("Ruby", 2)
143 ("Tenji", 3)
144 ("Tutit", 4)
145 ("Kim", 5)
146 ("Joey", 6)
147 ("Joeyboy", 7)
148 ;
149
150 int i;
151 BOOST_TEST((test_attr("Joel", sym, i)));
152 BOOST_TEST(i == 1);
153 BOOST_TEST((test_attr("Ruby", sym, i)));
154 BOOST_TEST(i == 2);
155 BOOST_TEST((test_attr("Tenji", sym, i)));
156 BOOST_TEST(i == 3);
157 BOOST_TEST((test_attr("Tutit", sym, i)));
158 BOOST_TEST(i == 4);
159 BOOST_TEST((test_attr("Kim", sym, i)));
160 BOOST_TEST(i == 5);
161 BOOST_TEST((test_attr("Joey", sym, i)));
162 BOOST_TEST(i == 6);
163 BOOST_TEST((test_attr("Joeyboy", sym, i)));
164 BOOST_TEST(i == 7);
165 BOOST_TEST((!test_attr("XXX", sym, i)));
166
167 // double add:
168
169 sym.add("Joel", 265);
170 BOOST_TEST((test_attr("Joel", sym, i)));
171 BOOST_TEST(i == 1);
172 }
173
174 { // actions
175 namespace phx = boost::phoenix;
176 using boost::spirit::_1;
177
178 symbols<char, int> sym;
179 sym.add
180 ("Joel", 1)
181 ("Ruby", 2)
182 ("Tenji", 3)
183 ("Tutit", 4)
184 ("Kim", 5)
185 ("Joey", 6)
186 ;
187
188 int i;
189 BOOST_TEST((test("Joel", sym[phx::ref(i) = _1])));
190 BOOST_TEST(i == 1);
191 BOOST_TEST((test("Ruby", sym[phx::ref(i) = _1])));
192 BOOST_TEST(i == 2);
193 BOOST_TEST((test("Tenji", sym[phx::ref(i) = _1])));
194 BOOST_TEST(i == 3);
195 BOOST_TEST((test("Tutit", sym[phx::ref(i) = _1])));
196 BOOST_TEST(i == 4);
197 BOOST_TEST((test("Kim", sym[phx::ref(i) = _1])));
198 BOOST_TEST(i == 5);
199 BOOST_TEST((test("Joey", sym[phx::ref(i) = _1])));
200 BOOST_TEST(i == 6);
201 BOOST_TEST((!test("XXX", sym[phx::ref(i) = _1])));
202 }
203
204 return boost::report_errors();
205}
206

source code of boost/libs/spirit/test/qi/symbols1.cpp