1 /*
2 * Copyright (c) 2014 Lauri Tirkkonen <lotheac@iki.fi>
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17 /*
18 * This program tests that the characters defined in the POSIX-1.2008 Portable
19 * Character Set are classified correctly by the iswctype and isw* functions.
20 */
21
22 #include <stdlib.h>
23 #include <stdio.h>
24 #include <wchar.h>
25 #include <wctype.h>
26 #include <locale.h>
27 #include <err.h>
28 #include "test_common.h"
29
30 wint_t upper_should[] = L"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
31 wint_t lower_should[] = L"abcdefghijklmnopqrstuvwxyz";
32 wint_t digit_should[] = L"0123456789";
33 wint_t space_should[] = L"\t\n\v\f\r ";
34 wint_t cntrl_should[] = L"\a\b\t\n\v\f\r\0\001\002\003\004\005\006\016\017\020"
35 "\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037";
36 wint_t punct_should[] = L"!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~";
37 wint_t xdigit_should[] = L"0123456789ABCDEFabcdef";
38 wint_t blank_should[] = L" \t";
39 wint_t only_space_should[] = L" ";
40
41 #define test_ctype_subset(x, y) do {\
42 test_t t = test_start(#x "_should is subset of " #y);\
43 wctype_t class = wctype(#y);\
44 if (!class) test_failed(t, "wctype(\"%s\") returned 0", #y);\
45 size_t nchars = (sizeof (x ## _should) / sizeof (*x ## _should)) - 1;\
46 for (wint_t *wc = x ## _should; wc < x ## _should + nchars; wc++) {\
47 if (!iswctype(*wc, class))\
48 test_failed(t, "iswctype(L'%lc', wctype(\"%s\"))"\
49 "returned 0", *wc, #y);\
50 if (!isw ## y(*wc))\
51 test_failed(t, "isw%s(L'%lc') returned 0", #y, *wc);\
52 }\
53 test_passed(t);\
54 } while (*"\0")
55
56 #define test_ctype(x) test_ctype_subset(x, x)
57
main(void)58 int main(void) {
59 if (!setlocale(LC_CTYPE, "POSIX"))
60 err(1, "setlocale POSIX failed");
61 test_ctype(upper);
62 test_ctype(lower);
63 test_ctype(digit);
64 test_ctype(space);
65 test_ctype(cntrl);
66 test_ctype(punct);
67 test_ctype(xdigit);
68 test_ctype(blank);
69
70 test_ctype_subset(upper, alpha);
71 test_ctype_subset(lower, alpha);
72 test_ctype_subset(upper, alnum);
73 test_ctype_subset(lower, alnum);
74 test_ctype_subset(digit, alnum);
75 test_ctype_subset(upper, print);
76 test_ctype_subset(lower, print);
77 test_ctype_subset(digit, print);
78 test_ctype_subset(punct, print);
79 test_ctype_subset(only_space, print);
80 test_ctype_subset(upper, graph);
81 test_ctype_subset(lower, graph);
82 test_ctype_subset(digit, graph);
83 test_ctype_subset(punct, graph);
84 return (0);
85 }
86