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

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