xref: /freebsd/lib/libc/tests/string/strverscmp_test.c (revision 05c9a0158f6837bb3a3781e4ed75f66115f6415a)
1*05c9a015SAymeric Wibo /*-
2*05c9a015SAymeric Wibo * SPDX-License-Identifier: BSD-2-Clause
3*05c9a015SAymeric Wibo * Copyright (c) 2022 Aymeric Wibo <obiwac@gmail.com>
4*05c9a015SAymeric Wibo */
5*05c9a015SAymeric Wibo 
6*05c9a015SAymeric Wibo #include <atf-c.h>
7*05c9a015SAymeric Wibo #include <string.h>
8*05c9a015SAymeric Wibo 
9*05c9a015SAymeric Wibo static void
check_all(size_t len,const char * ordered[len])10*05c9a015SAymeric Wibo check_all(size_t len, const char *ordered[len])
11*05c9a015SAymeric Wibo {
12*05c9a015SAymeric Wibo 	const char *a, *b;
13*05c9a015SAymeric Wibo 
14*05c9a015SAymeric Wibo 	for (size_t i = 0; i < len; i++) {
15*05c9a015SAymeric Wibo 		for (size_t j = 0; j < len; j++) {
16*05c9a015SAymeric Wibo 			a = ordered[i];
17*05c9a015SAymeric Wibo 			b = ordered[j];
18*05c9a015SAymeric Wibo 
19*05c9a015SAymeric Wibo 			if (i == j)
20*05c9a015SAymeric Wibo 				ATF_CHECK_MSG(
21*05c9a015SAymeric Wibo 				    strverscmp(a, b) == 0,
22*05c9a015SAymeric Wibo 				    "strverscmp(\"%s\", \"%s\") == 0",
23*05c9a015SAymeric Wibo 				    a, b
24*05c9a015SAymeric Wibo 				);
25*05c9a015SAymeric Wibo 			else if (i < j)
26*05c9a015SAymeric Wibo 				ATF_CHECK_MSG(
27*05c9a015SAymeric Wibo 				    strverscmp(a, b) < 0,
28*05c9a015SAymeric Wibo 				    "strverscmp(\"%s\", \"%s\") < 0",
29*05c9a015SAymeric Wibo 				    a, b
30*05c9a015SAymeric Wibo 				);
31*05c9a015SAymeric Wibo 			else if (i > j)
32*05c9a015SAymeric Wibo 				ATF_CHECK_MSG(
33*05c9a015SAymeric Wibo 				    strverscmp(a, b) > 0,
34*05c9a015SAymeric Wibo 				    "strverscmp(\"%s\", \"%s\") > 0",
35*05c9a015SAymeric Wibo 				    a, b
36*05c9a015SAymeric Wibo 				);
37*05c9a015SAymeric Wibo 		}
38*05c9a015SAymeric Wibo 	}
39*05c9a015SAymeric Wibo }
40*05c9a015SAymeric Wibo 
41*05c9a015SAymeric Wibo #define	CHECK_ALL(...) do {                                     \
42*05c9a015SAymeric Wibo 	const char *ordered[] = { __VA_ARGS__ };                \
43*05c9a015SAymeric Wibo 	check_all(sizeof(ordered) / sizeof(*ordered), ordered); \
44*05c9a015SAymeric Wibo } while (0)
45*05c9a015SAymeric Wibo 
46*05c9a015SAymeric Wibo ATF_TC_WITHOUT_HEAD(strcmp_functionality);
ATF_TC_BODY(strcmp_functionality,tc)47*05c9a015SAymeric Wibo ATF_TC_BODY(strcmp_functionality, tc)
48*05c9a015SAymeric Wibo {
49*05c9a015SAymeric Wibo 	CHECK_ALL("", "a", "b");
50*05c9a015SAymeric Wibo }
51*05c9a015SAymeric Wibo 
52*05c9a015SAymeric Wibo /* from Linux man page strverscmp(3) */
53*05c9a015SAymeric Wibo 
54*05c9a015SAymeric Wibo ATF_TC_WITHOUT_HEAD(vers_ordering);
ATF_TC_BODY(vers_ordering,tc)55*05c9a015SAymeric Wibo ATF_TC_BODY(vers_ordering, tc)
56*05c9a015SAymeric Wibo {
57*05c9a015SAymeric Wibo 	CHECK_ALL("000", "00", "01", "010", "09", "0", "1", "9", "10");
58*05c9a015SAymeric Wibo }
59*05c9a015SAymeric Wibo 
60*05c9a015SAymeric Wibo ATF_TC_WITHOUT_HEAD(natural_ordering);
ATF_TC_BODY(natural_ordering,tc)61*05c9a015SAymeric Wibo ATF_TC_BODY(natural_ordering, tc)
62*05c9a015SAymeric Wibo {
63*05c9a015SAymeric Wibo 	CHECK_ALL("jan1", "jan2", "jan9", "jan10", "jan11", "jan19", "jan20");
64*05c9a015SAymeric Wibo }
65*05c9a015SAymeric Wibo 
66*05c9a015SAymeric Wibo /* https://sourceware.org/bugzilla/show_bug.cgi?id=9913 */
67*05c9a015SAymeric Wibo 
68*05c9a015SAymeric Wibo ATF_TC_WITHOUT_HEAD(glibc_bug_9913);
ATF_TC_BODY(glibc_bug_9913,tc)69*05c9a015SAymeric Wibo ATF_TC_BODY(glibc_bug_9913, tc)
70*05c9a015SAymeric Wibo {
71*05c9a015SAymeric Wibo 	CHECK_ALL(
72*05c9a015SAymeric Wibo 	    "B0075022800016.gbp.corp.com",
73*05c9a015SAymeric Wibo 	    "B007502280067.gbp.corp.com",
74*05c9a015SAymeric Wibo 	    "B007502357019.GBP.CORP.COM"
75*05c9a015SAymeric Wibo 	);
76*05c9a015SAymeric Wibo }
77*05c9a015SAymeric Wibo 
78*05c9a015SAymeric Wibo ATF_TC_WITHOUT_HEAD(semver_ordering);
ATF_TC_BODY(semver_ordering,tc)79*05c9a015SAymeric Wibo ATF_TC_BODY(semver_ordering, tc)
80*05c9a015SAymeric Wibo {
81*05c9a015SAymeric Wibo 	CHECK_ALL("2.6.20", "2.6.21");
82*05c9a015SAymeric Wibo }
83*05c9a015SAymeric Wibo 
ATF_TP_ADD_TCS(tp)84*05c9a015SAymeric Wibo ATF_TP_ADD_TCS(tp)
85*05c9a015SAymeric Wibo {
86*05c9a015SAymeric Wibo 	ATF_TP_ADD_TC(tp, strcmp_functionality);
87*05c9a015SAymeric Wibo 	ATF_TP_ADD_TC(tp, vers_ordering);
88*05c9a015SAymeric Wibo 	ATF_TP_ADD_TC(tp, natural_ordering);
89*05c9a015SAymeric Wibo 	ATF_TP_ADD_TC(tp, glibc_bug_9913);
90*05c9a015SAymeric Wibo 	ATF_TP_ADD_TC(tp, semver_ordering);
91*05c9a015SAymeric Wibo 
92*05c9a015SAymeric Wibo 	return (atf_no_error());
93*05c9a015SAymeric Wibo }
94