Imported Upstream version 1.72.0
[platform/upstream/boost.git] / 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_TEST(test("1", alnum));
30         BOOST_TEST(!test(" ", alnum));
31         BOOST_TEST(!test("1", alpha));
32         BOOST_TEST(test("x", alpha));
33         BOOST_TEST(test(" ", blank));
34         BOOST_TEST(!test("x", blank));
35         BOOST_TEST(test("1", digit));
36         BOOST_TEST(!test("x", digit));
37         BOOST_TEST(test("a", lower));
38         BOOST_TEST(!test("A", lower));
39         BOOST_TEST(test("!", punct));
40         BOOST_TEST(!test("x", punct));
41         BOOST_TEST(test(" ", space));
42         BOOST_TEST(test("\n", space));
43         BOOST_TEST(test("\r", space));
44         BOOST_TEST(test("\t", space));
45         BOOST_TEST(test("A", upper));
46         BOOST_TEST(!test("a", upper));
47         BOOST_TEST(test("A", xdigit));
48         BOOST_TEST(test("0", xdigit));
49         BOOST_TEST(test("f", xdigit));
50         BOOST_TEST(!test("g", xdigit));
51     }
52
53     {
54         using namespace boost::spirit::x3::ascii;
55         BOOST_TEST(!test("1", ~alnum));
56         BOOST_TEST(test(" ", ~alnum));
57         BOOST_TEST(test("1", ~alpha));
58         BOOST_TEST(!test("x", ~alpha));
59         BOOST_TEST(!test(" ", ~blank));
60         BOOST_TEST(test("x", ~blank));
61         BOOST_TEST(!test("1", ~digit));
62         BOOST_TEST(test("x", ~digit));
63         BOOST_TEST(!test("a", ~lower));
64         BOOST_TEST(test("A", ~lower));
65         BOOST_TEST(!test("!", ~punct));
66         BOOST_TEST(test("x", ~punct));
67         BOOST_TEST(!test(" ", ~space));
68         BOOST_TEST(!test("\n", ~space));
69         BOOST_TEST(!test("\r", ~space));
70         BOOST_TEST(!test("\t", ~space));
71         BOOST_TEST(!test("A", ~upper));
72         BOOST_TEST(test("a", ~upper));
73         BOOST_TEST(!test("A", ~xdigit));
74         BOOST_TEST(!test("0", ~xdigit));
75         BOOST_TEST(!test("f", ~xdigit));
76         BOOST_TEST(test("g", ~xdigit));
77     }
78
79     {
80         using namespace boost::spirit::x3::iso8859_1;
81         BOOST_TEST(test("1", alnum));
82         BOOST_TEST(!test(" ", alnum));
83         BOOST_TEST(!test("1", alpha));
84         BOOST_TEST(test("x", alpha));
85         BOOST_TEST(test(" ", blank));
86         BOOST_TEST(!test("x", blank));
87         BOOST_TEST(test("1", digit));
88         BOOST_TEST(!test("x", digit));
89         BOOST_TEST(test("a", lower));
90         BOOST_TEST(!test("A", lower));
91         BOOST_TEST(test("!", punct));
92         BOOST_TEST(!test("x", punct));
93         BOOST_TEST(test(" ", space));
94         BOOST_TEST(test("\n", space));
95         BOOST_TEST(test("\r", space));
96         BOOST_TEST(test("\t", space));
97         BOOST_TEST(test("A", upper));
98         BOOST_TEST(!test("a", upper));
99         BOOST_TEST(test("A", xdigit));
100         BOOST_TEST(test("0", xdigit));
101         BOOST_TEST(test("f", xdigit));
102         BOOST_TEST(!test("g", xdigit));
103
104         // test extended ASCII characters
105         BOOST_TEST(test("\xE9", alpha));
106         BOOST_TEST(test("\xE9", lower));
107         BOOST_TEST(!test("\xE9", upper));
108     }
109
110     {
111         using namespace boost::spirit::x3::standard;
112         BOOST_TEST(test("1", alnum));
113         BOOST_TEST(!test(" ", alnum));
114         BOOST_TEST(!test("1", alpha));
115         BOOST_TEST(test("x", alpha));
116         BOOST_TEST(test(" ", blank));
117         BOOST_TEST(!test("x", blank));
118         BOOST_TEST(test("1", digit));
119         BOOST_TEST(!test("x", digit));
120         BOOST_TEST(test("a", lower));
121         BOOST_TEST(!test("A", lower));
122         BOOST_TEST(test("!", punct));
123         BOOST_TEST(!test("x", punct));
124         BOOST_TEST(test(" ", space));
125         BOOST_TEST(test("\n", space));
126         BOOST_TEST(test("\r", space));
127         BOOST_TEST(test("\t", space));
128         BOOST_TEST(test("A", upper));
129         BOOST_TEST(!test("a", upper));
130         BOOST_TEST(test("A", xdigit));
131         BOOST_TEST(test("0", xdigit));
132         BOOST_TEST(test("f", xdigit));
133         BOOST_TEST(!test("g", xdigit));
134     }
135
136     {
137         using namespace boost::spirit::x3::standard_wide;
138         BOOST_TEST(test(L"1", alnum));
139         BOOST_TEST(!test(L" ", alnum));
140         BOOST_TEST(!test(L"1", alpha));
141         BOOST_TEST(test(L"x", alpha));
142         BOOST_TEST(test(L" ", blank));
143         BOOST_TEST(!test(L"x", blank));
144         BOOST_TEST(test(L"1", digit));
145         BOOST_TEST(!test(L"x", digit));
146         BOOST_TEST(test(L"a", lower));
147         BOOST_TEST(!test(L"A", lower));
148         BOOST_TEST(test(L"!", punct));
149         BOOST_TEST(!test(L"x", punct));
150         BOOST_TEST(test(L" ", space));
151         BOOST_TEST(test(L"\n", space));
152         BOOST_TEST(test(L"\r", space));
153         BOOST_TEST(test(L"\t", space));
154         BOOST_TEST(test(L"A", upper));
155         BOOST_TEST(!test(L"a", upper));
156         BOOST_TEST(test(L"A", xdigit));
157         BOOST_TEST(test(L"0", xdigit));
158         BOOST_TEST(test(L"f", xdigit));
159         BOOST_TEST(!test(L"g", xdigit));
160     }
161
162     {
163         using namespace boost::spirit::x3::unicode;
164         BOOST_TEST(test(L"1", alnum));
165         BOOST_TEST(!test(L" ", alnum));
166         BOOST_TEST(!test(L"1", alpha));
167         BOOST_TEST(test(L"x", alpha));
168         BOOST_TEST(test(L" ", blank));
169         BOOST_TEST(!test(L"x", blank));
170         BOOST_TEST(test(L"1", digit));
171         BOOST_TEST(!test(L"x", digit));
172         BOOST_TEST(test(L"a", lower));
173         BOOST_TEST(!test(L"A", lower));
174         BOOST_TEST(test(L"!", punct));
175         BOOST_TEST(!test(L"x", punct));
176         BOOST_TEST(test(L" ", space));
177         BOOST_TEST(test(L"\n", space));
178         BOOST_TEST(test(L"\r", space));
179         BOOST_TEST(test(L"\t", space));
180         BOOST_TEST(test(L"A", upper));
181         BOOST_TEST(!test(L"a", upper));
182         BOOST_TEST(test(L"A", xdigit));
183         BOOST_TEST(test(L"0", xdigit));
184         BOOST_TEST(test(L"f", xdigit));
185         BOOST_TEST(!test(L"g", xdigit));
186
187         BOOST_TEST(test(L"A", alphabetic));
188         BOOST_TEST(test(L"9", decimal_number));
189         BOOST_TEST(test(L"\u2800", braille));
190         BOOST_TEST(!test(L" ", braille));
191         BOOST_TEST(test(L" ", ~braille));
192         // $$$ TODO $$$ Add more unicode tests
193     }
194
195     {   // test invalid unicode literals
196         using namespace boost::spirit::x3::unicode;
197
198         auto const invalid_unicode = char32_t{0x7FFFFFFF};
199         auto const input           = boost::u32string_view(&invalid_unicode, 1);
200
201         BOOST_TEST(test_failure(input, char_));
202
203         // force unicode category lookup
204         // related issue: https://github.com/boostorg/spirit/issues/524
205         BOOST_TEST(test_failure(input, alpha));
206         BOOST_TEST(test_failure(input, upper));
207         BOOST_TEST(test_failure(input, lower));
208     }
209
210     {   // test attribute extraction
211         using boost::spirit::x3::traits::attribute_of;
212         using boost::spirit::x3::iso8859_1::alpha;
213         using boost::spirit::x3::iso8859_1::alpha_type;
214
215         static_assert(
216             boost::is_same<
217                 attribute_of<alpha_type, unused_type>::type
218               , unsigned char>::value
219           , "Wrong attribute type!"
220         );
221
222         int attr = 0;
223         BOOST_TEST(test_attr("a", alpha, attr));
224         BOOST_TEST(attr == 'a');
225     }
226
227     {   // test attribute extraction
228         using boost::spirit::x3::iso8859_1::alpha;
229         using boost::spirit::x3::iso8859_1::space;
230         char attr = 0;
231         BOOST_TEST(test_attr("     a", alpha, attr, space));
232         BOOST_TEST(attr == 'a');
233     }
234
235     {   // test action
236         using namespace boost::spirit::x3::ascii;
237         using boost::spirit::x3::_attr;
238         char ch;
239         auto f = [&](auto& ctx){ ch = _attr(ctx); };
240
241         BOOST_TEST(test("x", alnum[f]));
242         BOOST_TEST(ch == 'x');
243         BOOST_TEST(test("   A", alnum[f], space));
244         BOOST_TEST(ch == 'A');
245     }
246
247     return boost::report_errors();
248 }