Skip to content

Commit 492a1c0

Browse files
committed
test: Test wctype functions by comparing with native C library
Check every unicode code point using every wctype function and make sure the picolibc versions matches the native C library implemetation. This makes some bold assumptions that picolibc and the native C library are using the same Unicode tables. Signed-off-by: Keith Packard <[email protected]>
1 parent ccc0b09 commit 492a1c0

File tree

2 files changed

+119
-0
lines changed

2 files changed

+119
-0
lines changed

test/meson.build

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -708,6 +708,31 @@ if enable_native_tests
708708
link_args: native_c_args))
709709
endforeach
710710

711+
if newlib_mb
712+
diff = find_program('diff', required: false)
713+
714+
if diff.found()
715+
wctype = executable('test-wctype', 'test-wctype.c',
716+
c_args: _c_args,
717+
link_args: _link_args,
718+
objects: _objs,
719+
link_depends: _link_depends + _libs,
720+
include_directories: inc)
721+
722+
wctype_native = executable('test-wctype-native', 'test-wctype.c',
723+
c_args: native_c_args,
724+
link_args: native_c_args)
725+
726+
wctype_out = custom_target ('wctype-out', output: 'wctype-out',
727+
command: [wctype, '@OUTPUT@'])
728+
729+
wctype_native_out = custom_target ('wctype-native-out', output: 'wctype-native-out',
730+
command: [wctype_native, '@OUTPUT@'])
731+
732+
test('wctype-compare', diff, args: [wctype_out, wctype_native_out])
733+
endif
734+
endif
735+
711736
endif
712737

713738
subdir('libc-testsuite')

test/test-wctype.c

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
/*
2+
* SPDX-License-Identifier: BSD-3-Clause
3+
*
4+
* Copyright © 2024 Keith Packard
5+
*
6+
* Redistribution and use in source and binary forms, with or without
7+
* modification, are permitted provided that the following conditions
8+
* are met:
9+
*
10+
* 1. Redistributions of source code must retain the above copyright
11+
* notice, this list of conditions and the following disclaimer.
12+
*
13+
* 2. Redistributions in binary form must reproduce the above
14+
* copyright notice, this list of conditions and the following
15+
* disclaimer in the documentation and/or other materials provided
16+
* with the distribution.
17+
*
18+
* 3. Neither the name of the copyright holder nor the names of its
19+
* contributors may be used to endorse or promote products derived
20+
* from this software without specific prior written permission.
21+
*
22+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25+
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26+
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27+
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30+
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
31+
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
33+
* OF THE POSSIBILITY OF SUCH DAMAGE.
34+
*/
35+
36+
#include <wctype.h>
37+
#include <stdio.h>
38+
#include <stdlib.h>
39+
#include <locale.h>
40+
41+
static struct {
42+
char *n;
43+
int (*f)(wint_t);
44+
} funcs[] = {
45+
{ .n = "alnum", iswalnum },
46+
{ .n = "alpha", iswalpha },
47+
{ .n = "blank", iswblank },
48+
{ .n = "cntrl", iswcntrl },
49+
{ .n = "digit", iswdigit },
50+
{ .n = "graph", iswgraph },
51+
{ .n = "lower", iswlower },
52+
{ .n = "print", iswprint },
53+
{ .n = "punct", iswpunct },
54+
{ .n = "space", iswspace },
55+
{ .n = "upper", iswupper },
56+
{ .n = "xdigit", iswxdigit },
57+
};
58+
59+
#define NFUNC sizeof(funcs)/sizeof(funcs[0])
60+
61+
int main(int argc, char **argv)
62+
{
63+
wchar_t c;
64+
unsigned f;
65+
FILE *out = stdout;
66+
67+
if (argc > 1) {
68+
out = fopen(argv[1], "w");
69+
if (!out) {
70+
perror(argv[1]);
71+
exit(1);
72+
}
73+
}
74+
75+
c = 0x0000;
76+
setlocale(LC_ALL, "C.UTF-8");
77+
for (;;) {
78+
fprintf(out, "0x%04x", c);
79+
for (f = 0; f < NFUNC; f++)
80+
fprintf(out, "%6.6s ", funcs[f].f(c) ? funcs[f].n : " ");
81+
82+
fprintf(out, "\n");
83+
#if __SIZEOF_WCHAR_T__ == 2
84+
if (c == 0xffff)
85+
break;
86+
#else
87+
if (c == 0xe01ef)
88+
break;
89+
#endif
90+
c++;
91+
}
92+
fflush(out);
93+
return 0;
94+
}

0 commit comments

Comments
 (0)