]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | /*============================================================================= |
2 | Copyright (c) 2001-2015 Joel de Guzman | |
3 | Copyright (c) 2001-2010 Hartmut Kaiser | |
4 | ||
5 | Distributed under the Boost Software License, Version 1.0. (See accompanying | |
6 | file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
7 | =============================================================================*/ | |
8 | ||
7c673cae FG |
9 | #define BOOST_SPIRIT_X3_UNICODE |
10 | ||
11 | #include <boost/detail/lightweight_test.hpp> | |
12 | #include <boost/spirit/home/x3.hpp> | |
13 | #include <boost/type_traits/is_same.hpp> | |
14 | ||
15 | #include <iostream> | |
16 | #include "test.hpp" | |
17 | ||
18 | int | |
19 | main() | |
20 | { | |
21 | using spirit_test::test; | |
92f5a8d4 | 22 | using spirit_test::test_failure; |
7c673cae FG |
23 | using spirit_test::test_attr; |
24 | ||
25 | using boost::spirit::x3::unused_type; | |
26 | ||
27 | { | |
28 | using namespace boost::spirit::x3::ascii; | |
f67539c2 TL |
29 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(alnum); |
30 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(alpha); | |
31 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(digit); | |
32 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(xdigit); | |
33 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(cntrl); | |
34 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(graph); | |
35 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(lower); | |
36 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(print); | |
37 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(punct); | |
38 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(space); | |
39 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(blank); | |
40 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(upper); | |
7c673cae FG |
41 | BOOST_TEST(test("1", alnum)); |
42 | BOOST_TEST(!test(" ", alnum)); | |
43 | BOOST_TEST(!test("1", alpha)); | |
44 | BOOST_TEST(test("x", alpha)); | |
45 | BOOST_TEST(test(" ", blank)); | |
46 | BOOST_TEST(!test("x", blank)); | |
47 | BOOST_TEST(test("1", digit)); | |
48 | BOOST_TEST(!test("x", digit)); | |
49 | BOOST_TEST(test("a", lower)); | |
50 | BOOST_TEST(!test("A", lower)); | |
51 | BOOST_TEST(test("!", punct)); | |
52 | BOOST_TEST(!test("x", punct)); | |
53 | BOOST_TEST(test(" ", space)); | |
54 | BOOST_TEST(test("\n", space)); | |
55 | BOOST_TEST(test("\r", space)); | |
56 | BOOST_TEST(test("\t", space)); | |
57 | BOOST_TEST(test("A", upper)); | |
58 | BOOST_TEST(!test("a", upper)); | |
59 | BOOST_TEST(test("A", xdigit)); | |
60 | BOOST_TEST(test("0", xdigit)); | |
61 | BOOST_TEST(test("f", xdigit)); | |
62 | BOOST_TEST(!test("g", xdigit)); | |
63 | } | |
64 | ||
65 | { | |
66 | using namespace boost::spirit::x3::ascii; | |
67 | BOOST_TEST(!test("1", ~alnum)); | |
68 | BOOST_TEST(test(" ", ~alnum)); | |
69 | BOOST_TEST(test("1", ~alpha)); | |
70 | BOOST_TEST(!test("x", ~alpha)); | |
71 | BOOST_TEST(!test(" ", ~blank)); | |
72 | BOOST_TEST(test("x", ~blank)); | |
73 | BOOST_TEST(!test("1", ~digit)); | |
74 | BOOST_TEST(test("x", ~digit)); | |
75 | BOOST_TEST(!test("a", ~lower)); | |
76 | BOOST_TEST(test("A", ~lower)); | |
77 | BOOST_TEST(!test("!", ~punct)); | |
78 | BOOST_TEST(test("x", ~punct)); | |
79 | BOOST_TEST(!test(" ", ~space)); | |
80 | BOOST_TEST(!test("\n", ~space)); | |
81 | BOOST_TEST(!test("\r", ~space)); | |
82 | BOOST_TEST(!test("\t", ~space)); | |
83 | BOOST_TEST(!test("A", ~upper)); | |
84 | BOOST_TEST(test("a", ~upper)); | |
85 | BOOST_TEST(!test("A", ~xdigit)); | |
86 | BOOST_TEST(!test("0", ~xdigit)); | |
87 | BOOST_TEST(!test("f", ~xdigit)); | |
88 | BOOST_TEST(test("g", ~xdigit)); | |
89 | } | |
90 | ||
91 | { | |
92 | using namespace boost::spirit::x3::iso8859_1; | |
f67539c2 TL |
93 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(alnum); |
94 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(alpha); | |
95 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(digit); | |
96 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(xdigit); | |
97 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(cntrl); | |
98 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(graph); | |
99 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(lower); | |
100 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(print); | |
101 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(punct); | |
102 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(space); | |
103 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(blank); | |
104 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(upper); | |
7c673cae FG |
105 | BOOST_TEST(test("1", alnum)); |
106 | BOOST_TEST(!test(" ", alnum)); | |
107 | BOOST_TEST(!test("1", alpha)); | |
108 | BOOST_TEST(test("x", alpha)); | |
109 | BOOST_TEST(test(" ", blank)); | |
110 | BOOST_TEST(!test("x", blank)); | |
111 | BOOST_TEST(test("1", digit)); | |
112 | BOOST_TEST(!test("x", digit)); | |
113 | BOOST_TEST(test("a", lower)); | |
114 | BOOST_TEST(!test("A", lower)); | |
115 | BOOST_TEST(test("!", punct)); | |
116 | BOOST_TEST(!test("x", punct)); | |
117 | BOOST_TEST(test(" ", space)); | |
118 | BOOST_TEST(test("\n", space)); | |
119 | BOOST_TEST(test("\r", space)); | |
120 | BOOST_TEST(test("\t", space)); | |
121 | BOOST_TEST(test("A", upper)); | |
122 | BOOST_TEST(!test("a", upper)); | |
123 | BOOST_TEST(test("A", xdigit)); | |
124 | BOOST_TEST(test("0", xdigit)); | |
125 | BOOST_TEST(test("f", xdigit)); | |
126 | BOOST_TEST(!test("g", xdigit)); | |
127 | ||
92f5a8d4 TL |
128 | // test extended ASCII characters |
129 | BOOST_TEST(test("\xE9", alpha)); | |
130 | BOOST_TEST(test("\xE9", lower)); | |
131 | BOOST_TEST(!test("\xE9", upper)); | |
7c673cae FG |
132 | } |
133 | ||
134 | { | |
135 | using namespace boost::spirit::x3::standard; | |
f67539c2 TL |
136 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(alnum); |
137 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(alpha); | |
138 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(digit); | |
139 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(xdigit); | |
140 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(cntrl); | |
141 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(graph); | |
142 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(lower); | |
143 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(print); | |
144 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(punct); | |
145 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(space); | |
146 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(blank); | |
147 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(upper); | |
7c673cae FG |
148 | BOOST_TEST(test("1", alnum)); |
149 | BOOST_TEST(!test(" ", alnum)); | |
150 | BOOST_TEST(!test("1", alpha)); | |
151 | BOOST_TEST(test("x", alpha)); | |
152 | BOOST_TEST(test(" ", blank)); | |
153 | BOOST_TEST(!test("x", blank)); | |
154 | BOOST_TEST(test("1", digit)); | |
155 | BOOST_TEST(!test("x", digit)); | |
156 | BOOST_TEST(test("a", lower)); | |
157 | BOOST_TEST(!test("A", lower)); | |
158 | BOOST_TEST(test("!", punct)); | |
159 | BOOST_TEST(!test("x", punct)); | |
160 | BOOST_TEST(test(" ", space)); | |
161 | BOOST_TEST(test("\n", space)); | |
162 | BOOST_TEST(test("\r", space)); | |
163 | BOOST_TEST(test("\t", space)); | |
164 | BOOST_TEST(test("A", upper)); | |
165 | BOOST_TEST(!test("a", upper)); | |
166 | BOOST_TEST(test("A", xdigit)); | |
167 | BOOST_TEST(test("0", xdigit)); | |
168 | BOOST_TEST(test("f", xdigit)); | |
169 | BOOST_TEST(!test("g", xdigit)); | |
170 | } | |
171 | ||
172 | { | |
173 | using namespace boost::spirit::x3::standard_wide; | |
f67539c2 TL |
174 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(alnum); |
175 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(alpha); | |
176 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(digit); | |
177 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(xdigit); | |
178 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(cntrl); | |
179 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(graph); | |
180 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(lower); | |
181 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(print); | |
182 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(punct); | |
183 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(space); | |
184 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(blank); | |
185 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(upper); | |
7c673cae FG |
186 | BOOST_TEST(test(L"1", alnum)); |
187 | BOOST_TEST(!test(L" ", alnum)); | |
188 | BOOST_TEST(!test(L"1", alpha)); | |
189 | BOOST_TEST(test(L"x", alpha)); | |
190 | BOOST_TEST(test(L" ", blank)); | |
191 | BOOST_TEST(!test(L"x", blank)); | |
192 | BOOST_TEST(test(L"1", digit)); | |
193 | BOOST_TEST(!test(L"x", digit)); | |
194 | BOOST_TEST(test(L"a", lower)); | |
195 | BOOST_TEST(!test(L"A", lower)); | |
196 | BOOST_TEST(test(L"!", punct)); | |
197 | BOOST_TEST(!test(L"x", punct)); | |
198 | BOOST_TEST(test(L" ", space)); | |
199 | BOOST_TEST(test(L"\n", space)); | |
200 | BOOST_TEST(test(L"\r", space)); | |
201 | BOOST_TEST(test(L"\t", space)); | |
202 | BOOST_TEST(test(L"A", upper)); | |
203 | BOOST_TEST(!test(L"a", upper)); | |
204 | BOOST_TEST(test(L"A", xdigit)); | |
205 | BOOST_TEST(test(L"0", xdigit)); | |
206 | BOOST_TEST(test(L"f", xdigit)); | |
207 | BOOST_TEST(!test(L"g", xdigit)); | |
208 | } | |
209 | ||
210 | { | |
211 | using namespace boost::spirit::x3::unicode; | |
f67539c2 TL |
212 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(alnum); |
213 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(alpha); | |
214 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(digit); | |
215 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(xdigit); | |
216 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(cntrl); | |
217 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(graph); | |
218 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(lower); | |
219 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(print); | |
220 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(punct); | |
221 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(space); | |
222 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(blank); | |
223 | BOOST_SPIRIT_ASSERT_CONSTEXPR_CTORS(upper); | |
7c673cae FG |
224 | BOOST_TEST(test(L"1", alnum)); |
225 | BOOST_TEST(!test(L" ", alnum)); | |
226 | BOOST_TEST(!test(L"1", alpha)); | |
227 | BOOST_TEST(test(L"x", alpha)); | |
228 | BOOST_TEST(test(L" ", blank)); | |
229 | BOOST_TEST(!test(L"x", blank)); | |
230 | BOOST_TEST(test(L"1", digit)); | |
231 | BOOST_TEST(!test(L"x", digit)); | |
232 | BOOST_TEST(test(L"a", lower)); | |
233 | BOOST_TEST(!test(L"A", lower)); | |
234 | BOOST_TEST(test(L"!", punct)); | |
235 | BOOST_TEST(!test(L"x", punct)); | |
236 | BOOST_TEST(test(L" ", space)); | |
237 | BOOST_TEST(test(L"\n", space)); | |
238 | BOOST_TEST(test(L"\r", space)); | |
239 | BOOST_TEST(test(L"\t", space)); | |
240 | BOOST_TEST(test(L"A", upper)); | |
241 | BOOST_TEST(!test(L"a", upper)); | |
242 | BOOST_TEST(test(L"A", xdigit)); | |
243 | BOOST_TEST(test(L"0", xdigit)); | |
244 | BOOST_TEST(test(L"f", xdigit)); | |
245 | BOOST_TEST(!test(L"g", xdigit)); | |
246 | ||
247 | BOOST_TEST(test(L"A", alphabetic)); | |
248 | BOOST_TEST(test(L"9", decimal_number)); | |
249 | BOOST_TEST(test(L"\u2800", braille)); | |
250 | BOOST_TEST(!test(L" ", braille)); | |
251 | BOOST_TEST(test(L" ", ~braille)); | |
252 | // $$$ TODO $$$ Add more unicode tests | |
92f5a8d4 TL |
253 | } |
254 | ||
255 | { // test invalid unicode literals | |
256 | using namespace boost::spirit::x3::unicode; | |
257 | ||
258 | auto const invalid_unicode = char32_t{0x7FFFFFFF}; | |
259 | auto const input = boost::u32string_view(&invalid_unicode, 1); | |
260 | ||
261 | BOOST_TEST(test_failure(input, char_)); | |
7c673cae | 262 | |
92f5a8d4 TL |
263 | // force unicode category lookup |
264 | // related issue: https://github.com/boostorg/spirit/issues/524 | |
265 | BOOST_TEST(test_failure(input, alpha)); | |
266 | BOOST_TEST(test_failure(input, upper)); | |
267 | BOOST_TEST(test_failure(input, lower)); | |
7c673cae FG |
268 | } |
269 | ||
270 | { // test attribute extraction | |
271 | using boost::spirit::x3::traits::attribute_of; | |
272 | using boost::spirit::x3::iso8859_1::alpha; | |
273 | using boost::spirit::x3::iso8859_1::alpha_type; | |
274 | ||
275 | static_assert( | |
276 | boost::is_same< | |
277 | attribute_of<alpha_type, unused_type>::type | |
278 | , unsigned char>::value | |
279 | , "Wrong attribute type!" | |
280 | ); | |
281 | ||
282 | int attr = 0; | |
283 | BOOST_TEST(test_attr("a", alpha, attr)); | |
284 | BOOST_TEST(attr == 'a'); | |
285 | } | |
286 | ||
287 | { // test attribute extraction | |
288 | using boost::spirit::x3::iso8859_1::alpha; | |
289 | using boost::spirit::x3::iso8859_1::space; | |
290 | char attr = 0; | |
291 | BOOST_TEST(test_attr(" a", alpha, attr, space)); | |
292 | BOOST_TEST(attr == 'a'); | |
293 | } | |
294 | ||
295 | { // test action | |
296 | using namespace boost::spirit::x3::ascii; | |
297 | using boost::spirit::x3::_attr; | |
298 | char ch; | |
299 | auto f = [&](auto& ctx){ ch = _attr(ctx); }; | |
300 | ||
301 | BOOST_TEST(test("x", alnum[f])); | |
302 | BOOST_TEST(ch == 'x'); | |
303 | BOOST_TEST(test(" A", alnum[f], space)); | |
304 | BOOST_TEST(ch == 'A'); | |
305 | } | |
306 | ||
307 | return boost::report_errors(); | |
308 | } |