1 /* Test of filevercmp() function.
2 Copyright (C) 2008-2025 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)
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/>. */
19 #include "filevercmp.h"
26 /* set of well sorted examples */
27 static const char *const examples
[] =
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",
104 /* Sets of examples that should all sort equally. Each set is
105 terminated by NULL. */
106 static char const *const equals
[] =
114 "a\1c-00000000000000000000000000000000000000000000000000000027.txt",
118 ".a\1c-00000000000000000000000000000000000000000000000000000027.txt",
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. */
146 test_filevercmp (char const *a
, char const *b
)
148 int result
= filevercmp (a
, b
);
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')
160 int nresult
= filenvercmp (buffer
, alen
, buffer
+ alen
, blen
);
161 ASSERT (sign (nresult
) == sign (result
));
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
);
197 for (i
= equals
; i
< equals
+ sizeof equals
/ sizeof *equals
; 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
;