1*592efe25SPierre Pronchery /*
2*592efe25SPierre Pronchery * test-dependency.c
3*592efe25SPierre Pronchery * Tests for the public libpkgconf dependency 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 size_t
dependency_count(const pkgconf_list_t * list)21*592efe25SPierre Pronchery dependency_count(const pkgconf_list_t *list)
22*592efe25SPierre Pronchery {
23*592efe25SPierre Pronchery size_t n = 0;
24*592efe25SPierre Pronchery const pkgconf_node_t *iter;
25*592efe25SPierre Pronchery
26*592efe25SPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(list->head, iter)
27*592efe25SPierre Pronchery {
28*592efe25SPierre Pronchery n++;
29*592efe25SPierre Pronchery }
30*592efe25SPierre Pronchery
31*592efe25SPierre Pronchery return n;
32*592efe25SPierre Pronchery }
33*592efe25SPierre Pronchery
34*592efe25SPierre Pronchery static const pkgconf_dependency_t *
dependency_at(const pkgconf_list_t * list,size_t index)35*592efe25SPierre Pronchery dependency_at(const pkgconf_list_t *list, size_t index)
36*592efe25SPierre Pronchery {
37*592efe25SPierre Pronchery const pkgconf_node_t *iter;
38*592efe25SPierre Pronchery size_t i = 0;
39*592efe25SPierre Pronchery
40*592efe25SPierre Pronchery PKGCONF_FOREACH_LIST_ENTRY(list->head, iter)
41*592efe25SPierre Pronchery {
42*592efe25SPierre Pronchery if (i++ == index)
43*592efe25SPierre Pronchery return iter->data;
44*592efe25SPierre Pronchery }
45*592efe25SPierre Pronchery
46*592efe25SPierre Pronchery return NULL;
47*592efe25SPierre Pronchery }
48*592efe25SPierre Pronchery
49*592efe25SPierre Pronchery static void
test_comparator_lookup_known(void)50*592efe25SPierre Pronchery test_comparator_lookup_known(void)
51*592efe25SPierre Pronchery {
52*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_pkg_comparator_lookup_by_name("="), PKGCONF_CMP_EQUAL);
53*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_pkg_comparator_lookup_by_name("!="), PKGCONF_CMP_NOT_EQUAL);
54*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_pkg_comparator_lookup_by_name("<"), PKGCONF_CMP_LESS_THAN);
55*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_pkg_comparator_lookup_by_name("<="), PKGCONF_CMP_LESS_THAN_EQUAL);
56*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_pkg_comparator_lookup_by_name(">"), PKGCONF_CMP_GREATER_THAN);
57*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_pkg_comparator_lookup_by_name(">="), PKGCONF_CMP_GREATER_THAN_EQUAL);
58*592efe25SPierre Pronchery }
59*592efe25SPierre Pronchery
60*592efe25SPierre Pronchery static void
test_comparator_lookup_unknown(void)61*592efe25SPierre Pronchery test_comparator_lookup_unknown(void)
62*592efe25SPierre Pronchery {
63*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_pkg_comparator_lookup_by_name("~~"), PKGCONF_CMP_ANY);
64*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_pkg_comparator_lookup_by_name(""), PKGCONF_CMP_ANY);
65*592efe25SPierre Pronchery }
66*592efe25SPierre Pronchery
67*592efe25SPierre Pronchery static void
test_comparator_roundtrip(void)68*592efe25SPierre Pronchery test_comparator_roundtrip(void)
69*592efe25SPierre Pronchery {
70*592efe25SPierre Pronchery pkgconf_pkg_comparator_t values[] =
71*592efe25SPierre Pronchery {
72*592efe25SPierre Pronchery PKGCONF_CMP_NOT_EQUAL,
73*592efe25SPierre Pronchery PKGCONF_CMP_ANY,
74*592efe25SPierre Pronchery PKGCONF_CMP_LESS_THAN,
75*592efe25SPierre Pronchery PKGCONF_CMP_LESS_THAN_EQUAL,
76*592efe25SPierre Pronchery PKGCONF_CMP_EQUAL,
77*592efe25SPierre Pronchery PKGCONF_CMP_GREATER_THAN,
78*592efe25SPierre Pronchery PKGCONF_CMP_GREATER_THAN_EQUAL,
79*592efe25SPierre Pronchery };
80*592efe25SPierre Pronchery
81*592efe25SPierre Pronchery for (size_t i = 0; i < PKGCONF_ARRAY_SIZE(values); i++)
82*592efe25SPierre Pronchery {
83*592efe25SPierre Pronchery pkgconf_dependency_t dep = { 0 };
84*592efe25SPierre Pronchery dep.compare = values[i];
85*592efe25SPierre Pronchery
86*592efe25SPierre Pronchery const char *str = pkgconf_pkg_get_comparator(&dep);
87*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(str);
88*592efe25SPierre Pronchery
89*592efe25SPierre Pronchery // ANY's value does not round-trip so do not check
90*592efe25SPierre Pronchery if (values[i] == PKGCONF_CMP_ANY)
91*592efe25SPierre Pronchery continue;
92*592efe25SPierre Pronchery
93*592efe25SPierre Pronchery pkgconf_pkg_comparator_t back = pkgconf_pkg_comparator_lookup_by_name(str);
94*592efe25SPierre Pronchery TEST_ASSERT_EQ(back, values[i]);
95*592efe25SPierre Pronchery }
96*592efe25SPierre Pronchery }
97*592efe25SPierre Pronchery
98*592efe25SPierre Pronchery static void
test_parse_str_single(void)99*592efe25SPierre Pronchery test_parse_str_single(void)
100*592efe25SPierre Pronchery {
101*592efe25SPierre Pronchery pkgconf_client_t *client = test_client_new();
102*592efe25SPierre Pronchery pkgconf_list_t deps = PKGCONF_LIST_INITIALIZER;
103*592efe25SPierre Pronchery
104*592efe25SPierre Pronchery pkgconf_dependency_parse_str(client, &deps, "foo", 0);
105*592efe25SPierre Pronchery
106*592efe25SPierre Pronchery TEST_ASSERT_EQ(dependency_count(&deps), 1);
107*592efe25SPierre Pronchery const pkgconf_dependency_t *d = dependency_at(&deps, 0);
108*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(d);
109*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(d->package, "foo");
110*592efe25SPierre Pronchery TEST_ASSERT_EQ(d->compare, PKGCONF_CMP_ANY);
111*592efe25SPierre Pronchery TEST_ASSERT_NULL(d->version);
112*592efe25SPierre Pronchery
113*592efe25SPierre Pronchery pkgconf_dependency_free(&deps);
114*592efe25SPierre Pronchery pkgconf_client_free(client);
115*592efe25SPierre Pronchery }
116*592efe25SPierre Pronchery
117*592efe25SPierre Pronchery static void
test_parse_str_versioned(void)118*592efe25SPierre Pronchery test_parse_str_versioned(void)
119*592efe25SPierre Pronchery {
120*592efe25SPierre Pronchery pkgconf_client_t *client = test_client_new();
121*592efe25SPierre Pronchery pkgconf_list_t deps = PKGCONF_LIST_INITIALIZER;
122*592efe25SPierre Pronchery
123*592efe25SPierre Pronchery pkgconf_dependency_parse_str(client, &deps, "foo >= 1.2.3", 0);
124*592efe25SPierre Pronchery
125*592efe25SPierre Pronchery TEST_ASSERT_EQ(dependency_count(&deps), 1);
126*592efe25SPierre Pronchery const pkgconf_dependency_t *d = dependency_at(&deps, 0);
127*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(d);
128*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(d->package, "foo");
129*592efe25SPierre Pronchery TEST_ASSERT_EQ(d->compare, PKGCONF_CMP_GREATER_THAN_EQUAL);
130*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(d->version, "1.2.3");
131*592efe25SPierre Pronchery
132*592efe25SPierre Pronchery pkgconf_dependency_free(&deps);
133*592efe25SPierre Pronchery pkgconf_client_free(client);
134*592efe25SPierre Pronchery }
135*592efe25SPierre Pronchery
136*592efe25SPierre Pronchery static void
test_parse_str_multiple_space_separated(void)137*592efe25SPierre Pronchery test_parse_str_multiple_space_separated(void)
138*592efe25SPierre Pronchery {
139*592efe25SPierre Pronchery pkgconf_client_t *client = test_client_new();
140*592efe25SPierre Pronchery pkgconf_list_t deps = PKGCONF_LIST_INITIALIZER;
141*592efe25SPierre Pronchery
142*592efe25SPierre Pronchery pkgconf_dependency_parse_str(client, &deps, "foo bar baz", 0);
143*592efe25SPierre Pronchery
144*592efe25SPierre Pronchery TEST_ASSERT_EQ(dependency_count(&deps), 3);
145*592efe25SPierre Pronchery
146*592efe25SPierre Pronchery const pkgconf_dependency_t *d0 = dependency_at(&deps, 0);
147*592efe25SPierre Pronchery const pkgconf_dependency_t *d1 = dependency_at(&deps, 1);
148*592efe25SPierre Pronchery const pkgconf_dependency_t *d2 = dependency_at(&deps, 2);
149*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(d0);
150*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(d1);
151*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(d2);
152*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(d0->package, "foo");
153*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(d1->package, "bar");
154*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(d2->package, "baz");
155*592efe25SPierre Pronchery
156*592efe25SPierre Pronchery pkgconf_dependency_free(&deps);
157*592efe25SPierre Pronchery pkgconf_client_free(client);
158*592efe25SPierre Pronchery }
159*592efe25SPierre Pronchery
160*592efe25SPierre Pronchery static void
test_parse_str_multiple_comma_separated(void)161*592efe25SPierre Pronchery test_parse_str_multiple_comma_separated(void)
162*592efe25SPierre Pronchery {
163*592efe25SPierre Pronchery pkgconf_client_t *client = test_client_new();
164*592efe25SPierre Pronchery pkgconf_list_t deps = PKGCONF_LIST_INITIALIZER;
165*592efe25SPierre Pronchery
166*592efe25SPierre Pronchery pkgconf_dependency_parse_str(client, &deps, "foo, bar, baz", 0);
167*592efe25SPierre Pronchery
168*592efe25SPierre Pronchery TEST_ASSERT_EQ(dependency_count(&deps), 3);
169*592efe25SPierre Pronchery
170*592efe25SPierre Pronchery const pkgconf_dependency_t *d0 = dependency_at(&deps, 0);
171*592efe25SPierre Pronchery const pkgconf_dependency_t *d1 = dependency_at(&deps, 1);
172*592efe25SPierre Pronchery const pkgconf_dependency_t *d2 = dependency_at(&deps, 2);
173*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(d0);
174*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(d1);
175*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(d2);
176*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(d0->package, "foo");
177*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(d1->package, "bar");
178*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(d2->package, "baz");
179*592efe25SPierre Pronchery
180*592efe25SPierre Pronchery pkgconf_dependency_free(&deps);
181*592efe25SPierre Pronchery pkgconf_client_free(client);
182*592efe25SPierre Pronchery }
183*592efe25SPierre Pronchery
184*592efe25SPierre Pronchery static void
test_parse_str_mixed_versioned_and_bare(void)185*592efe25SPierre Pronchery test_parse_str_mixed_versioned_and_bare(void)
186*592efe25SPierre Pronchery {
187*592efe25SPierre Pronchery pkgconf_client_t *client = test_client_new();
188*592efe25SPierre Pronchery pkgconf_list_t deps = PKGCONF_LIST_INITIALIZER;
189*592efe25SPierre Pronchery
190*592efe25SPierre Pronchery pkgconf_dependency_parse_str(client, &deps, "foo >= 1.0, bar, baz < 2.0", 0);
191*592efe25SPierre Pronchery
192*592efe25SPierre Pronchery TEST_ASSERT_EQ(dependency_count(&deps), 3);
193*592efe25SPierre Pronchery
194*592efe25SPierre Pronchery const pkgconf_dependency_t *d0 = dependency_at(&deps, 0);
195*592efe25SPierre Pronchery const pkgconf_dependency_t *d1 = dependency_at(&deps, 1);
196*592efe25SPierre Pronchery const pkgconf_dependency_t *d2 = dependency_at(&deps, 2);
197*592efe25SPierre Pronchery
198*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(d0);
199*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(d1);
200*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(d2);
201*592efe25SPierre Pronchery
202*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(d0->package, "foo");
203*592efe25SPierre Pronchery TEST_ASSERT_EQ(d0->compare, PKGCONF_CMP_GREATER_THAN_EQUAL);
204*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(d0->version, "1.0");
205*592efe25SPierre Pronchery
206*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(d1->package, "bar");
207*592efe25SPierre Pronchery TEST_ASSERT_EQ(d1->compare, PKGCONF_CMP_ANY);
208*592efe25SPierre Pronchery
209*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(d2->package, "baz");
210*592efe25SPierre Pronchery TEST_ASSERT_EQ(d2->compare, PKGCONF_CMP_LESS_THAN);
211*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(d2->version, "2.0");
212*592efe25SPierre Pronchery
213*592efe25SPierre Pronchery pkgconf_dependency_free(&deps);
214*592efe25SPierre Pronchery pkgconf_client_free(client);
215*592efe25SPierre Pronchery }
216*592efe25SPierre Pronchery
217*592efe25SPierre Pronchery static void
test_parse_str_empty(void)218*592efe25SPierre Pronchery test_parse_str_empty(void)
219*592efe25SPierre Pronchery {
220*592efe25SPierre Pronchery pkgconf_client_t *client = test_client_new();
221*592efe25SPierre Pronchery pkgconf_list_t deps = PKGCONF_LIST_INITIALIZER;
222*592efe25SPierre Pronchery
223*592efe25SPierre Pronchery pkgconf_dependency_parse_str(client, &deps, "", 0);
224*592efe25SPierre Pronchery TEST_ASSERT_EQ(dependency_count(&deps), 0);
225*592efe25SPierre Pronchery
226*592efe25SPierre Pronchery pkgconf_dependency_free(&deps);
227*592efe25SPierre Pronchery pkgconf_client_free(client);
228*592efe25SPierre Pronchery }
229*592efe25SPierre Pronchery
230*592efe25SPierre Pronchery static void
test_parse_str_all_comparators(void)231*592efe25SPierre Pronchery test_parse_str_all_comparators(void)
232*592efe25SPierre Pronchery {
233*592efe25SPierre Pronchery pkgconf_client_t *client = test_client_new();
234*592efe25SPierre Pronchery pkgconf_list_t deps = PKGCONF_LIST_INITIALIZER;
235*592efe25SPierre Pronchery
236*592efe25SPierre Pronchery pkgconf_dependency_parse_str(client, &deps, "a = 1, b != 2, c < 3, d <= 4, e > 5, f >= 6", 0);
237*592efe25SPierre Pronchery
238*592efe25SPierre Pronchery TEST_ASSERT_EQ(dependency_count(&deps), 6);
239*592efe25SPierre Pronchery
240*592efe25SPierre Pronchery const pkgconf_dependency_t *d0 = dependency_at(&deps, 0);
241*592efe25SPierre Pronchery const pkgconf_dependency_t *d1 = dependency_at(&deps, 1);
242*592efe25SPierre Pronchery const pkgconf_dependency_t *d2 = dependency_at(&deps, 2);
243*592efe25SPierre Pronchery const pkgconf_dependency_t *d3 = dependency_at(&deps, 3);
244*592efe25SPierre Pronchery const pkgconf_dependency_t *d4 = dependency_at(&deps, 4);
245*592efe25SPierre Pronchery const pkgconf_dependency_t *d5 = dependency_at(&deps, 5);
246*592efe25SPierre Pronchery
247*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(d0);
248*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(d1);
249*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(d2);
250*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(d3);
251*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(d4);
252*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(d5);
253*592efe25SPierre Pronchery
254*592efe25SPierre Pronchery TEST_ASSERT_EQ(d0->compare, PKGCONF_CMP_EQUAL);
255*592efe25SPierre Pronchery TEST_ASSERT_EQ(d1->compare, PKGCONF_CMP_NOT_EQUAL);
256*592efe25SPierre Pronchery TEST_ASSERT_EQ(d2->compare, PKGCONF_CMP_LESS_THAN);
257*592efe25SPierre Pronchery TEST_ASSERT_EQ(d3->compare, PKGCONF_CMP_LESS_THAN_EQUAL);
258*592efe25SPierre Pronchery TEST_ASSERT_EQ(d4->compare, PKGCONF_CMP_GREATER_THAN);
259*592efe25SPierre Pronchery TEST_ASSERT_EQ(d5->compare, PKGCONF_CMP_GREATER_THAN_EQUAL);
260*592efe25SPierre Pronchery
261*592efe25SPierre Pronchery pkgconf_dependency_free(&deps);
262*592efe25SPierre Pronchery pkgconf_client_free(client);
263*592efe25SPierre Pronchery }
264*592efe25SPierre Pronchery
265*592efe25SPierre Pronchery static void
test_dependency_add(void)266*592efe25SPierre Pronchery test_dependency_add(void)
267*592efe25SPierre Pronchery {
268*592efe25SPierre Pronchery pkgconf_client_t *client = test_client_new();
269*592efe25SPierre Pronchery pkgconf_list_t deps = PKGCONF_LIST_INITIALIZER;
270*592efe25SPierre Pronchery
271*592efe25SPierre Pronchery pkgconf_dependency_t *d = pkgconf_dependency_add(client, &deps, "foo", "1.0", PKGCONF_CMP_GREATER_THAN_EQUAL, 0);
272*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(d);
273*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(d->package, "foo");
274*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(d->version, "1.0");
275*592efe25SPierre Pronchery TEST_ASSERT_EQ(d->compare, PKGCONF_CMP_GREATER_THAN_EQUAL);
276*592efe25SPierre Pronchery
277*592efe25SPierre Pronchery TEST_ASSERT_EQ(dependency_count(&deps), 1);
278*592efe25SPierre Pronchery
279*592efe25SPierre Pronchery pkgconf_dependency_unref(client, d);
280*592efe25SPierre Pronchery pkgconf_dependency_free(&deps);
281*592efe25SPierre Pronchery pkgconf_client_free(client);
282*592efe25SPierre Pronchery }
283*592efe25SPierre Pronchery
284*592efe25SPierre Pronchery static void
test_dependency_add_no_version(void)285*592efe25SPierre Pronchery test_dependency_add_no_version(void)
286*592efe25SPierre Pronchery {
287*592efe25SPierre Pronchery pkgconf_client_t *client = test_client_new();
288*592efe25SPierre Pronchery pkgconf_list_t deps = PKGCONF_LIST_INITIALIZER;
289*592efe25SPierre Pronchery
290*592efe25SPierre Pronchery pkgconf_dependency_t *d = pkgconf_dependency_add(client, &deps, "foo", NULL, PKGCONF_CMP_ANY, 0);
291*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(d);
292*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(d->package, "foo");
293*592efe25SPierre Pronchery TEST_ASSERT_EQ(d->compare, PKGCONF_CMP_ANY);
294*592efe25SPierre Pronchery
295*592efe25SPierre Pronchery pkgconf_dependency_unref(client, d);
296*592efe25SPierre Pronchery pkgconf_dependency_free(&deps);
297*592efe25SPierre Pronchery pkgconf_client_free(client);
298*592efe25SPierre Pronchery }
299*592efe25SPierre Pronchery
300*592efe25SPierre Pronchery static void
test_dependency_add_multiple(void)301*592efe25SPierre Pronchery test_dependency_add_multiple(void)
302*592efe25SPierre Pronchery {
303*592efe25SPierre Pronchery pkgconf_client_t *client = test_client_new();
304*592efe25SPierre Pronchery pkgconf_list_t deps = PKGCONF_LIST_INITIALIZER;
305*592efe25SPierre Pronchery
306*592efe25SPierre Pronchery pkgconf_dependency_t *d0 = pkgconf_dependency_add(client, &deps, "foo", NULL, PKGCONF_CMP_ANY, 0);
307*592efe25SPierre Pronchery pkgconf_dependency_t *d1 = pkgconf_dependency_add(client, &deps, "bar", "2.0", PKGCONF_CMP_EQUAL, 0);
308*592efe25SPierre Pronchery pkgconf_dependency_t *d2 = pkgconf_dependency_add(client, &deps, "baz", "3.0", PKGCONF_CMP_LESS_THAN, 0);
309*592efe25SPierre Pronchery
310*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(d0);
311*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(d1);
312*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(d2);
313*592efe25SPierre Pronchery
314*592efe25SPierre Pronchery TEST_ASSERT_EQ(dependency_count(&deps), 3);
315*592efe25SPierre Pronchery
316*592efe25SPierre Pronchery pkgconf_dependency_unref(client, d0);
317*592efe25SPierre Pronchery pkgconf_dependency_unref(client, d1);
318*592efe25SPierre Pronchery pkgconf_dependency_unref(client, d2);
319*592efe25SPierre Pronchery pkgconf_dependency_free(&deps);
320*592efe25SPierre Pronchery pkgconf_client_free(client);
321*592efe25SPierre Pronchery }
322*592efe25SPierre Pronchery
323*592efe25SPierre Pronchery static void
test_dependency_collision_drops_flagged_newcomer(void)324*592efe25SPierre Pronchery test_dependency_collision_drops_flagged_newcomer(void)
325*592efe25SPierre Pronchery {
326*592efe25SPierre Pronchery pkgconf_client_t *client = test_client_new();
327*592efe25SPierre Pronchery pkgconf_list_t deps = PKGCONF_LIST_INITIALIZER;
328*592efe25SPierre Pronchery
329*592efe25SPierre Pronchery pkgconf_dependency_t *first = pkgconf_dependency_add(client, &deps, "foo", "1.0", PKGCONF_CMP_EQUAL, 0);
330*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(first);
331*592efe25SPierre Pronchery TEST_ASSERT_EQ(dependency_count(&deps), 1);
332*592efe25SPierre Pronchery
333*592efe25SPierre Pronchery /* Adding the same dep WITH flags collides; the flagged newcomer
334*592efe25SPierre Pronchery * is dropped in favour of the existing unflagged node, so _add
335*592efe25SPierre Pronchery * returns NULL and the count stays at 1 */
336*592efe25SPierre Pronchery pkgconf_dependency_t *second = pkgconf_dependency_add(client, &deps, "foo", "1.0", PKGCONF_CMP_EQUAL, PKGCONF_PKG_DEPF_INTERNAL);
337*592efe25SPierre Pronchery TEST_ASSERT_NULL(second);
338*592efe25SPierre Pronchery TEST_ASSERT_EQ(dependency_count(&deps), 1);
339*592efe25SPierre Pronchery
340*592efe25SPierre Pronchery pkgconf_dependency_unref(client, first);
341*592efe25SPierre Pronchery pkgconf_dependency_free(&deps);
342*592efe25SPierre Pronchery pkgconf_client_free(client);
343*592efe25SPierre Pronchery }
344*592efe25SPierre Pronchery
345*592efe25SPierre Pronchery static void
test_dependency_collision_drops_flagged_existing(void)346*592efe25SPierre Pronchery test_dependency_collision_drops_flagged_existing(void)
347*592efe25SPierre Pronchery {
348*592efe25SPierre Pronchery pkgconf_client_t *client = test_client_new();
349*592efe25SPierre Pronchery pkgconf_list_t deps = PKGCONF_LIST_INITIALIZER;
350*592efe25SPierre Pronchery
351*592efe25SPierre Pronchery pkgconf_dependency_t *first = pkgconf_dependency_add(client, &deps, "foo", "1.0", PKGCONF_CMP_EQUAL, PKGCONF_PKG_DEPF_INTERNAL);
352*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(first);
353*592efe25SPierre Pronchery TEST_ASSERT_EQ(dependency_count(&deps), 1);
354*592efe25SPierre Pronchery
355*592efe25SPierre Pronchery /* Adding the same dep UNFLAGGED collides; the existing flagged
356*592efe25SPierre Pronchery * node is deleted and unref'd, the unflagged newcomer takes its
357*592efe25SPierre Pronchery * place; count stays at 1, but the node is now the new one */
358*592efe25SPierre Pronchery pkgconf_dependency_t *second = pkgconf_dependency_add(client, &deps, "foo", "1.0", PKGCONF_CMP_EQUAL, 0);
359*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(second);
360*592efe25SPierre Pronchery TEST_ASSERT_EQ(dependency_count(&deps), 1);
361*592efe25SPierre Pronchery TEST_ASSERT_EQ(second->flags, 0);
362*592efe25SPierre Pronchery
363*592efe25SPierre Pronchery pkgconf_dependency_unref(client, first);
364*592efe25SPierre Pronchery pkgconf_dependency_unref(client, second);
365*592efe25SPierre Pronchery pkgconf_dependency_free(&deps);
366*592efe25SPierre Pronchery pkgconf_client_free(client);
367*592efe25SPierre Pronchery }
368*592efe25SPierre Pronchery
369*592efe25SPierre Pronchery static void
test_version_equal(void)370*592efe25SPierre Pronchery test_version_equal(void)
371*592efe25SPierre Pronchery {
372*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_compare_version("1.0", "1.0"), 0);
373*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_compare_version("1.2.3", "1.2.3"), 0);
374*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_compare_version("", ""), 0);
375*592efe25SPierre Pronchery }
376*592efe25SPierre Pronchery
377*592efe25SPierre Pronchery static void
test_version_simple_numeric(void)378*592efe25SPierre Pronchery test_version_simple_numeric(void)
379*592efe25SPierre Pronchery {
380*592efe25SPierre Pronchery TEST_ASSERT_LT(pkgconf_compare_version("1.0", "1.1"), 0);
381*592efe25SPierre Pronchery TEST_ASSERT_GT(pkgconf_compare_version("1.1", "1.0"), 0);
382*592efe25SPierre Pronchery
383*592efe25SPierre Pronchery TEST_ASSERT_LT(pkgconf_compare_version("1.0", "2.0"), 0);
384*592efe25SPierre Pronchery TEST_ASSERT_GT(pkgconf_compare_version("2.0", "1.0"), 0);
385*592efe25SPierre Pronchery
386*592efe25SPierre Pronchery TEST_ASSERT_LT(pkgconf_compare_version("1.2.3", "1.2.4"), 0);
387*592efe25SPierre Pronchery TEST_ASSERT_LT(pkgconf_compare_version("1.2.3", "1.3.0"), 0);
388*592efe25SPierre Pronchery TEST_ASSERT_LT(pkgconf_compare_version("1.2.3", "2.0.0"), 0);
389*592efe25SPierre Pronchery }
390*592efe25SPierre Pronchery
391*592efe25SPierre Pronchery static void
test_version_numeric_segments_not_lexical(void)392*592efe25SPierre Pronchery test_version_numeric_segments_not_lexical(void)
393*592efe25SPierre Pronchery {
394*592efe25SPierre Pronchery TEST_ASSERT_GT(pkgconf_compare_version("1.10", "1.9"), 0);
395*592efe25SPierre Pronchery TEST_ASSERT_GT(pkgconf_compare_version("1.100", "1.99"), 0);
396*592efe25SPierre Pronchery }
397*592efe25SPierre Pronchery
398*592efe25SPierre Pronchery static void
test_version_different_lengths(void)399*592efe25SPierre Pronchery test_version_different_lengths(void)
400*592efe25SPierre Pronchery {
401*592efe25SPierre Pronchery TEST_ASSERT_LT(pkgconf_compare_version("1.0", "1.0.1"), 0);
402*592efe25SPierre Pronchery TEST_ASSERT_GT(pkgconf_compare_version("1.0.1", "1.0"), 0);
403*592efe25SPierre Pronchery }
404*592efe25SPierre Pronchery
405*592efe25SPierre Pronchery static void
test_version_alpha_suffix(void)406*592efe25SPierre Pronchery test_version_alpha_suffix(void)
407*592efe25SPierre Pronchery {
408*592efe25SPierre Pronchery TEST_ASSERT_GT(pkgconf_compare_version("1.0a", "1.0"), 0);
409*592efe25SPierre Pronchery TEST_ASSERT_GT(pkgconf_compare_version("1.0alpha", "1.0"), 0);
410*592efe25SPierre Pronchery TEST_ASSERT_GT(pkgconf_compare_version("1.0rc1", "1.0"), 0);
411*592efe25SPierre Pronchery
412*592efe25SPierre Pronchery TEST_ASSERT_LT(pkgconf_compare_version("1.0alpha", "1.0beta"), 0);
413*592efe25SPierre Pronchery TEST_ASSERT_LT(pkgconf_compare_version("1.0beta", "1.0rc"), 0);
414*592efe25SPierre Pronchery }
415*592efe25SPierre Pronchery
416*592efe25SPierre Pronchery static void
test_version_tilde_prerelease(void)417*592efe25SPierre Pronchery test_version_tilde_prerelease(void)
418*592efe25SPierre Pronchery {
419*592efe25SPierre Pronchery TEST_ASSERT_LT(pkgconf_compare_version("1.0~rc1", "1.0"), 0);
420*592efe25SPierre Pronchery TEST_ASSERT_LT(pkgconf_compare_version("1.0~alpha", "1.0"), 0);
421*592efe25SPierre Pronchery TEST_ASSERT_LT(pkgconf_compare_version("1.0~beta", "1.0~rc"), 0);
422*592efe25SPierre Pronchery
423*592efe25SPierre Pronchery TEST_ASSERT_LT(pkgconf_compare_version("1.0~rc1", "1.0rc1"), 0);
424*592efe25SPierre Pronchery }
425*592efe25SPierre Pronchery
426*592efe25SPierre Pronchery static void
test_version_numeric_beats_alpha(void)427*592efe25SPierre Pronchery test_version_numeric_beats_alpha(void)
428*592efe25SPierre Pronchery {
429*592efe25SPierre Pronchery TEST_ASSERT_GT(pkgconf_compare_version("1.0.1", "1.0a"), 0);
430*592efe25SPierre Pronchery TEST_ASSERT_LT(pkgconf_compare_version("1.0a", "1.0.1"), 0);
431*592efe25SPierre Pronchery }
432*592efe25SPierre Pronchery
433*592efe25SPierre Pronchery static void
test_version_alpha_ordering(void)434*592efe25SPierre Pronchery test_version_alpha_ordering(void)
435*592efe25SPierre Pronchery {
436*592efe25SPierre Pronchery TEST_ASSERT_LT(pkgconf_compare_version("1.0a", "1.0b"), 0);
437*592efe25SPierre Pronchery TEST_ASSERT_GT(pkgconf_compare_version("1.0b", "1.0a"), 0);
438*592efe25SPierre Pronchery }
439*592efe25SPierre Pronchery
440*592efe25SPierre Pronchery static void
test_version_dotted_vs_hyphenated(void)441*592efe25SPierre Pronchery test_version_dotted_vs_hyphenated(void)
442*592efe25SPierre Pronchery {
443*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_compare_version("1.0-1", "1.0.1"), 0);
444*592efe25SPierre Pronchery }
445*592efe25SPierre Pronchery
446*592efe25SPierre Pronchery static void
test_version_leading_zeros(void)447*592efe25SPierre Pronchery test_version_leading_zeros(void)
448*592efe25SPierre Pronchery {
449*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_compare_version("1.01", "1.1"), 0);
450*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_compare_version("01.0", "1.0"), 0);
451*592efe25SPierre Pronchery }
452*592efe25SPierre Pronchery
453*592efe25SPierre Pronchery static void
test_version_trailing_zero_segments(void)454*592efe25SPierre Pronchery test_version_trailing_zero_segments(void)
455*592efe25SPierre Pronchery {
456*592efe25SPierre Pronchery /* Pkgconf does NOT treat "1.0" and "1.0.0" as equivalent.
457*592efe25SPierre Pronchery * Even a zero trailing numeric segment is additional content that makes the version greater.
458*592efe25SPierre Pronchery */
459*592efe25SPierre Pronchery TEST_ASSERT_LT(pkgconf_compare_version("1.0", "1.0.0"), 0);
460*592efe25SPierre Pronchery TEST_ASSERT_GT(pkgconf_compare_version("1.0.0", "1.0"), 0);
461*592efe25SPierre Pronchery TEST_ASSERT_LT(pkgconf_compare_version("1", "1.0"), 0);
462*592efe25SPierre Pronchery TEST_ASSERT_LT(pkgconf_compare_version("1", "1.0.0.0"), 0);
463*592efe25SPierre Pronchery }
464*592efe25SPierre Pronchery
465*592efe25SPierre Pronchery static void
test_version_null_handling(void)466*592efe25SPierre Pronchery test_version_null_handling(void)
467*592efe25SPierre Pronchery {
468*592efe25SPierre Pronchery TEST_ASSERT_LT(pkgconf_compare_version(NULL, "1.0"), 0);
469*592efe25SPierre Pronchery TEST_ASSERT_GT(pkgconf_compare_version("1.0", NULL), 0);
470*592efe25SPierre Pronchery TEST_ASSERT_LT(pkgconf_compare_version(NULL, NULL), 0);
471*592efe25SPierre Pronchery }
472*592efe25SPierre Pronchery
473*592efe25SPierre Pronchery static void
test_version_tilde_both_sides(void)474*592efe25SPierre Pronchery test_version_tilde_both_sides(void)
475*592efe25SPierre Pronchery {
476*592efe25SPierre Pronchery TEST_ASSERT_LT(pkgconf_compare_version("1.0~", "1.0a"), 0);
477*592efe25SPierre Pronchery TEST_ASSERT_GT(pkgconf_compare_version("1.0a", "1.0~"), 0);
478*592efe25SPierre Pronchery
479*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_compare_version("1.0~rc", "1.0~rc"), 0);
480*592efe25SPierre Pronchery TEST_ASSERT_LT(pkgconf_compare_version("1.0~a", "1.0~b"), 0);
481*592efe25SPierre Pronchery TEST_ASSERT_LT(pkgconf_compare_version("1.0~1", "1.0~2"), 0);
482*592efe25SPierre Pronchery }
483*592efe25SPierre Pronchery
484*592efe25SPierre Pronchery static void
test_version_separator_equivalence(void)485*592efe25SPierre Pronchery test_version_separator_equivalence(void)
486*592efe25SPierre Pronchery {
487*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_compare_version("1.0", "1-0"), 0);
488*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_compare_version("1.2.3", "1_2_3"), 0);
489*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_compare_version("1..2", "1.2"), 0);
490*592efe25SPierre Pronchery }
491*592efe25SPierre Pronchery
492*592efe25SPierre Pronchery static void
test_version_case_insensitive(void)493*592efe25SPierre Pronchery test_version_case_insensitive(void)
494*592efe25SPierre Pronchery {
495*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_compare_version("1.0RC1", "1.0rc1"), 0);
496*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_compare_version("1.0A", "1.0a"), 0);
497*592efe25SPierre Pronchery }
498*592efe25SPierre Pronchery
499*592efe25SPierre Pronchery static void
test_version_alpha_prefix(void)500*592efe25SPierre Pronchery test_version_alpha_prefix(void)
501*592efe25SPierre Pronchery {
502*592efe25SPierre Pronchery TEST_ASSERT_LT(pkgconf_compare_version("1.0alpha", "1.0alphabeta"), 0);
503*592efe25SPierre Pronchery TEST_ASSERT_GT(pkgconf_compare_version("1.0alphabeta", "1.0alpha"), 0);
504*592efe25SPierre Pronchery
505*592efe25SPierre Pronchery TEST_ASSERT_LT(pkgconf_compare_version("1.0a", "1.0ab"), 0);
506*592efe25SPierre Pronchery TEST_ASSERT_GT(pkgconf_compare_version("1.0ab", "1.0a"), 0);
507*592efe25SPierre Pronchery }
508*592efe25SPierre Pronchery
509*592efe25SPierre Pronchery int
main(int argc,char * argv[])510*592efe25SPierre Pronchery main(int argc, char *argv[])
511*592efe25SPierre Pronchery {
512*592efe25SPierre Pronchery (void) argc;
513*592efe25SPierre Pronchery const char *basename = pkgconf_path_find_basename(argv[0]);
514*592efe25SPierre Pronchery
515*592efe25SPierre Pronchery TEST_RUN(basename, test_comparator_lookup_known);
516*592efe25SPierre Pronchery TEST_RUN(basename, test_comparator_lookup_unknown);
517*592efe25SPierre Pronchery TEST_RUN(basename, test_comparator_roundtrip);
518*592efe25SPierre Pronchery
519*592efe25SPierre Pronchery TEST_RUN(basename, test_parse_str_empty);
520*592efe25SPierre Pronchery TEST_RUN(basename, test_parse_str_single);
521*592efe25SPierre Pronchery TEST_RUN(basename, test_parse_str_versioned);
522*592efe25SPierre Pronchery TEST_RUN(basename, test_parse_str_multiple_space_separated);
523*592efe25SPierre Pronchery TEST_RUN(basename, test_parse_str_multiple_comma_separated);
524*592efe25SPierre Pronchery TEST_RUN(basename, test_parse_str_mixed_versioned_and_bare);
525*592efe25SPierre Pronchery TEST_RUN(basename, test_parse_str_all_comparators);
526*592efe25SPierre Pronchery
527*592efe25SPierre Pronchery TEST_RUN(basename, test_dependency_add);
528*592efe25SPierre Pronchery TEST_RUN(basename, test_dependency_add_no_version);
529*592efe25SPierre Pronchery TEST_RUN(basename, test_dependency_add_multiple);
530*592efe25SPierre Pronchery TEST_RUN(basename, test_dependency_collision_drops_flagged_newcomer);
531*592efe25SPierre Pronchery TEST_RUN(basename, test_dependency_collision_drops_flagged_existing);
532*592efe25SPierre Pronchery
533*592efe25SPierre Pronchery TEST_RUN(basename, test_version_equal);
534*592efe25SPierre Pronchery TEST_RUN(basename, test_version_simple_numeric);
535*592efe25SPierre Pronchery TEST_RUN(basename, test_version_numeric_segments_not_lexical);
536*592efe25SPierre Pronchery TEST_RUN(basename, test_version_different_lengths);
537*592efe25SPierre Pronchery TEST_RUN(basename, test_version_alpha_suffix);
538*592efe25SPierre Pronchery TEST_RUN(basename, test_version_tilde_prerelease);
539*592efe25SPierre Pronchery TEST_RUN(basename, test_version_numeric_beats_alpha);
540*592efe25SPierre Pronchery TEST_RUN(basename, test_version_alpha_ordering);
541*592efe25SPierre Pronchery TEST_RUN(basename, test_version_dotted_vs_hyphenated);
542*592efe25SPierre Pronchery TEST_RUN(basename, test_version_leading_zeros);
543*592efe25SPierre Pronchery TEST_RUN(basename, test_version_trailing_zero_segments);
544*592efe25SPierre Pronchery TEST_RUN(basename, test_version_null_handling);
545*592efe25SPierre Pronchery TEST_RUN(basename, test_version_tilde_both_sides);
546*592efe25SPierre Pronchery TEST_RUN(basename, test_version_separator_equivalence);
547*592efe25SPierre Pronchery TEST_RUN(basename, test_version_case_insensitive);
548*592efe25SPierre Pronchery TEST_RUN(basename, test_version_alpha_prefix);
549*592efe25SPierre Pronchery
550*592efe25SPierre Pronchery return EXIT_SUCCESS;
551*592efe25SPierre Pronchery }
552