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