nstrftime, c-nstrftime tests: Avoid test failures on native Windows.
[gnulib.git] / tests / test-filevercmp.c
blob20f3626b6a9897c1365adb16d662f28a4b1f62a6
1 /* Test of filevercmp() function.
2 Copyright (C) 2008-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, or (at your option)
7 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 #include <config.h>
19 #include "filevercmp.h"
21 #include <stddef.h>
22 #include <string.h>
24 #include "macros.h"
26 /* set of well sorted examples */
27 static const char *const examples[] =
29 "",
30 ".",
31 "..",
32 ".0",
33 ".9",
34 ".A",
35 ".Z",
36 ".a~",
37 ".a",
38 ".b~",
39 ".b",
40 ".z",
41 ".zz~",
42 ".zz",
43 ".zz.~1~",
44 ".zz.0",
45 ".\1",
46 ".\1.txt",
47 ".\1x",
48 ".\1x\1",
49 ".\1.0",
50 "0",
51 "9",
52 "A",
53 "Z",
54 "a~",
55 "a",
56 "a.b~",
57 "a.b",
58 "a.bc~",
59 "a.bc",
60 "a+",
61 "a.",
62 "a..a",
63 "a.+",
64 "b~",
65 "b",
66 "gcc-c++-10.fc9.tar.gz",
67 "gcc-c++-10.fc9.tar.gz.~1~",
68 "gcc-c++-10.fc9.tar.gz.~2~",
69 "gcc-c++-10.8.12-0.7rc2.fc9.tar.bz2",
70 "gcc-c++-10.8.12-0.7rc2.fc9.tar.bz2.~1~",
71 "glibc-2-0.1.beta1.fc10.rpm",
72 "glibc-common-5-0.2.beta2.fc9.ebuild",
73 "glibc-common-5-0.2b.deb",
74 "glibc-common-11b.ebuild",
75 "glibc-common-11-0.6rc2.ebuild",
76 "libstdc++-0.5.8.11-0.7rc2.fc10.tar.gz",
77 "libstdc++-4a.fc8.tar.gz",
78 "libstdc++-4.10.4.20040204svn.rpm",
79 "libstdc++-devel-3.fc8.ebuild",
80 "libstdc++-devel-3a.fc9.tar.gz",
81 "libstdc++-devel-8.fc8.deb",
82 "libstdc++-devel-8.6.2-0.4b.fc8",
83 "nss_ldap-1-0.2b.fc9.tar.bz2",
84 "nss_ldap-1-0.6rc2.fc8.tar.gz",
85 "nss_ldap-1.0-0.1a.tar.gz",
86 "nss_ldap-10beta1.fc8.tar.gz",
87 "nss_ldap-10.11.8.6.20040204cvs.fc10.ebuild",
88 "z",
89 "zz~",
90 "zz",
91 "zz.~1~",
92 "zz.0",
93 "zz.0.txt",
94 "\1",
95 "\1.txt",
96 "\1x",
97 "\1x\1",
98 "\1.0",
99 "#\1.b#",
100 "#.b#",
101 NULL
104 /* Sets of examples that should all sort equally. Each set is
105 terminated by NULL. */
106 static char const *const equals[] =
108 "a",
109 "a0",
110 "a0000",
111 NULL,
112 "a\1c-27.txt",
113 "a\1c-027.txt",
114 "a\1c-00000000000000000000000000000000000000000000000000000027.txt",
115 NULL,
116 ".a\1c-27.txt",
117 ".a\1c-027.txt",
118 ".a\1c-00000000000000000000000000000000000000000000000000000027.txt",
119 NULL,
120 "a\1c-",
121 "a\1c-0",
122 "a\1c-00",
123 NULL,
124 ".a\1c-",
125 ".a\1c-0",
126 ".a\1c-00",
127 NULL,
128 "a\1c-0.txt",
129 "a\1c-00.txt",
130 NULL,
131 ".a\1c-1\1.txt",
132 ".a\1c-001\1.txt",
133 NULL,
136 static int
137 sign (int i)
139 return i < 0 ? -1 : 0 < i;
142 /* Return filevercmp (A, B), checking that a similar result is gotten
143 after replacing all '\1's with '\0's and calling filenvercmp with
144 the embedded '\0's. */
145 static int
146 test_filevercmp (char const *a, char const *b)
148 int result = filevercmp (a, b);
150 char buffer[1000];
152 ptrdiff_t alen = strlen (a), blen = strlen (b);
153 ASSERT (alen + blen <= sizeof buffer);
154 memcpy (buffer, a, alen);
155 memcpy (buffer + alen, b, blen);
156 for (ptrdiff_t i = 0; i < alen + blen; i++)
157 if (buffer[i] == '\1')
158 buffer[i] = '\0';
160 int nresult = filenvercmp (buffer, alen, buffer + alen, blen);
161 ASSERT (sign (nresult) == sign (result));
163 return result;
167 main (void)
169 const char *const *i;
171 /* Following tests taken from test-strverscmp.c */
172 ASSERT (filevercmp ("", "") == 0);
173 ASSERT (filevercmp ("a", "a") == 0);
174 ASSERT (filevercmp ("a", "b") < 0);
175 ASSERT (filevercmp ("b", "a") > 0);
176 ASSERT (filevercmp ("00", "01") < 0);
177 ASSERT (filevercmp ("01", "010") < 0);
178 ASSERT (filevercmp ("9", "10") < 0);
179 ASSERT (filevercmp ("0a", "0") > 0);
181 /* compare each version string with each other - O(n^2) */
182 for (i = examples; *i; i++)
184 const char *const *j;
185 for (j = examples; *j; j++)
187 int result = test_filevercmp (*i, *j);
188 if (result < 0)
189 ASSERT (i < j);
190 else if (0 < result)
191 ASSERT (j < i);
192 else
193 ASSERT (i == j);
197 for (i = equals; i < equals + sizeof equals / sizeof *equals; i++)
198 for (; *i; i++)
199 for (char const *const *j = i; *j; j++)
201 ASSERT (test_filevercmp (*i, *j) == 0);
202 ASSERT (test_filevercmp (*j, *i) == 0);
205 return test_exit_status;