]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/spirit/test/x3/char_class.cpp
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / boost / libs / spirit / test / x3 / char_class.cpp
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
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;
22 using spirit_test::test_failure;
23 using spirit_test::test_attr;
24
25 using boost::spirit::x3::unused_type;
26
27 {
28 using namespace boost::spirit::x3::ascii;
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);
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;
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);
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
128 // test extended ASCII characters
129 BOOST_TEST(test("\xE9", alpha));
130 BOOST_TEST(test("\xE9", lower));
131 BOOST_TEST(!test("\xE9", upper));
132 }
133
134 {
135 using namespace boost::spirit::x3::standard;
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);
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;
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);
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;
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);
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
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_));
262
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));
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 }