1*592efe25SPierre Pronchery /*
2*592efe25SPierre Pronchery * test-version.c
3*592efe25SPierre Pronchery * Tests for the public libpkgconf version comparison API.
4*592efe25SPierre Pronchery *
5*592efe25SPierre Pronchery * SPDX-License-Identifier: pkgconf
6*592efe25SPierre Pronchery *
7*592efe25SPierre Pronchery * Copyright (c) 2026 pkgconf authors (see AUTHORS).
8*592efe25SPierre Pronchery *
9*592efe25SPierre Pronchery * Permission to use, copy, modify, and/or distribute this software for any
10*592efe25SPierre Pronchery * purpose with or without fee is hereby granted, provided that the above
11*592efe25SPierre Pronchery * copyright notice and this permission notice appear in all copies.
12*592efe25SPierre Pronchery *
13*592efe25SPierre Pronchery * This software is provided 'as is' and without any warranty, express or
14*592efe25SPierre Pronchery * implied. In no event shall the authors be liable for any damages arising
15*592efe25SPierre Pronchery * from the use of this software.
16*592efe25SPierre Pronchery */
17*592efe25SPierre Pronchery
18*592efe25SPierre Pronchery #include "test-api.h"
19*592efe25SPierre Pronchery
20*592efe25SPierre Pronchery static void
cmp_lt(const char * a,const char * b)21*592efe25SPierre Pronchery cmp_lt(const char *a, const char *b)
22*592efe25SPierre Pronchery {
23*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_compare_version(a, b), -1);
24*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_compare_version(b, a), 1);
25*592efe25SPierre Pronchery }
26*592efe25SPierre Pronchery
27*592efe25SPierre Pronchery static void
cmp_eq(const char * a,const char * b)28*592efe25SPierre Pronchery cmp_eq(const char *a, const char *b)
29*592efe25SPierre Pronchery {
30*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_compare_version(a, b), 0);
31*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_compare_version(b, a), 0);
32*592efe25SPierre Pronchery }
33*592efe25SPierre Pronchery
34*592efe25SPierre Pronchery static void
test_version_equal(void)35*592efe25SPierre Pronchery test_version_equal(void)
36*592efe25SPierre Pronchery {
37*592efe25SPierre Pronchery cmp_eq("1.0.0", "1.0.0");
38*592efe25SPierre Pronchery cmp_eq("", "");
39*592efe25SPierre Pronchery cmp_eq("abc", "abc");
40*592efe25SPierre Pronchery cmp_eq("1.0a", "1.0A");
41*592efe25SPierre Pronchery cmp_eq("RELEASE", "release");
42*592efe25SPierre Pronchery }
43*592efe25SPierre Pronchery
44*592efe25SPierre Pronchery static void
test_version_null(void)45*592efe25SPierre Pronchery test_version_null(void)
46*592efe25SPierre Pronchery {
47*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_compare_version(NULL, NULL), -1);
48*592efe25SPierre Pronchery cmp_lt(NULL, "1.0");
49*592efe25SPierre Pronchery cmp_lt(NULL, "");
50*592efe25SPierre Pronchery }
51*592efe25SPierre Pronchery
52*592efe25SPierre Pronchery static void
test_version_numeric(void)53*592efe25SPierre Pronchery test_version_numeric(void)
54*592efe25SPierre Pronchery {
55*592efe25SPierre Pronchery cmp_lt("1.0.0", "1.0.1");
56*592efe25SPierre Pronchery cmp_lt("0.9", "1.0");
57*592efe25SPierre Pronchery cmp_lt("1.9.9", "2.0.0");
58*592efe25SPierre Pronchery cmp_lt("1.9", "1.10");
59*592efe25SPierre Pronchery cmp_lt("1.9", "1.100");
60*592efe25SPierre Pronchery }
61*592efe25SPierre Pronchery
62*592efe25SPierre Pronchery static void
test_version_leading_zeros(void)63*592efe25SPierre Pronchery test_version_leading_zeros(void)
64*592efe25SPierre Pronchery {
65*592efe25SPierre Pronchery cmp_eq("1.0", "1.00");
66*592efe25SPierre Pronchery cmp_eq("1.7", "1.007");
67*592efe25SPierre Pronchery cmp_eq("01.02.03", "1.2.3");
68*592efe25SPierre Pronchery cmp_lt("1.0.1", "1.0.10");
69*592efe25SPierre Pronchery }
70*592efe25SPierre Pronchery
71*592efe25SPierre Pronchery static void
test_version_component_count(void)72*592efe25SPierre Pronchery test_version_component_count(void)
73*592efe25SPierre Pronchery {
74*592efe25SPierre Pronchery cmp_lt("1.0", "1.0.1");
75*592efe25SPierre Pronchery cmp_lt("1.0", "1.0.0");
76*592efe25SPierre Pronchery cmp_lt("1.2.3", "1.2.3.1");
77*592efe25SPierre Pronchery }
78*592efe25SPierre Pronchery
79*592efe25SPierre Pronchery static void
test_version_separators(void)80*592efe25SPierre Pronchery test_version_separators(void)
81*592efe25SPierre Pronchery {
82*592efe25SPierre Pronchery cmp_eq("1.2.3", "1-2-3");
83*592efe25SPierre Pronchery cmp_eq("1.2.3", "1_2_3");
84*592efe25SPierre Pronchery cmp_eq("1.2.3", "1:2:3");
85*592efe25SPierre Pronchery cmp_eq("1.0", "1...0");
86*592efe25SPierre Pronchery }
87*592efe25SPierre Pronchery
88*592efe25SPierre Pronchery static void
test_version_tilde(void)89*592efe25SPierre Pronchery test_version_tilde(void)
90*592efe25SPierre Pronchery {
91*592efe25SPierre Pronchery cmp_lt("1.0~rc1", "1.0");
92*592efe25SPierre Pronchery cmp_lt("1.0~rc1", "1.0~rc2");
93*592efe25SPierre Pronchery cmp_lt("1.0~~", "1.0~");
94*592efe25SPierre Pronchery cmp_lt("1.0~1", "1.0.1");
95*592efe25SPierre Pronchery cmp_lt("1.0.0~beta", "1.0.0");
96*592efe25SPierre Pronchery }
97*592efe25SPierre Pronchery
98*592efe25SPierre Pronchery static void
test_version_alpha_numeric(void)99*592efe25SPierre Pronchery test_version_alpha_numeric(void)
100*592efe25SPierre Pronchery {
101*592efe25SPierre Pronchery cmp_lt("1.b", "1.5");
102*592efe25SPierre Pronchery cmp_lt("1.0.alpha", "1.0.beta");
103*592efe25SPierre Pronchery cmp_lt("1.0alpha", "1.0alphabeta");
104*592efe25SPierre Pronchery cmp_lt("1.0", "1.0pre");
105*592efe25SPierre Pronchery }
106*592efe25SPierre Pronchery
107*592efe25SPierre Pronchery static void
test_version_real_world(void)108*592efe25SPierre Pronchery test_version_real_world(void)
109*592efe25SPierre Pronchery {
110*592efe25SPierre Pronchery cmp_lt("2.5.1", "2.9.91");
111*592efe25SPierre Pronchery cmp_lt("2.9.91", "3.0.0");
112*592efe25SPierre Pronchery cmp_lt("1.0.0~beta", "1.0.0~rc1");
113*592efe25SPierre Pronchery cmp_lt("1.0.0~rc1", "1.0.0");
114*592efe25SPierre Pronchery }
115*592efe25SPierre Pronchery
116*592efe25SPierre Pronchery int
main(int argc,char * argv[])117*592efe25SPierre Pronchery main(int argc, char *argv[])
118*592efe25SPierre Pronchery {
119*592efe25SPierre Pronchery (void) argc;
120*592efe25SPierre Pronchery const char *basename = pkgconf_path_find_basename(argv[0]);
121*592efe25SPierre Pronchery
122*592efe25SPierre Pronchery TEST_RUN(basename, test_version_equal);
123*592efe25SPierre Pronchery TEST_RUN(basename, test_version_null);
124*592efe25SPierre Pronchery TEST_RUN(basename, test_version_numeric);
125*592efe25SPierre Pronchery TEST_RUN(basename, test_version_leading_zeros);
126*592efe25SPierre Pronchery TEST_RUN(basename, test_version_component_count);
127*592efe25SPierre Pronchery TEST_RUN(basename, test_version_separators);
128*592efe25SPierre Pronchery TEST_RUN(basename, test_version_tilde);
129*592efe25SPierre Pronchery TEST_RUN(basename, test_version_alpha_numeric);
130*592efe25SPierre Pronchery TEST_RUN(basename, test_version_real_world);
131*592efe25SPierre Pronchery
132*592efe25SPierre Pronchery return EXIT_SUCCESS;
133*592efe25SPierre Pronchery }
134