1 /*=============================================================================
2 Copyright (c) 2001-2015 Joel de Guzman
3 Copyright (c) 2001-2010 Hartmut Kaiser
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 =============================================================================*/
9 #define BOOST_SPIRIT_X3_UNICODE
11 #include <boost/detail/lightweight_test.hpp>
12 #include <boost/spirit/home/x3.hpp>
13 #include <boost/type_traits/is_same.hpp>
21 using spirit_test::test;
22 using spirit_test::test_failure;
23 using spirit_test::test_attr;
25 using boost::spirit::x3::unused_type;
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));
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));
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));
104 // test extended ASCII characters
105 BOOST_TEST(test("\xE9", alpha));
106 BOOST_TEST(test("\xE9", lower));
107 BOOST_TEST(!test("\xE9", upper));
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));
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));
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));
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
195 { // test invalid unicode literals
196 using namespace boost::spirit::x3::unicode;
198 auto const invalid_unicode = char32_t{0x7FFFFFFF};
199 auto const input = boost::u32string_view(&invalid_unicode, 1);
201 BOOST_TEST(test_failure(input, char_));
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));
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;
217 attribute_of<alpha_type, unused_type>::type
218 , unsigned char>::value
219 , "Wrong attribute type!"
223 BOOST_TEST(test_attr("a", alpha, attr));
224 BOOST_TEST(attr == 'a');
227 { // test attribute extraction
228 using boost::spirit::x3::iso8859_1::alpha;
229 using boost::spirit::x3::iso8859_1::space;
231 BOOST_TEST(test_attr(" a", alpha, attr, space));
232 BOOST_TEST(attr == 'a');
236 using namespace boost::spirit::x3::ascii;
237 using boost::spirit::x3::_attr;
239 auto f = [&](auto& ctx){ ch = _attr(ctx); };
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');
247 return boost::report_errors();