test-framework-sh: Don't leave temporary directories on NetBSD.
[gnulib.git] / tests / test-wcsncmp.c
blob6db6c248ef7eecd2d5cafb61bb5d7c71e96d6794
1 /* Test of wcsncmp() function.
2 Copyright (C) 2010-2024 Free Software Foundation, Inc.
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.
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.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <https://www.gnu.org/licenses/>. */
17 /* Written by Bruno Haible <bruno@clisp.org>, 2023. */
19 #include <config.h>
21 #include <wchar.h>
23 #include "signature.h"
24 SIGNATURE_CHECK (wcsncmp, int, (const wchar_t *, const wchar_t *, size_t));
26 #include "macros.h"
28 int
29 main (int argc, char *argv[])
31 /* Test simple cases. */
33 static const wchar_t input1[] = { 0 };
34 static const wchar_t input2[] = { 0 };
35 ASSERT (wcsncmp (input1, input2, 0) == 0);
36 ASSERT (wcsncmp (input1, input2, 1) == 0);
37 ASSERT (wcsncmp (input1, input2, 1000000) == 0);
40 static const wchar_t input1[] = { 0 };
41 static const wchar_t input2[] = { 'f', 'o', 'o', 0 };
42 ASSERT (wcsncmp (input1, input2, 0) == 0);
43 ASSERT (wcsncmp (input1, input2, 1) < 0);
44 ASSERT (wcsncmp (input2, input1, 1) > 0);
45 ASSERT (wcsncmp (input1, input2, 3) < 0);
46 ASSERT (wcsncmp (input2, input1, 3) > 0);
47 ASSERT (wcsncmp (input1, input2, 4) < 0);
48 ASSERT (wcsncmp (input2, input1, 4) > 0);
49 ASSERT (wcsncmp (input1, input2, 1000000) < 0);
50 ASSERT (wcsncmp (input2, input1, 1000000) > 0);
53 static const wchar_t input1[] = { 'f', 'o', 'o', 0 };
54 static const wchar_t input2[] = { 'f', 'o', 'o', 0 };
55 ASSERT (wcsncmp (input1, input2, 0) == 0);
56 ASSERT (wcsncmp (input1, input2, 1) == 0);
57 ASSERT (wcsncmp (input1, input2, 2) == 0);
58 ASSERT (wcsncmp (input1, input2, 3) == 0);
59 ASSERT (wcsncmp (input1, input2, 4) == 0);
60 ASSERT (wcsncmp (input1, input2, 1000000) == 0);
63 static const wchar_t input1[] = { 'f', 'o', 'o', 0 };
64 static const wchar_t input2[] = { 'b', 'a', 'r', 0 };
65 ASSERT (wcsncmp (input1, input2, 0) == 0);
66 ASSERT (wcsncmp (input1, input2, 1) > 0);
67 ASSERT (wcsncmp (input2, input1, 1) < 0);
68 ASSERT (wcsncmp (input1, input2, 2) > 0);
69 ASSERT (wcsncmp (input2, input1, 2) < 0);
70 ASSERT (wcsncmp (input1, input2, 1000000) > 0);
71 ASSERT (wcsncmp (input2, input1, 1000000) < 0);
74 static const wchar_t input1[] = { 'f', 'o', 'o', 0 };
75 static const wchar_t input2[] = { 'f', 'o', 'o', 'b', 'a', 'r', 0 };
76 ASSERT (wcsncmp (input1, input2, 0) == 0);
77 ASSERT (wcsncmp (input1, input2, 1) == 0);
78 ASSERT (wcsncmp (input1, input2, 2) == 0);
79 ASSERT (wcsncmp (input1, input2, 3) == 0);
80 ASSERT (wcsncmp (input1, input2, 4) < 0);
81 ASSERT (wcsncmp (input2, input1, 4) > 0);
82 ASSERT (wcsncmp (input1, input2, 1000000) < 0);
83 ASSERT (wcsncmp (input2, input1, 1000000) > 0);
86 static const wchar_t input1[] = { 'o', 'o', 'm', 'p', 'h', 0 };
87 static const wchar_t input2[] = { 'o', 'o', 'p', 's', 0 };
88 ASSERT (wcsncmp (input1, input2, 0) == 0);
89 ASSERT (wcsncmp (input1, input2, 1) == 0);
90 ASSERT (wcsncmp (input1, input2, 2) == 0);
91 ASSERT (wcsncmp (input1, input2, 3) < 0);
92 ASSERT (wcsncmp (input2, input1, 3) > 0);
93 ASSERT (wcsncmp (input1, input2, 4) < 0);
94 ASSERT (wcsncmp (input2, input1, 4) > 0);
95 ASSERT (wcsncmp (input1, input2, 5) < 0);
96 ASSERT (wcsncmp (input2, input1, 5) > 0);
97 ASSERT (wcsncmp (input1, input2, 6) < 0);
98 ASSERT (wcsncmp (input2, input1, 6) > 0);
99 ASSERT (wcsncmp (input1, input2, 1000000) < 0);
100 ASSERT (wcsncmp (input2, input1, 1000000) > 0);
103 /* ISO C requires wcsncmp to work with all wchar_t values.
104 ISO C 17 § 7.29.4.4 says:
105 "Unless explicitly stated otherwise, the functions described in this
106 subclause order two wide characters the same way as two integers of
107 the underlying integer type designated by wchar_t." */
109 static const wchar_t input1[] = { (wchar_t) 0x76547654, 0 };
110 static const wchar_t input2[] = { (wchar_t) 0x9abc9abc, 0 };
111 ASSERT (wcsncmp (input1, input2, 0) == 0);
112 if ((wchar_t)-1 < 0)
114 /* wchar_t is signed. */
115 ASSERT (wcsncmp (input1, input2, 1) > 0);
116 ASSERT (wcsncmp (input2, input1, 1) < 0);
117 ASSERT (wcsncmp (input1, input2, 2) > 0);
118 ASSERT (wcsncmp (input2, input1, 2) < 0);
119 ASSERT (wcsncmp (input1, input2, 1000000) > 0);
120 ASSERT (wcsncmp (input2, input1, 1000000) < 0);
122 else
124 /* wchar_t is unsigned. */
125 ASSERT (wcsncmp (input1, input2, 1) < 0);
126 ASSERT (wcsncmp (input2, input1, 1) > 0);
127 ASSERT (wcsncmp (input1, input2, 2) < 0);
128 ASSERT (wcsncmp (input2, input1, 2) > 0);
129 ASSERT (wcsncmp (input1, input2, 1000000) < 0);
130 ASSERT (wcsncmp (input2, input1, 1000000) > 0);
134 static const wchar_t input1[] = { (wchar_t) 0x9abc9abc, 0 };
135 static const wchar_t input2[] = { (wchar_t) 0x9bdf9bdf, 0 };
136 ASSERT (wcsncmp (input1, input2, 0) == 0);
137 ASSERT (wcsncmp (input1, input2, 1) < 0);
138 ASSERT (wcsncmp (input2, input1, 1) > 0);
139 ASSERT (wcsncmp (input1, input2, 2) < 0);
140 ASSERT (wcsncmp (input2, input1, 2) > 0);
141 ASSERT (wcsncmp (input1, input2, 1000000) < 0);
142 ASSERT (wcsncmp (input2, input1, 1000000) > 0);
145 /* Comparing a negative wchar_t value against a null wchar_t.
146 ISO C 17 § 7.29.4.4.1 says:
147 "The wcsncmp function compares the wide string pointed to by s1 to
148 the wide string pointed to by s2."
149 ISO C 17 § 7.1.1 defines the term "wide string":
150 "A wide string is a contiguous sequence of wide characters terminated
151 by and including the first null wide character."
152 This means that the comparison extends up to and *including* the first
153 null wchar_t. */
155 static const wchar_t input1[] = { (wchar_t) 'x', 0 };
156 static const wchar_t input2[] = { (wchar_t) 'x', (wchar_t) 0x9abc9abc, 0 };
157 ASSERT (wcsncmp (input1, input2, 0) == 0);
158 ASSERT (wcsncmp (input1, input2, 1) == 0);
159 if ((wchar_t)-1 < 0)
161 /* wchar_t is signed. */
162 ASSERT (wcsncmp (input1, input2, 2) > 0);
163 ASSERT (wcsncmp (input2, input1, 2) < 0);
164 ASSERT (wcsncmp (input1, input2, 3) > 0);
165 ASSERT (wcsncmp (input2, input1, 3) < 0);
166 ASSERT (wcsncmp (input1, input2, 1000000) > 0);
167 ASSERT (wcsncmp (input2, input1, 1000000) < 0);
169 else
171 /* wchar_t is unsigned. */
172 ASSERT (wcsncmp (input1, input2, 2) < 0);
173 ASSERT (wcsncmp (input2, input1, 2) > 0);
174 ASSERT (wcsncmp (input1, input2, 3) < 0);
175 ASSERT (wcsncmp (input2, input1, 3) > 0);
176 ASSERT (wcsncmp (input1, input2, 1000000) < 0);
177 ASSERT (wcsncmp (input2, input1, 1000000) > 0);
181 return test_exit_status;