• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
main()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 }
309