Use spaces for indentation, not tabs.
[gnulib.git] / tests / test-c-ctype.c
1 /* Test of character handling in C locale.
2    Copyright (C) 2005, 2007-2008 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           fflush (stderr);                                                   \
34           abort ();                                                          \
35         }                                                                    \
36     }                                                                        \
37   while (0)
38
39 static void
40 test_all (void)
41 {
42   int c;
43
44   for (c = -0x80; c < 0x100; c++)
45     {
46       ASSERT (c_isascii (c) == (c >= 0 && c < 0x80));
47
48       switch (c)
49         {
50         case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
51         case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
52         case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
53         case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
54         case 'Y': case 'Z':
55         case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
56         case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
57         case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
58         case 's': case 't': case 'u': case 'v': case 'w': case 'x':
59         case 'y': case 'z':
60         case '0': case '1': case '2': case '3': case '4': case '5':
61         case '6': case '7': case '8': case '9':
62           ASSERT (c_isalnum (c) == 1);
63           break;
64         default:
65           ASSERT (c_isalnum (c) == 0);
66           break;
67         }
68
69       switch (c)
70         {
71         case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
72         case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
73         case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
74         case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
75         case 'Y': case 'Z':
76         case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
77         case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
78         case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
79         case 's': case 't': case 'u': case 'v': case 'w': case 'x':
80         case 'y': case 'z':
81           ASSERT (c_isalpha (c) == 1);
82           break;
83         default:
84           ASSERT (c_isalpha (c) == 0);
85           break;
86         }
87
88       switch (c)
89         {
90         case '\t': case ' ':
91           ASSERT (c_isblank (c) == 1);
92           break;
93         default:
94           ASSERT (c_isblank (c) == 0);
95           break;
96         }
97
98       ASSERT (c_iscntrl (c) == ((c >= 0 && c < 0x20) || c == 0x7f));
99
100       switch (c)
101         {
102         case '0': case '1': case '2': case '3': case '4': case '5':
103         case '6': case '7': case '8': case '9':
104           ASSERT (c_isdigit (c) == 1);
105           break;
106         default:
107           ASSERT (c_isdigit (c) == 0);
108           break;
109         }
110
111       switch (c)
112         {
113         case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
114         case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
115         case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
116         case 's': case 't': case 'u': case 'v': case 'w': case 'x':
117         case 'y': case 'z':
118           ASSERT (c_islower (c) == 1);
119           break;
120         default:
121           ASSERT (c_islower (c) == 0);
122           break;
123         }
124
125       ASSERT (c_isgraph (c) == ((c >= 0x20 && c < 0x7f) && c != ' '));
126
127       ASSERT (c_isprint (c) == (c >= 0x20 && c < 0x7f));
128
129       ASSERT (c_ispunct (c) == (c_isgraph (c) && !c_isalnum (c)));
130
131       switch (c)
132         {
133         case ' ': case '\t': case '\n': case '\v': case '\f': case '\r':
134           ASSERT (c_isspace (c) == 1);
135           break;
136         default:
137           ASSERT (c_isspace (c) == 0);
138           break;
139         }
140
141       switch (c)
142         {
143         case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
144         case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
145         case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
146         case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
147         case 'Y': case 'Z':
148           ASSERT (c_isupper (c) == 1);
149           break;
150         default:
151           ASSERT (c_isupper (c) == 0);
152           break;
153         }
154
155       switch (c)
156         {
157         case '0': case '1': case '2': case '3': case '4': case '5':
158         case '6': case '7': case '8': case '9':
159         case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
160         case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
161           ASSERT (c_isxdigit (c) == 1);
162           break;
163         default:
164           ASSERT (c_isxdigit (c) == 0);
165           break;
166         }
167
168       switch (c)
169         {
170         case 'A':
171           ASSERT (c_tolower (c) == 'a');
172           ASSERT (c_toupper (c) == c);
173           break;
174         case 'B':
175           ASSERT (c_tolower (c) == 'b');
176           ASSERT (c_toupper (c) == c);
177           break;
178         case 'C':
179           ASSERT (c_tolower (c) == 'c');
180           ASSERT (c_toupper (c) == c);
181           break;
182         case 'D':
183           ASSERT (c_tolower (c) == 'd');
184           ASSERT (c_toupper (c) == c);
185           break;
186         case 'E':
187           ASSERT (c_tolower (c) == 'e');
188           ASSERT (c_toupper (c) == c);
189           break;
190         case 'F':
191           ASSERT (c_tolower (c) == 'f');
192           ASSERT (c_toupper (c) == c);
193           break;
194         case 'G':
195           ASSERT (c_tolower (c) == 'g');
196           ASSERT (c_toupper (c) == c);
197           break;
198         case 'H':
199           ASSERT (c_tolower (c) == 'h');
200           ASSERT (c_toupper (c) == c);
201           break;
202         case 'I':
203           ASSERT (c_tolower (c) == 'i');
204           ASSERT (c_toupper (c) == c);
205           break;
206         case 'J':
207           ASSERT (c_tolower (c) == 'j');
208           ASSERT (c_toupper (c) == c);
209           break;
210         case 'K':
211           ASSERT (c_tolower (c) == 'k');
212           ASSERT (c_toupper (c) == c);
213           break;
214         case 'L':
215           ASSERT (c_tolower (c) == 'l');
216           ASSERT (c_toupper (c) == c);
217           break;
218         case 'M':
219           ASSERT (c_tolower (c) == 'm');
220           ASSERT (c_toupper (c) == c);
221           break;
222         case 'N':
223           ASSERT (c_tolower (c) == 'n');
224           ASSERT (c_toupper (c) == c);
225           break;
226         case 'O':
227           ASSERT (c_tolower (c) == 'o');
228           ASSERT (c_toupper (c) == c);
229           break;
230         case 'P':
231           ASSERT (c_tolower (c) == 'p');
232           ASSERT (c_toupper (c) == c);
233           break;
234         case 'Q':
235           ASSERT (c_tolower (c) == 'q');
236           ASSERT (c_toupper (c) == c);
237           break;
238         case 'R':
239           ASSERT (c_tolower (c) == 'r');
240           ASSERT (c_toupper (c) == c);
241           break;
242         case 'S':
243           ASSERT (c_tolower (c) == 's');
244           ASSERT (c_toupper (c) == c);
245           break;
246         case 'T':
247           ASSERT (c_tolower (c) == 't');
248           ASSERT (c_toupper (c) == c);
249           break;
250         case 'U':
251           ASSERT (c_tolower (c) == 'u');
252           ASSERT (c_toupper (c) == c);
253           break;
254         case 'V':
255           ASSERT (c_tolower (c) == 'v');
256           ASSERT (c_toupper (c) == c);
257           break;
258         case 'W':
259           ASSERT (c_tolower (c) == 'w');
260           ASSERT (c_toupper (c) == c);
261           break;
262         case 'X':
263           ASSERT (c_tolower (c) == 'x');
264           ASSERT (c_toupper (c) == c);
265           break;
266         case 'Y':
267           ASSERT (c_tolower (c) == 'y');
268           ASSERT (c_toupper (c) == c);
269           break;
270         case 'Z':
271           ASSERT (c_tolower (c) == 'z');
272           ASSERT (c_toupper (c) == c);
273           break;
274         case 'a':
275           ASSERT (c_tolower (c) == c);
276           ASSERT (c_toupper (c) == 'A');
277           break;
278         case 'b':
279           ASSERT (c_tolower (c) == c);
280           ASSERT (c_toupper (c) == 'B');
281           break;
282         case 'c':
283           ASSERT (c_tolower (c) == c);
284           ASSERT (c_toupper (c) == 'C');
285           break;
286         case 'd':
287           ASSERT (c_tolower (c) == c);
288           ASSERT (c_toupper (c) == 'D');
289           break;
290         case 'e':
291           ASSERT (c_tolower (c) == c);
292           ASSERT (c_toupper (c) == 'E');
293           break;
294         case 'f':
295           ASSERT (c_tolower (c) == c);
296           ASSERT (c_toupper (c) == 'F');
297           break;
298         case 'g':
299           ASSERT (c_tolower (c) == c);
300           ASSERT (c_toupper (c) == 'G');
301           break;
302         case 'h':
303           ASSERT (c_tolower (c) == c);
304           ASSERT (c_toupper (c) == 'H');
305           break;
306         case 'i':
307           ASSERT (c_tolower (c) == c);
308           ASSERT (c_toupper (c) == 'I');
309           break;
310         case 'j':
311           ASSERT (c_tolower (c) == c);
312           ASSERT (c_toupper (c) == 'J');
313           break;
314         case 'k':
315           ASSERT (c_tolower (c) == c);
316           ASSERT (c_toupper (c) == 'K');
317           break;
318         case 'l':
319           ASSERT (c_tolower (c) == c);
320           ASSERT (c_toupper (c) == 'L');
321           break;
322         case 'm':
323           ASSERT (c_tolower (c) == c);
324           ASSERT (c_toupper (c) == 'M');
325           break;
326         case 'n':
327           ASSERT (c_tolower (c) == c);
328           ASSERT (c_toupper (c) == 'N');
329           break;
330         case 'o':
331           ASSERT (c_tolower (c) == c);
332           ASSERT (c_toupper (c) == 'O');
333           break;
334         case 'p':
335           ASSERT (c_tolower (c) == c);
336           ASSERT (c_toupper (c) == 'P');
337           break;
338         case 'q':
339           ASSERT (c_tolower (c) == c);
340           ASSERT (c_toupper (c) == 'Q');
341           break;
342         case 'r':
343           ASSERT (c_tolower (c) == c);
344           ASSERT (c_toupper (c) == 'R');
345           break;
346         case 's':
347           ASSERT (c_tolower (c) == c);
348           ASSERT (c_toupper (c) == 'S');
349           break;
350         case 't':
351           ASSERT (c_tolower (c) == c);
352           ASSERT (c_toupper (c) == 'T');
353           break;
354         case 'u':
355           ASSERT (c_tolower (c) == c);
356           ASSERT (c_toupper (c) == 'U');
357           break;
358         case 'v':
359           ASSERT (c_tolower (c) == c);
360           ASSERT (c_toupper (c) == 'V');
361           break;
362         case 'w':
363           ASSERT (c_tolower (c) == c);
364           ASSERT (c_toupper (c) == 'W');
365           break;
366         case 'x':
367           ASSERT (c_tolower (c) == c);
368           ASSERT (c_toupper (c) == 'X');
369           break;
370         case 'y':
371           ASSERT (c_tolower (c) == c);
372           ASSERT (c_toupper (c) == 'Y');
373           break;
374         case 'z':
375           ASSERT (c_tolower (c) == c);
376           ASSERT (c_toupper (c) == 'Z');
377           break;
378         default:
379           ASSERT (c_tolower (c) == c);
380           ASSERT (c_toupper (c) == c);
381           break;
382         }
383     }
384 }
385
386 int
387 main ()
388 {
389   test_all ();
390
391   setlocale (LC_ALL, "de_DE");
392   test_all ();
393
394   setlocale (LC_ALL, "ja_JP.EUC-JP");
395   test_all ();
396
397   return 0;
398 }