1 | /*============================================================================= |
2 | Copyright (c) 2001-2010 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_UNICODE |
10 | |
11 | #include <boost/spirit/include/qi_char_class.hpp> |
12 | |
13 | #include <boost/spirit/include/qi_action.hpp> |
14 | #include <boost/spirit/include/support_argument.hpp> |
15 | #include <boost/spirit/include/support_attributes.hpp> |
16 | #include <boost/phoenix/core.hpp> |
17 | #include <boost/phoenix/operator.hpp> |
18 | #include <boost/type_traits/is_same.hpp> |
19 | #include <boost/static_assert.hpp> |
20 | |
21 | #include <iostream> |
22 | #include "test.hpp" |
23 | |
24 | int |
25 | main() |
26 | { |
27 | using spirit_test::test; |
28 | using spirit_test::test_attr; |
29 | |
30 | { |
31 | using namespace boost::spirit::ascii; |
32 | BOOST_TEST(test("1" , alnum)); |
33 | BOOST_TEST(!test(" " , alnum)); |
34 | BOOST_TEST(!test("1" , alpha)); |
35 | BOOST_TEST(test("x" , alpha)); |
36 | BOOST_TEST(test(" " , blank)); |
37 | BOOST_TEST(!test("x" , blank)); |
38 | BOOST_TEST(test("1" , digit)); |
39 | BOOST_TEST(!test("x" , digit)); |
40 | BOOST_TEST(test("a" , lower)); |
41 | BOOST_TEST(!test("A" , lower)); |
42 | BOOST_TEST(test("!" , punct)); |
43 | BOOST_TEST(!test("x" , punct)); |
44 | BOOST_TEST(test(" " , space)); |
45 | BOOST_TEST(test("\n" , space)); |
46 | BOOST_TEST(test("\r" , space)); |
47 | BOOST_TEST(test("\t" , space)); |
48 | BOOST_TEST(test("A" , upper)); |
49 | BOOST_TEST(!test("a" , upper)); |
50 | BOOST_TEST(test("A" , xdigit)); |
51 | BOOST_TEST(test("0" , xdigit)); |
52 | BOOST_TEST(test("f" , xdigit)); |
53 | BOOST_TEST(!test("g" , xdigit)); |
54 | |
55 | // should fail, not assert! |
56 | // $$$ Removing this test for now $$$ |
57 | // BOOST_TEST(!test("\265", space)); |
58 | } |
59 | |
60 | { |
61 | using namespace boost::spirit::ascii; |
62 | BOOST_TEST(!test("1" , ~alnum)); |
63 | BOOST_TEST(test(" " , ~alnum)); |
64 | BOOST_TEST(test("1" , ~alpha)); |
65 | BOOST_TEST(!test("x" , ~alpha)); |
66 | BOOST_TEST(!test(" " , ~blank)); |
67 | BOOST_TEST(test("x" , ~blank)); |
68 | BOOST_TEST(!test("1" , ~digit)); |
69 | BOOST_TEST(test("x" , ~digit)); |
70 | BOOST_TEST(!test("a" , ~lower)); |
71 | BOOST_TEST(test("A" , ~lower)); |
72 | BOOST_TEST(!test("!" , ~punct)); |
73 | BOOST_TEST(test("x" , ~punct)); |
74 | BOOST_TEST(!test(" " , ~space)); |
75 | BOOST_TEST(!test("\n" , ~space)); |
76 | BOOST_TEST(!test("\r" , ~space)); |
77 | BOOST_TEST(!test("\t" , ~space)); |
78 | BOOST_TEST(!test("A" , ~upper)); |
79 | BOOST_TEST(test("a" , ~upper)); |
80 | BOOST_TEST(!test("A" , ~xdigit)); |
81 | BOOST_TEST(!test("0" , ~xdigit)); |
82 | BOOST_TEST(!test("f" , ~xdigit)); |
83 | BOOST_TEST(test("g" , ~xdigit)); |
84 | } |
85 | |
86 | { |
87 | // we use the hoisted qi namespace this time |
88 | using namespace boost::spirit::qi::iso8859_1; |
89 | BOOST_TEST(test("1" , alnum)); |
90 | BOOST_TEST(!test(" " , alnum)); |
91 | BOOST_TEST(!test("1" , alpha)); |
92 | BOOST_TEST(test("x" , alpha)); |
93 | BOOST_TEST(test(" " , blank)); |
94 | BOOST_TEST(!test("x" , blank)); |
95 | BOOST_TEST(test("1" , digit)); |
96 | BOOST_TEST(!test("x" , digit)); |
97 | BOOST_TEST(test("a" , lower)); |
98 | BOOST_TEST(!test("A" , lower)); |
99 | BOOST_TEST(test("!" , punct)); |
100 | BOOST_TEST(!test("x" , punct)); |
101 | BOOST_TEST(test(" " , space)); |
102 | BOOST_TEST(test("\n" , space)); |
103 | BOOST_TEST(test("\r" , space)); |
104 | BOOST_TEST(test("\t" , space)); |
105 | BOOST_TEST(test("A" , upper)); |
106 | BOOST_TEST(!test("a" , upper)); |
107 | BOOST_TEST(test("A" , xdigit)); |
108 | BOOST_TEST(test("0" , xdigit)); |
109 | BOOST_TEST(test("f" , xdigit)); |
110 | BOOST_TEST(!test("g" , xdigit)); |
111 | |
112 | // test extended ASCII characters |
113 | BOOST_TEST(test("\xE9" , alpha)); |
114 | BOOST_TEST(test("\xE9" , lower)); |
115 | BOOST_TEST(!test("\xE9" , upper)); |
116 | } |
117 | |
118 | { |
119 | using namespace boost::spirit::standard; |
120 | BOOST_TEST(test("1" , alnum)); |
121 | BOOST_TEST(!test(" " , alnum)); |
122 | BOOST_TEST(!test("1" , alpha)); |
123 | BOOST_TEST(test("x" , alpha)); |
124 | BOOST_TEST(test(" " , blank)); |
125 | BOOST_TEST(!test("x" , blank)); |
126 | BOOST_TEST(test("1" , digit)); |
127 | BOOST_TEST(!test("x" , digit)); |
128 | BOOST_TEST(test("a" , lower)); |
129 | BOOST_TEST(!test("A" , lower)); |
130 | BOOST_TEST(test("!" , punct)); |
131 | BOOST_TEST(!test("x" , punct)); |
132 | BOOST_TEST(test(" " , space)); |
133 | BOOST_TEST(test("\n" , space)); |
134 | BOOST_TEST(test("\r" , space)); |
135 | BOOST_TEST(test("\t" , space)); |
136 | BOOST_TEST(test("A" , upper)); |
137 | BOOST_TEST(!test("a" , upper)); |
138 | BOOST_TEST(test("A" , xdigit)); |
139 | BOOST_TEST(test("0" , xdigit)); |
140 | BOOST_TEST(test("f" , xdigit)); |
141 | BOOST_TEST(!test("g" , xdigit)); |
142 | BOOST_TEST(!test("\xF1" , print)); |
143 | } |
144 | |
145 | { |
146 | using namespace boost::spirit::standard_wide; |
147 | BOOST_TEST(test(L"1" , alnum)); |
148 | BOOST_TEST(!test(L" " , alnum)); |
149 | BOOST_TEST(!test(L"1" , alpha)); |
150 | BOOST_TEST(test(L"x" , alpha)); |
151 | BOOST_TEST(test(L" " , blank)); |
152 | BOOST_TEST(!test(L"x" , blank)); |
153 | BOOST_TEST(test(L"1" , digit)); |
154 | BOOST_TEST(!test(L"x" , digit)); |
155 | BOOST_TEST(test(L"a" , lower)); |
156 | BOOST_TEST(!test(L"A" , lower)); |
157 | BOOST_TEST(test(L"!" , punct)); |
158 | BOOST_TEST(!test(L"x" , punct)); |
159 | BOOST_TEST(test(L" " , space)); |
160 | BOOST_TEST(test(L"\n" , space)); |
161 | BOOST_TEST(test(L"\r" , space)); |
162 | BOOST_TEST(test(L"\t" , space)); |
163 | BOOST_TEST(test(L"A" , upper)); |
164 | BOOST_TEST(!test(L"a" , upper)); |
165 | BOOST_TEST(test(L"A" , xdigit)); |
166 | BOOST_TEST(test(L"0" , xdigit)); |
167 | BOOST_TEST(test(L"f" , xdigit)); |
168 | BOOST_TEST(!test(L"g" , xdigit)); |
169 | } |
170 | |
171 | { |
172 | using namespace boost::spirit::unicode; |
173 | BOOST_TEST(test(L"1" , alnum)); |
174 | BOOST_TEST(!test(L" " , alnum)); |
175 | BOOST_TEST(!test(L"1" , alpha)); |
176 | BOOST_TEST(test(L"x" , alpha)); |
177 | BOOST_TEST(test(L" " , blank)); |
178 | BOOST_TEST(!test(L"x" , blank)); |
179 | BOOST_TEST(test(L"1" , digit)); |
180 | BOOST_TEST(!test(L"x" , digit)); |
181 | BOOST_TEST(test(L"a" , lower)); |
182 | BOOST_TEST(!test(L"A" , lower)); |
183 | BOOST_TEST(test(L"!" , punct)); |
184 | BOOST_TEST(!test(L"x" , punct)); |
185 | BOOST_TEST(test(L" " , space)); |
186 | BOOST_TEST(test(L"\n" , space)); |
187 | BOOST_TEST(test(L"\r" , space)); |
188 | BOOST_TEST(test(L"\t" , space)); |
189 | BOOST_TEST(test(L"A" , upper)); |
190 | BOOST_TEST(!test(L"a" , upper)); |
191 | BOOST_TEST(test(L"A" , xdigit)); |
192 | BOOST_TEST(test(L"0" , xdigit)); |
193 | BOOST_TEST(test(L"f" , xdigit)); |
194 | BOOST_TEST(!test(L"g" , xdigit)); |
195 | } |
196 | |
197 | { // test attribute extraction |
198 | using boost::spirit::qi::domain; |
199 | using boost::spirit::traits::attribute_of; |
200 | using boost::spirit::iso8859_1::alpha; |
201 | using boost::spirit::iso8859_1::alpha_type; |
202 | using boost::spirit::result_of::compile; |
203 | |
204 | BOOST_STATIC_ASSERT(( |
205 | boost::is_same< |
206 | attribute_of<compile<domain, alpha_type>::type>::type |
207 | , unsigned char>::value)); |
208 | |
209 | int attr = 0; |
210 | BOOST_TEST(test_attr("a" , alpha, attr)); |
211 | BOOST_TEST(attr == 'a'); |
212 | } |
213 | |
214 | { // test attribute extraction |
215 | using boost::spirit::iso8859_1::alpha; |
216 | using boost::spirit::iso8859_1::space; |
217 | char attr = 0; |
218 | BOOST_TEST(test_attr(" a" , alpha, attr, space)); |
219 | BOOST_TEST(attr == 'a'); |
220 | } |
221 | |
222 | { // test action |
223 | |
224 | using namespace boost::spirit::ascii; |
225 | using boost::phoenix::ref; |
226 | using boost::spirit::_1; |
227 | char ch; |
228 | |
229 | BOOST_TEST(test("x" , alnum[ref(ch) = _1])); |
230 | BOOST_TEST(ch == 'x'); |
231 | BOOST_TEST(test(" A" , alnum[ref(ch) = _1], space)); |
232 | BOOST_TEST(ch == 'A'); |
233 | } |
234 | |
235 | return boost::report_errors(); |
236 | } |
237 | |