FSF GCC merge 02/23/03
[official-gcc.git] / libstdc++-v3 / testsuite / 22_locale / ctype / scan / wchar_t / 1.cc
blob7af4fae26b2fad997407c1e7969877581f8af9d8
1 // 2002-05-10 ghazi
3 // Copyright (C) 2002 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 2, or (at your option)
9 // any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with this library; see the file COPYING. If not, write to the Free
18 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
19 // USA.
21 // As a special exception, you may use this file as part of a free software
22 // library without restriction. Specifically, if other files instantiate
23 // templates or use macros or inline functions from this file, or you compile
24 // this file and link it with other files to produce an executable, this
25 // file does not by itself cause the resulting executable to be covered by
26 // the GNU General Public License. This exception does not however
27 // invalidate any other reasons why the executable file might be covered by
28 // the GNU General Public License.
30 // { dg-do run }
32 #include <locale>
33 #include <testsuite_hooks.h>
35 typedef wchar_t char_type;
36 typedef std::char_traits<char_type> traits_type;
37 class gnu_ctype: public std::ctype<char_type> { };
39 // These two macros take a ctype mask, a string and a pointer within
40 // the string that the scan function should return, usually either the
41 // first or last character if the string contains identical values as
42 // below.
43 #define VERIFY_SCAN_IS(MASK, STRING, EXPECTED) \
44 VERIFY(gctype.scan_is((MASK), (STRING), \
45 (STRING) + traits_type::length(STRING)) == (EXPECTED))
46 #define VERIFY_SCAN_NOT(MASK, STRING, EXPECTED) \
47 VERIFY(gctype.scan_not((MASK), (STRING), \
48 (STRING) + traits_type::length(STRING)) == (EXPECTED))
50 #ifdef _GLIBCPP_USE_WCHAR_T
51 // Sanity check scan_is() and scan_not().
52 void test01()
54 bool test = true;
56 const char_type *const ca = L"aaaaa";
57 const char_type *const cz = L"zzzzz";
58 const char_type *const cA = L"AAAAA";
59 const char_type *const cZ = L"ZZZZZ";
60 const char_type *const c0 = L"00000";
61 const char_type *const c9 = L"99999";
62 const char_type *const cs = L" ";
63 const char_type *const xf = L"fffff";
64 const char_type *const xF = L"FFFFF";
65 const char_type *const p1 = L"!!!!!";
66 const char_type *const p2 = L"/////";
68 gnu_ctype gctype;
70 // 'a'
71 VERIFY_SCAN_IS (std::ctype_base::alnum, ca, ca);
72 VERIFY_SCAN_IS (std::ctype_base::alpha, ca, ca);
73 VERIFY_SCAN_IS (std::ctype_base::cntrl, ca, ca+5);
74 VERIFY_SCAN_IS (std::ctype_base::digit, ca, ca+5);
75 VERIFY_SCAN_IS (std::ctype_base::graph, ca, ca);
76 VERIFY_SCAN_IS (std::ctype_base::lower, ca, ca);
77 VERIFY_SCAN_IS (std::ctype_base::print, ca, ca);
78 VERIFY_SCAN_IS (std::ctype_base::punct, ca, ca+5);
79 VERIFY_SCAN_IS (std::ctype_base::space, ca, ca+5);
80 VERIFY_SCAN_IS (std::ctype_base::upper, ca, ca+5);
81 VERIFY_SCAN_IS (std::ctype_base::xdigit, ca, ca);
83 VERIFY_SCAN_NOT (std::ctype_base::alnum, ca, ca+5);
84 VERIFY_SCAN_NOT (std::ctype_base::alpha, ca, ca+5);
85 VERIFY_SCAN_NOT (std::ctype_base::cntrl, ca, ca);
86 VERIFY_SCAN_NOT (std::ctype_base::digit, ca, ca);
87 VERIFY_SCAN_NOT (std::ctype_base::graph, ca, ca+5);
88 VERIFY_SCAN_NOT (std::ctype_base::lower, ca, ca+5);
89 VERIFY_SCAN_NOT (std::ctype_base::print, ca, ca+5);
90 VERIFY_SCAN_NOT (std::ctype_base::punct, ca, ca);
91 VERIFY_SCAN_NOT (std::ctype_base::space, ca, ca);
92 VERIFY_SCAN_NOT (std::ctype_base::upper, ca, ca);
93 VERIFY_SCAN_NOT (std::ctype_base::xdigit, ca, ca+5);
95 // 'z'
96 VERIFY_SCAN_IS (std::ctype_base::alnum, cz, cz);
97 VERIFY_SCAN_IS (std::ctype_base::alpha, cz, cz);
98 VERIFY_SCAN_IS (std::ctype_base::cntrl, cz, cz+5);
99 VERIFY_SCAN_IS (std::ctype_base::digit, cz, cz+5);
100 VERIFY_SCAN_IS (std::ctype_base::graph, cz, cz);
101 VERIFY_SCAN_IS (std::ctype_base::lower, cz, cz);
102 VERIFY_SCAN_IS (std::ctype_base::print, cz, cz);
103 VERIFY_SCAN_IS (std::ctype_base::punct, cz, cz+5);
104 VERIFY_SCAN_IS (std::ctype_base::space, cz, cz+5);
105 VERIFY_SCAN_IS (std::ctype_base::upper, cz, cz+5);
106 VERIFY_SCAN_IS (std::ctype_base::xdigit, cz, cz+5);
108 VERIFY_SCAN_NOT (std::ctype_base::alnum, cz, cz+5);
109 VERIFY_SCAN_NOT (std::ctype_base::alpha, cz, cz+5);
110 VERIFY_SCAN_NOT (std::ctype_base::cntrl, cz, cz);
111 VERIFY_SCAN_NOT (std::ctype_base::digit, cz, cz);
112 VERIFY_SCAN_NOT (std::ctype_base::graph, cz, cz+5);
113 VERIFY_SCAN_NOT (std::ctype_base::lower, cz, cz+5);
114 VERIFY_SCAN_NOT (std::ctype_base::print, cz, cz+5);
115 VERIFY_SCAN_NOT (std::ctype_base::punct, cz, cz);
116 VERIFY_SCAN_NOT (std::ctype_base::space, cz, cz);
117 VERIFY_SCAN_NOT (std::ctype_base::upper, cz, cz);
118 VERIFY_SCAN_NOT (std::ctype_base::xdigit, cz, cz);
120 // 'A'
121 VERIFY_SCAN_IS (std::ctype_base::alnum, cA, cA);
122 VERIFY_SCAN_IS (std::ctype_base::alpha, cA, cA);
123 VERIFY_SCAN_IS (std::ctype_base::cntrl, cA, cA+5);
124 VERIFY_SCAN_IS (std::ctype_base::digit, cA, cA+5);
125 VERIFY_SCAN_IS (std::ctype_base::graph, cA, cA);
126 VERIFY_SCAN_IS (std::ctype_base::lower, cA, cA+5);
127 VERIFY_SCAN_IS (std::ctype_base::print, cA, cA);
128 VERIFY_SCAN_IS (std::ctype_base::punct, cA, cA+5);
129 VERIFY_SCAN_IS (std::ctype_base::space, cA, cA+5);
130 VERIFY_SCAN_IS (std::ctype_base::upper, cA, cA);
131 VERIFY_SCAN_IS (std::ctype_base::xdigit, cA, cA);
133 VERIFY_SCAN_NOT (std::ctype_base::alnum, cA, cA+5);
134 VERIFY_SCAN_NOT (std::ctype_base::alpha, cA, cA+5);
135 VERIFY_SCAN_NOT (std::ctype_base::cntrl, cA, cA);
136 VERIFY_SCAN_NOT (std::ctype_base::digit, cA, cA);
137 VERIFY_SCAN_NOT (std::ctype_base::graph, cA, cA+5);
138 VERIFY_SCAN_NOT (std::ctype_base::lower, cA, cA);
139 VERIFY_SCAN_NOT (std::ctype_base::print, cA, cA+5);
140 VERIFY_SCAN_NOT (std::ctype_base::punct, cA, cA);
141 VERIFY_SCAN_NOT (std::ctype_base::space, cA, cA);
142 VERIFY_SCAN_NOT (std::ctype_base::upper, cA, cA+5);
143 VERIFY_SCAN_NOT (std::ctype_base::xdigit, cA, cA+5);
145 // 'Z'
146 VERIFY_SCAN_IS (std::ctype_base::alnum, cZ, cZ);
147 VERIFY_SCAN_IS (std::ctype_base::alpha, cZ, cZ);
148 VERIFY_SCAN_IS (std::ctype_base::cntrl, cZ, cZ+5);
149 VERIFY_SCAN_IS (std::ctype_base::digit, cZ, cZ+5);
150 VERIFY_SCAN_IS (std::ctype_base::graph, cZ, cZ);
151 VERIFY_SCAN_IS (std::ctype_base::lower, cZ, cZ+5);
152 VERIFY_SCAN_IS (std::ctype_base::print, cZ, cZ);
153 VERIFY_SCAN_IS (std::ctype_base::punct, cZ, cZ+5);
154 VERIFY_SCAN_IS (std::ctype_base::space, cZ, cZ+5);
155 VERIFY_SCAN_IS (std::ctype_base::upper, cZ, cZ);
156 VERIFY_SCAN_IS (std::ctype_base::xdigit, cZ, cZ+5);
158 VERIFY_SCAN_NOT (std::ctype_base::alnum, cZ, cZ+5);
159 VERIFY_SCAN_NOT (std::ctype_base::alpha, cZ, cZ+5);
160 VERIFY_SCAN_NOT (std::ctype_base::cntrl, cZ, cZ);
161 VERIFY_SCAN_NOT (std::ctype_base::digit, cZ, cZ);
162 VERIFY_SCAN_NOT (std::ctype_base::graph, cZ, cZ+5);
163 VERIFY_SCAN_NOT (std::ctype_base::lower, cZ, cZ);
164 VERIFY_SCAN_NOT (std::ctype_base::print, cZ, cZ+5);
165 VERIFY_SCAN_NOT (std::ctype_base::punct, cZ, cZ);
166 VERIFY_SCAN_NOT (std::ctype_base::space, cZ, cZ);
167 VERIFY_SCAN_NOT (std::ctype_base::upper, cZ, cZ+5);
168 VERIFY_SCAN_NOT (std::ctype_base::xdigit, cZ, cZ);
170 // '0'
171 VERIFY_SCAN_IS (std::ctype_base::alnum, c0, c0);
172 VERIFY_SCAN_IS (std::ctype_base::alpha, c0, c0+5);
173 VERIFY_SCAN_IS (std::ctype_base::cntrl, c0, c0+5);
174 VERIFY_SCAN_IS (std::ctype_base::digit, c0, c0);
175 VERIFY_SCAN_IS (std::ctype_base::graph, c0, c0);
176 VERIFY_SCAN_IS (std::ctype_base::lower, c0, c0+5);
177 VERIFY_SCAN_IS (std::ctype_base::print, c0, c0);
178 VERIFY_SCAN_IS (std::ctype_base::punct, c0, c0+5);
179 VERIFY_SCAN_IS (std::ctype_base::space, c0, c0+5);
180 VERIFY_SCAN_IS (std::ctype_base::upper, c0, c0+5);
181 VERIFY_SCAN_IS (std::ctype_base::xdigit, c0, c0);
183 VERIFY_SCAN_NOT (std::ctype_base::alnum, c0, c0+5);
184 VERIFY_SCAN_NOT (std::ctype_base::alpha, c0, c0);
185 VERIFY_SCAN_NOT (std::ctype_base::cntrl, c0, c0);
186 VERIFY_SCAN_NOT (std::ctype_base::digit, c0, c0+5);
187 VERIFY_SCAN_NOT (std::ctype_base::graph, c0, c0+5);
188 VERIFY_SCAN_NOT (std::ctype_base::lower, c0, c0);
189 VERIFY_SCAN_NOT (std::ctype_base::print, c0, c0+5);
190 VERIFY_SCAN_NOT (std::ctype_base::punct, c0, c0);
191 VERIFY_SCAN_NOT (std::ctype_base::space, c0, c0);
192 VERIFY_SCAN_NOT (std::ctype_base::upper, c0, c0);
193 VERIFY_SCAN_NOT (std::ctype_base::xdigit, c0, c0+5);
195 // '9'
196 VERIFY_SCAN_IS (std::ctype_base::alnum, c9, c9);
197 VERIFY_SCAN_IS (std::ctype_base::alpha, c9, c9+5);
198 VERIFY_SCAN_IS (std::ctype_base::cntrl, c9, c9+5);
199 VERIFY_SCAN_IS (std::ctype_base::digit, c9, c9);
200 VERIFY_SCAN_IS (std::ctype_base::graph, c9, c9);
201 VERIFY_SCAN_IS (std::ctype_base::lower, c9, c9+5);
202 VERIFY_SCAN_IS (std::ctype_base::print, c9, c9);
203 VERIFY_SCAN_IS (std::ctype_base::punct, c9, c9+5);
204 VERIFY_SCAN_IS (std::ctype_base::space, c9, c9+5);
205 VERIFY_SCAN_IS (std::ctype_base::upper, c9, c9+5);
206 VERIFY_SCAN_IS (std::ctype_base::xdigit, c9, c9);
208 VERIFY_SCAN_NOT (std::ctype_base::alnum, c9, c9+5);
209 VERIFY_SCAN_NOT (std::ctype_base::alpha, c9, c9);
210 VERIFY_SCAN_NOT (std::ctype_base::cntrl, c9, c9);
211 VERIFY_SCAN_NOT (std::ctype_base::digit, c9, c9+5);
212 VERIFY_SCAN_NOT (std::ctype_base::graph, c9, c9+5);
213 VERIFY_SCAN_NOT (std::ctype_base::lower, c9, c9);
214 VERIFY_SCAN_NOT (std::ctype_base::print, c9, c9+5);
215 VERIFY_SCAN_NOT (std::ctype_base::punct, c9, c9);
216 VERIFY_SCAN_NOT (std::ctype_base::space, c9, c9);
217 VERIFY_SCAN_NOT (std::ctype_base::upper, c9, c9);
218 VERIFY_SCAN_NOT (std::ctype_base::xdigit, c9, c9+5);
220 // ' '
221 VERIFY_SCAN_IS (std::ctype_base::alnum, cs, cs+5);
222 VERIFY_SCAN_IS (std::ctype_base::alpha, cs, cs+5);
223 VERIFY_SCAN_IS (std::ctype_base::cntrl, cs, cs+5);
224 VERIFY_SCAN_IS (std::ctype_base::digit, cs, cs+5);
225 VERIFY_SCAN_IS (std::ctype_base::graph, cs, cs+5);
226 VERIFY_SCAN_IS (std::ctype_base::lower, cs, cs+5);
227 VERIFY_SCAN_IS (std::ctype_base::print, cs, cs);
228 VERIFY_SCAN_IS (std::ctype_base::punct, cs, cs+5);
229 VERIFY_SCAN_IS (std::ctype_base::space, cs, cs);
230 VERIFY_SCAN_IS (std::ctype_base::upper, cs, cs+5);
231 VERIFY_SCAN_IS (std::ctype_base::xdigit, cs, cs+5);
233 VERIFY_SCAN_NOT (std::ctype_base::alnum, cs, cs);
234 VERIFY_SCAN_NOT (std::ctype_base::alpha, cs, cs);
235 VERIFY_SCAN_NOT (std::ctype_base::cntrl, cs, cs);
236 VERIFY_SCAN_NOT (std::ctype_base::digit, cs, cs);
237 VERIFY_SCAN_NOT (std::ctype_base::graph, cs, cs);
238 VERIFY_SCAN_NOT (std::ctype_base::lower, cs, cs);
239 VERIFY_SCAN_NOT (std::ctype_base::print, cs, cs+5);
240 VERIFY_SCAN_NOT (std::ctype_base::punct, cs, cs);
241 VERIFY_SCAN_NOT (std::ctype_base::space, cs, cs+5);
242 VERIFY_SCAN_NOT (std::ctype_base::upper, cs, cs);
243 VERIFY_SCAN_NOT (std::ctype_base::xdigit, cs, cs);
245 // 'f'
246 VERIFY_SCAN_IS (std::ctype_base::alnum, xf, xf);
247 VERIFY_SCAN_IS (std::ctype_base::alpha, xf, xf);
248 VERIFY_SCAN_IS (std::ctype_base::cntrl, xf, xf+5);
249 VERIFY_SCAN_IS (std::ctype_base::digit, xf, xf+5);
250 VERIFY_SCAN_IS (std::ctype_base::graph, xf, xf);
251 VERIFY_SCAN_IS (std::ctype_base::lower, xf, xf);
252 VERIFY_SCAN_IS (std::ctype_base::print, xf, xf);
253 VERIFY_SCAN_IS (std::ctype_base::punct, xf, xf+5);
254 VERIFY_SCAN_IS (std::ctype_base::space, xf, xf+5);
255 VERIFY_SCAN_IS (std::ctype_base::upper, xf, xf+5);
256 VERIFY_SCAN_IS (std::ctype_base::xdigit, xf, xf);
258 VERIFY_SCAN_NOT (std::ctype_base::alnum, xf, xf+5);
259 VERIFY_SCAN_NOT (std::ctype_base::alpha, xf, xf+5);
260 VERIFY_SCAN_NOT (std::ctype_base::cntrl, xf, xf);
261 VERIFY_SCAN_NOT (std::ctype_base::digit, xf, xf);
262 VERIFY_SCAN_NOT (std::ctype_base::graph, xf, xf+5);
263 VERIFY_SCAN_NOT (std::ctype_base::lower, xf, xf+5);
264 VERIFY_SCAN_NOT (std::ctype_base::print, xf, xf+5);
265 VERIFY_SCAN_NOT (std::ctype_base::punct, xf, xf);
266 VERIFY_SCAN_NOT (std::ctype_base::space, xf, xf);
267 VERIFY_SCAN_NOT (std::ctype_base::upper, xf, xf);
268 VERIFY_SCAN_NOT (std::ctype_base::xdigit, xf, xf+5);
270 // 'F'
271 VERIFY_SCAN_IS (std::ctype_base::alnum, xF, xF);
272 VERIFY_SCAN_IS (std::ctype_base::alpha, xF, xF);
273 VERIFY_SCAN_IS (std::ctype_base::cntrl, xF, xF+5);
274 VERIFY_SCAN_IS (std::ctype_base::digit, xF, xF+5);
275 VERIFY_SCAN_IS (std::ctype_base::graph, xF, xF);
276 VERIFY_SCAN_IS (std::ctype_base::lower, xF, xF+5);
277 VERIFY_SCAN_IS (std::ctype_base::print, xF, xF);
278 VERIFY_SCAN_IS (std::ctype_base::punct, xF, xF+5);
279 VERIFY_SCAN_IS (std::ctype_base::space, xF, xF+5);
280 VERIFY_SCAN_IS (std::ctype_base::upper, xF, xF);
281 VERIFY_SCAN_IS (std::ctype_base::xdigit, xF, xF);
283 VERIFY_SCAN_NOT (std::ctype_base::alnum, xF, xF+5);
284 VERIFY_SCAN_NOT (std::ctype_base::alpha, xF, xF+5);
285 VERIFY_SCAN_NOT (std::ctype_base::cntrl, xF, xF);
286 VERIFY_SCAN_NOT (std::ctype_base::digit, xF, xF);
287 VERIFY_SCAN_NOT (std::ctype_base::graph, xF, xF+5);
288 VERIFY_SCAN_NOT (std::ctype_base::lower, xF, xF);
289 VERIFY_SCAN_NOT (std::ctype_base::print, xF, xF+5);
290 VERIFY_SCAN_NOT (std::ctype_base::punct, xF, xF);
291 VERIFY_SCAN_NOT (std::ctype_base::space, xF, xF);
292 VERIFY_SCAN_NOT (std::ctype_base::upper, xF, xF+5);
293 VERIFY_SCAN_NOT (std::ctype_base::xdigit, xF, xF+5);
295 // '!'
296 VERIFY_SCAN_IS (std::ctype_base::alnum, p1, p1+5);
297 VERIFY_SCAN_IS (std::ctype_base::alpha, p1, p1+5);
298 VERIFY_SCAN_IS (std::ctype_base::cntrl, p1, p1+5);
299 VERIFY_SCAN_IS (std::ctype_base::digit, p1, p1+5);
300 VERIFY_SCAN_IS (std::ctype_base::graph, p1, p1);
301 VERIFY_SCAN_IS (std::ctype_base::lower, p1, p1+5);
302 VERIFY_SCAN_IS (std::ctype_base::print, p1, p1);
303 VERIFY_SCAN_IS (std::ctype_base::punct, p1, p1);
304 VERIFY_SCAN_IS (std::ctype_base::space, p1, p1+5);
305 VERIFY_SCAN_IS (std::ctype_base::upper, p1, p1+5);
306 VERIFY_SCAN_IS (std::ctype_base::xdigit, p1, p1+5);
308 VERIFY_SCAN_NOT (std::ctype_base::alnum, p1, p1);
309 VERIFY_SCAN_NOT (std::ctype_base::alpha, p1, p1);
310 VERIFY_SCAN_NOT (std::ctype_base::cntrl, p1, p1);
311 VERIFY_SCAN_NOT (std::ctype_base::digit, p1, p1);
312 VERIFY_SCAN_NOT (std::ctype_base::lower, p1, p1);
313 VERIFY_SCAN_NOT (std::ctype_base::print, p1, p1+5);
314 VERIFY_SCAN_NOT (std::ctype_base::punct, p1, p1+5);
315 VERIFY_SCAN_NOT (std::ctype_base::space, p1, p1);
316 VERIFY_SCAN_NOT (std::ctype_base::upper, p1, p1);
317 VERIFY_SCAN_NOT (std::ctype_base::xdigit, p1, p1);
319 // '/'
320 VERIFY_SCAN_IS (std::ctype_base::alnum, p2, p2+5);
321 VERIFY_SCAN_IS (std::ctype_base::alpha, p2, p2+5);
322 VERIFY_SCAN_IS (std::ctype_base::cntrl, p2, p2+5);
323 VERIFY_SCAN_IS (std::ctype_base::digit, p2, p2+5);
324 VERIFY_SCAN_IS (std::ctype_base::graph, p2, p2);
325 VERIFY_SCAN_IS (std::ctype_base::lower, p2, p2+5);
326 VERIFY_SCAN_IS (std::ctype_base::print, p2, p2);
327 VERIFY_SCAN_IS (std::ctype_base::punct, p2, p2);
328 VERIFY_SCAN_IS (std::ctype_base::space, p2, p2+5);
329 VERIFY_SCAN_IS (std::ctype_base::upper, p2, p2+5);
330 VERIFY_SCAN_IS (std::ctype_base::xdigit, p2, p2+5);
332 VERIFY_SCAN_NOT (std::ctype_base::alnum, p2, p2);
333 VERIFY_SCAN_NOT (std::ctype_base::alpha, p2, p2);
334 VERIFY_SCAN_NOT (std::ctype_base::cntrl, p2, p2);
335 VERIFY_SCAN_NOT (std::ctype_base::digit, p2, p2);
336 VERIFY_SCAN_NOT (std::ctype_base::graph, p2, p2+5);
337 VERIFY_SCAN_NOT (std::ctype_base::lower, p2, p2);
338 VERIFY_SCAN_NOT (std::ctype_base::print, p2, p2+5);
339 VERIFY_SCAN_NOT (std::ctype_base::punct, p2, p2+5);
340 VERIFY_SCAN_NOT (std::ctype_base::space, p2, p2);
341 VERIFY_SCAN_NOT (std::ctype_base::upper, p2, p2);
342 VERIFY_SCAN_NOT (std::ctype_base::xdigit, p2, p2);
344 #endif
346 int main()
348 #ifdef _GLIBCPP_USE_WCHAR_T
349 test01();
350 #endif
351 return 0;