Change copyright notice from GPLv2+ to GPLv3+.
[gnulib.git] / tests / test-c-ctype.c
1 /* Test of character handling in C locale.
2    Copyright (C) 2005, 2007 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
16
17 /* Written by Bruno Haible <bruno@clisp.org>, 2005.  */
18
19 #include <config.h>
20
21 #include "c-ctype.h"
22
23 #include <locale.h>
24 #include <stdio.h>
25 #include <stdlib.h>
26
27 #define ASSERT(expr) \
28   do                                                                         \
29     {                                                                        \
30       if (!(expr))                                                           \
31         {                                                                    \
32           fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \
33           abort ();                                                          \
34         }                                                                    \
35     }                                                                        \
36   while (0)
37
38 static void
39 test_all (void)
40 {
41   int c;
42
43   for (c = -0x80; c < 0x100; c++)
44     {
45       ASSERT (c_isascii (c) == (c >= 0 && c < 0x80));
46
47       switch (c)
48         {
49         case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
50         case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
51         case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
52         case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
53         case 'Y': case 'Z':
54         case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
55         case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
56         case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
57         case 's': case 't': case 'u': case 'v': case 'w': case 'x':
58         case 'y': case 'z':
59         case '0': case '1': case '2': case '3': case '4': case '5':
60         case '6': case '7': case '8': case '9':
61           ASSERT (c_isalnum (c) == 1);
62           break;
63         default:
64           ASSERT (c_isalnum (c) == 0);
65           break;
66         }
67
68       switch (c)
69         {
70         case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
71         case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
72         case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
73         case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
74         case 'Y': case 'Z':
75         case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
76         case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
77         case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
78         case 's': case 't': case 'u': case 'v': case 'w': case 'x':
79         case 'y': case 'z':
80           ASSERT (c_isalpha (c) == 1);
81           break;
82         default:
83           ASSERT (c_isalpha (c) == 0);
84           break;
85         }
86
87       switch (c)
88         {
89         case '\t': case ' ':
90           ASSERT (c_isblank (c) == 1);
91           break;
92         default:
93           ASSERT (c_isblank (c) == 0);
94           break;
95         }
96
97       ASSERT (c_iscntrl (c) == ((c >= 0 && c < 0x20) || c == 0x7f));
98
99       switch (c)
100         {
101         case '0': case '1': case '2': case '3': case '4': case '5':
102         case '6': case '7': case '8': case '9':
103           ASSERT (c_isdigit (c) == 1);
104           break;
105         default:
106           ASSERT (c_isdigit (c) == 0);
107           break;
108         }
109
110       switch (c)
111         {
112         case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
113         case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
114         case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
115         case 's': case 't': case 'u': case 'v': case 'w': case 'x':
116         case 'y': case 'z':
117           ASSERT (c_islower (c) == 1);
118           break;
119         default:
120           ASSERT (c_islower (c) == 0);
121           break;
122         }
123
124       ASSERT (c_isgraph (c) == ((c >= 0x20 && c < 0x7f) && c != ' '));
125
126       ASSERT (c_isprint (c) == (c >= 0x20 && c < 0x7f));
127
128       ASSERT (c_ispunct (c) == (c_isgraph (c) && !c_isalnum (c)));
129
130       switch (c)
131         {
132         case ' ': case '\t': case '\n': case '\v': case '\f': case '\r':
133           ASSERT (c_isspace (c) == 1);
134           break;
135         default:
136           ASSERT (c_isspace (c) == 0);
137           break;
138         }
139
140       switch (c)
141         {
142         case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
143         case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
144         case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
145         case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
146         case 'Y': case 'Z':
147           ASSERT (c_isupper (c) == 1);
148           break;
149         default:
150           ASSERT (c_isupper (c) == 0);
151           break;
152         }
153
154       switch (c)
155         {
156         case '0': case '1': case '2': case '3': case '4': case '5':
157         case '6': case '7': case '8': case '9':
158         case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
159         case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
160           ASSERT (c_isxdigit (c) == 1);
161           break;
162         default:
163           ASSERT (c_isxdigit (c) == 0);
164           break;
165         }
166
167       switch (c)
168         {
169         case 'A':
170           ASSERT (c_tolower (c) == 'a');
171           ASSERT (c_toupper (c) == c);
172           break;
173         case 'B':
174           ASSERT (c_tolower (c) == 'b');
175           ASSERT (c_toupper (c) == c);
176           break;
177         case 'C':
178           ASSERT (c_tolower (c) == 'c');
179           ASSERT (c_toupper (c) == c);
180           break;
181         case 'D':
182           ASSERT (c_tolower (c) == 'd');
183           ASSERT (c_toupper (c) == c);
184           break;
185         case 'E':
186           ASSERT (c_tolower (c) == 'e');
187           ASSERT (c_toupper (c) == c);
188           break;
189         case 'F':
190           ASSERT (c_tolower (c) == 'f');
191           ASSERT (c_toupper (c) == c);
192           break;
193         case 'G':
194           ASSERT (c_tolower (c) == 'g');
195           ASSERT (c_toupper (c) == c);
196           break;
197         case 'H':
198           ASSERT (c_tolower (c) == 'h');
199           ASSERT (c_toupper (c) == c);
200           break;
201         case 'I':
202           ASSERT (c_tolower (c) == 'i');
203           ASSERT (c_toupper (c) == c);
204           break;
205         case 'J':
206           ASSERT (c_tolower (c) == 'j');
207           ASSERT (c_toupper (c) == c);
208           break;
209         case 'K':
210           ASSERT (c_tolower (c) == 'k');
211           ASSERT (c_toupper (c) == c);
212           break;
213         case 'L':
214           ASSERT (c_tolower (c) == 'l');
215           ASSERT (c_toupper (c) == c);
216           break;
217         case 'M':
218           ASSERT (c_tolower (c) == 'm');
219           ASSERT (c_toupper (c) == c);
220           break;
221         case 'N':
222           ASSERT (c_tolower (c) == 'n');
223           ASSERT (c_toupper (c) == c);
224           break;
225         case 'O':
226           ASSERT (c_tolower (c) == 'o');
227           ASSERT (c_toupper (c) == c);
228           break;
229         case 'P':
230           ASSERT (c_tolower (c) == 'p');
231           ASSERT (c_toupper (c) == c);
232           break;
233         case 'Q':
234           ASSERT (c_tolower (c) == 'q');
235           ASSERT (c_toupper (c) == c);
236           break;
237         case 'R':
238           ASSERT (c_tolower (c) == 'r');
239           ASSERT (c_toupper (c) == c);
240           break;
241         case 'S':
242           ASSERT (c_tolower (c) == 's');
243           ASSERT (c_toupper (c) == c);
244           break;
245         case 'T':
246           ASSERT (c_tolower (c) == 't');
247           ASSERT (c_toupper (c) == c);
248           break;
249         case 'U':
250           ASSERT (c_tolower (c) == 'u');
251           ASSERT (c_toupper (c) == c);
252           break;
253         case 'V':
254           ASSERT (c_tolower (c) == 'v');
255           ASSERT (c_toupper (c) == c);
256           break;
257         case 'W':
258           ASSERT (c_tolower (c) == 'w');
259           ASSERT (c_toupper (c) == c);
260           break;
261         case 'X':
262           ASSERT (c_tolower (c) == 'x');
263           ASSERT (c_toupper (c) == c);
264           break;
265         case 'Y':
266           ASSERT (c_tolower (c) == 'y');
267           ASSERT (c_toupper (c) == c);
268           break;
269         case 'Z':
270           ASSERT (c_tolower (c) == 'z');
271           ASSERT (c_toupper (c) == c);
272           break;
273         case 'a':
274           ASSERT (c_tolower (c) == c);
275           ASSERT (c_toupper (c) == 'A');
276           break;
277         case 'b':
278           ASSERT (c_tolower (c) == c);
279           ASSERT (c_toupper (c) == 'B');
280           break;
281         case 'c':
282           ASSERT (c_tolower (c) == c);
283           ASSERT (c_toupper (c) == 'C');
284           break;
285         case 'd':
286           ASSERT (c_tolower (c) == c);
287           ASSERT (c_toupper (c) == 'D');
288           break;
289         case 'e':
290           ASSERT (c_tolower (c) == c);
291           ASSERT (c_toupper (c) == 'E');
292           break;
293         case 'f':
294           ASSERT (c_tolower (c) == c);
295           ASSERT (c_toupper (c) == 'F');
296           break;
297         case 'g':
298           ASSERT (c_tolower (c) == c);
299           ASSERT (c_toupper (c) == 'G');
300           break;
301         case 'h':
302           ASSERT (c_tolower (c) == c);
303           ASSERT (c_toupper (c) == 'H');
304           break;
305         case 'i':
306           ASSERT (c_tolower (c) == c);
307           ASSERT (c_toupper (c) == 'I');
308           break;
309         case 'j':
310           ASSERT (c_tolower (c) == c);
311           ASSERT (c_toupper (c) == 'J');
312           break;
313         case 'k':
314           ASSERT (c_tolower (c) == c);
315           ASSERT (c_toupper (c) == 'K');
316           break;
317         case 'l':
318           ASSERT (c_tolower (c) == c);
319           ASSERT (c_toupper (c) == 'L');
320           break;
321         case 'm':
322           ASSERT (c_tolower (c) == c);
323           ASSERT (c_toupper (c) == 'M');
324           break;
325         case 'n':
326           ASSERT (c_tolower (c) == c);
327           ASSERT (c_toupper (c) == 'N');
328           break;
329         case 'o':
330           ASSERT (c_tolower (c) == c);
331           ASSERT (c_toupper (c) == 'O');
332           break;
333         case 'p':
334           ASSERT (c_tolower (c) == c);
335           ASSERT (c_toupper (c) == 'P');
336           break;
337         case 'q':
338           ASSERT (c_tolower (c) == c);
339           ASSERT (c_toupper (c) == 'Q');
340           break;
341         case 'r':
342           ASSERT (c_tolower (c) == c);
343           ASSERT (c_toupper (c) == 'R');
344           break;
345         case 's':
346           ASSERT (c_tolower (c) == c);
347           ASSERT (c_toupper (c) == 'S');
348           break;
349         case 't':
350           ASSERT (c_tolower (c) == c);
351           ASSERT (c_toupper (c) == 'T');
352           break;
353         case 'u':
354           ASSERT (c_tolower (c) == c);
355           ASSERT (c_toupper (c) == 'U');
356           break;
357         case 'v':
358           ASSERT (c_tolower (c) == c);
359           ASSERT (c_toupper (c) == 'V');
360           break;
361         case 'w':
362           ASSERT (c_tolower (c) == c);
363           ASSERT (c_toupper (c) == 'W');
364           break;
365         case 'x':
366           ASSERT (c_tolower (c) == c);
367           ASSERT (c_toupper (c) == 'X');
368           break;
369         case 'y':
370           ASSERT (c_tolower (c) == c);
371           ASSERT (c_toupper (c) == 'Y');
372           break;
373         case 'z':
374           ASSERT (c_tolower (c) == c);
375           ASSERT (c_toupper (c) == 'Z');
376           break;
377         default:
378           ASSERT (c_tolower (c) == c);
379           ASSERT (c_toupper (c) == c);
380           break;
381         }
382     }
383 }
384
385 int
386 main ()
387 {
388   test_all ();
389
390   setlocale (LC_ALL, "de_DE");
391   test_all ();
392
393   setlocale (LC_ALL, "ja_JP.EUC-JP");
394   test_all ();
395
396   return 0;
397 }