OSDN Git Service

7af4fae26b2fad997407c1e7969877581f8af9d8
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / testsuite / 22_locale / ctype_scan_wchar_t.cc
1 // 2002-05-10 ghazi
2
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.
10
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.
15
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.
20
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.
29
30 // { dg-do run }
31
32 #include <locale>
33 #include <testsuite_hooks.h>
34
35 typedef wchar_t char_type;
36 typedef std::char_traits<char_type> traits_type;
37 class gnu_ctype: public std::ctype<char_type> { };
38
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))
49
50 #ifdef _GLIBCPP_USE_WCHAR_T
51 // Sanity check scan_is() and scan_not().
52 void test01()
53 {
54   bool test = true;
55
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"/////";
67   
68   gnu_ctype gctype;
69
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);
82
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);
94
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);
107   
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);
119   
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);
132   
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);
144   
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);
157   
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);
169   
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);
182   
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);
194   
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);
207   
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);
219   
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);
232   
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);
244   
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);
257   
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);
269   
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);
282   
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);
294   
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);
307   
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);
318   
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);
331
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);
343 }
344 #endif
345
346 int main() 
347 {
348 #ifdef _GLIBCPP_USE_WCHAR_T
349   test01();
350 #endif
351   return 0;
352 }