1*592efe25SPierre Pronchery /*
2*592efe25SPierre Pronchery * test-buffer.c
3*592efe25SPierre Pronchery * Tests for libpkgconf buffer API.
4*592efe25SPierre Pronchery *
5*592efe25SPierre Pronchery * SPDX-License-Identifier: pkgconf
6*592efe25SPierre Pronchery *
7*592efe25SPierre Pronchery * Copyright (c) 2025 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 <libpkgconf/stdinc.h>
19*592efe25SPierre Pronchery #include <libpkgconf/libpkgconf.h>
20*592efe25SPierre Pronchery #include "test-api.h"
21*592efe25SPierre Pronchery
22*592efe25SPierre Pronchery static void
test_buffer_empty(void)23*592efe25SPierre Pronchery test_buffer_empty(void)
24*592efe25SPierre Pronchery {
25*592efe25SPierre Pronchery pkgconf_buffer_t buf = PKGCONF_BUFFER_INITIALIZER;
26*592efe25SPierre Pronchery
27*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_buffer_len(&buf), 0);
28*592efe25SPierre Pronchery TEST_ASSERT_NULL(pkgconf_buffer_str(&buf));
29*592efe25SPierre Pronchery TEST_ASSERT_EMPTY_STRING(pkgconf_buffer_str_or_empty(&buf));
30*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_buffer_lastc(&buf), '\0');
31*592efe25SPierre Pronchery
32*592efe25SPierre Pronchery pkgconf_buffer_finalize(&buf);
33*592efe25SPierre Pronchery }
34*592efe25SPierre Pronchery
35*592efe25SPierre Pronchery static void
test_buffer_append(void)36*592efe25SPierre Pronchery test_buffer_append(void)
37*592efe25SPierre Pronchery {
38*592efe25SPierre Pronchery pkgconf_buffer_t buf = PKGCONF_BUFFER_INITIALIZER;
39*592efe25SPierre Pronchery
40*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_append(&buf, "hello"));
41*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(pkgconf_buffer_str(&buf), "hello");
42*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_buffer_len(&buf), 5);
43*592efe25SPierre Pronchery
44*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_append(&buf, " world"));
45*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(pkgconf_buffer_str(&buf), "hello world");
46*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_buffer_len(&buf), 11);
47*592efe25SPierre Pronchery
48*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_buffer_lastc(&buf), 'd');
49*592efe25SPierre Pronchery
50*592efe25SPierre Pronchery pkgconf_buffer_finalize(&buf);
51*592efe25SPierre Pronchery }
52*592efe25SPierre Pronchery
53*592efe25SPierre Pronchery static void
test_buffer_append_slice(void)54*592efe25SPierre Pronchery test_buffer_append_slice(void)
55*592efe25SPierre Pronchery {
56*592efe25SPierre Pronchery pkgconf_buffer_t buf = PKGCONF_BUFFER_INITIALIZER;
57*592efe25SPierre Pronchery
58*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_append_slice(&buf, "abcdefgh", 3));
59*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(pkgconf_buffer_str(&buf), "abc");
60*592efe25SPierre Pronchery
61*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_append_slice(&buf, "xyz", 0));
62*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(pkgconf_buffer_str(&buf), "abc");
63*592efe25SPierre Pronchery
64*592efe25SPierre Pronchery pkgconf_buffer_finalize(&buf);
65*592efe25SPierre Pronchery }
66*592efe25SPierre Pronchery
67*592efe25SPierre Pronchery static void
test_buffer_append_fmt(void)68*592efe25SPierre Pronchery test_buffer_append_fmt(void)
69*592efe25SPierre Pronchery {
70*592efe25SPierre Pronchery pkgconf_buffer_t buf = PKGCONF_BUFFER_INITIALIZER;
71*592efe25SPierre Pronchery
72*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_append_fmt(&buf, "%s=%d", "x", 42));
73*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(pkgconf_buffer_str(&buf), "x=42");
74*592efe25SPierre Pronchery
75*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_append_fmt(&buf, " %s", "ok"));
76*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(pkgconf_buffer_str(&buf), "x=42 ok");
77*592efe25SPierre Pronchery
78*592efe25SPierre Pronchery pkgconf_buffer_finalize(&buf);
79*592efe25SPierre Pronchery }
80*592efe25SPierre Pronchery
81*592efe25SPierre Pronchery static void
test_buffer_prepend(void)82*592efe25SPierre Pronchery test_buffer_prepend(void)
83*592efe25SPierre Pronchery {
84*592efe25SPierre Pronchery pkgconf_buffer_t buf = PKGCONF_BUFFER_INITIALIZER;
85*592efe25SPierre Pronchery
86*592efe25SPierre Pronchery pkgconf_buffer_append(&buf, "world");
87*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_prepend(&buf, "hello "));
88*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(pkgconf_buffer_str(&buf), "hello world");
89*592efe25SPierre Pronchery
90*592efe25SPierre Pronchery pkgconf_buffer_finalize(&buf);
91*592efe25SPierre Pronchery }
92*592efe25SPierre Pronchery
93*592efe25SPierre Pronchery static void
test_buffer_push_byte(void)94*592efe25SPierre Pronchery test_buffer_push_byte(void)
95*592efe25SPierre Pronchery {
96*592efe25SPierre Pronchery pkgconf_buffer_t buf = PKGCONF_BUFFER_INITIALIZER;
97*592efe25SPierre Pronchery
98*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_push_byte(&buf, 'a'));
99*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_push_byte(&buf, 'b'));
100*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_push_byte(&buf, 'c'));
101*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(pkgconf_buffer_str(&buf), "abc");
102*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_buffer_len(&buf), 3);
103*592efe25SPierre Pronchery
104*592efe25SPierre Pronchery pkgconf_buffer_finalize(&buf);
105*592efe25SPierre Pronchery }
106*592efe25SPierre Pronchery
107*592efe25SPierre Pronchery static void
test_buffer_trim_byte(void)108*592efe25SPierre Pronchery test_buffer_trim_byte(void)
109*592efe25SPierre Pronchery {
110*592efe25SPierre Pronchery pkgconf_buffer_t buf = PKGCONF_BUFFER_INITIALIZER;
111*592efe25SPierre Pronchery
112*592efe25SPierre Pronchery pkgconf_buffer_append(&buf, "hello\n");
113*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_trim_byte(&buf));
114*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(pkgconf_buffer_str(&buf), "hello");
115*592efe25SPierre Pronchery
116*592efe25SPierre Pronchery pkgconf_buffer_reset(&buf);
117*592efe25SPierre Pronchery pkgconf_buffer_push_byte(&buf, 'x');
118*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_trim_byte(&buf));
119*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_buffer_len(&buf), 0);
120*592efe25SPierre Pronchery TEST_ASSERT_FALSE(pkgconf_buffer_trim_byte(&buf));
121*592efe25SPierre Pronchery
122*592efe25SPierre Pronchery pkgconf_buffer_finalize(&buf);
123*592efe25SPierre Pronchery }
124*592efe25SPierre Pronchery
125*592efe25SPierre Pronchery static void
test_buffer_reset(void)126*592efe25SPierre Pronchery test_buffer_reset(void)
127*592efe25SPierre Pronchery {
128*592efe25SPierre Pronchery pkgconf_buffer_t buf = PKGCONF_BUFFER_INITIALIZER;
129*592efe25SPierre Pronchery
130*592efe25SPierre Pronchery pkgconf_buffer_append(&buf, "some content");
131*592efe25SPierre Pronchery TEST_ASSERT_NE(pkgconf_buffer_len(&buf), 0);
132*592efe25SPierre Pronchery
133*592efe25SPierre Pronchery pkgconf_buffer_reset(&buf);
134*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_buffer_len(&buf), 0);
135*592efe25SPierre Pronchery TEST_ASSERT_NULL(pkgconf_buffer_str(&buf));
136*592efe25SPierre Pronchery
137*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_append(&buf, "fresh"));
138*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(pkgconf_buffer_str(&buf), "fresh");
139*592efe25SPierre Pronchery
140*592efe25SPierre Pronchery pkgconf_buffer_finalize(&buf);
141*592efe25SPierre Pronchery }
142*592efe25SPierre Pronchery
143*592efe25SPierre Pronchery static void
test_buffer_freeze(void)144*592efe25SPierre Pronchery test_buffer_freeze(void)
145*592efe25SPierre Pronchery {
146*592efe25SPierre Pronchery pkgconf_buffer_t buf = PKGCONF_BUFFER_INITIALIZER;
147*592efe25SPierre Pronchery
148*592efe25SPierre Pronchery pkgconf_buffer_append(&buf, "frozen");
149*592efe25SPierre Pronchery char *out = pkgconf_buffer_freeze(&buf);
150*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(out);
151*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(out, "frozen");
152*592efe25SPierre Pronchery TEST_ASSERT_EQ(pkgconf_buffer_len(&buf), 0);
153*592efe25SPierre Pronchery
154*592efe25SPierre Pronchery TEST_ASSERT_NULL(pkgconf_buffer_freeze(&buf));
155*592efe25SPierre Pronchery
156*592efe25SPierre Pronchery free(out);
157*592efe25SPierre Pronchery pkgconf_buffer_finalize(&buf);
158*592efe25SPierre Pronchery }
159*592efe25SPierre Pronchery
160*592efe25SPierre Pronchery static void
test_buffer_copy(void)161*592efe25SPierre Pronchery test_buffer_copy(void)
162*592efe25SPierre Pronchery {
163*592efe25SPierre Pronchery pkgconf_buffer_t src = PKGCONF_BUFFER_INITIALIZER;
164*592efe25SPierre Pronchery pkgconf_buffer_t dst = PKGCONF_BUFFER_INITIALIZER;
165*592efe25SPierre Pronchery
166*592efe25SPierre Pronchery pkgconf_buffer_append(&src, "original");
167*592efe25SPierre Pronchery pkgconf_buffer_append(&dst, "to be replaced");
168*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_copy(&src, &dst));
169*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(pkgconf_buffer_str(&dst), "original");
170*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(pkgconf_buffer_str(&src), "original"); // src is unchanged
171*592efe25SPierre Pronchery
172*592efe25SPierre Pronchery pkgconf_buffer_finalize(&src);
173*592efe25SPierre Pronchery pkgconf_buffer_finalize(&dst);
174*592efe25SPierre Pronchery }
175*592efe25SPierre Pronchery
176*592efe25SPierre Pronchery static void
test_buffer_join(void)177*592efe25SPierre Pronchery test_buffer_join(void)
178*592efe25SPierre Pronchery {
179*592efe25SPierre Pronchery pkgconf_buffer_t buf = PKGCONF_BUFFER_INITIALIZER;
180*592efe25SPierre Pronchery
181*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_join(&buf, '/', "usr", "local", "lib", NULL));
182*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(pkgconf_buffer_str(&buf), "usr/local/lib");
183*592efe25SPierre Pronchery
184*592efe25SPierre Pronchery pkgconf_buffer_finalize(&buf);
185*592efe25SPierre Pronchery }
186*592efe25SPierre Pronchery
187*592efe25SPierre Pronchery static void
test_buffer_contains(void)188*592efe25SPierre Pronchery test_buffer_contains(void)
189*592efe25SPierre Pronchery {
190*592efe25SPierre Pronchery pkgconf_buffer_t hay = PKGCONF_BUFFER_INITIALIZER;
191*592efe25SPierre Pronchery pkgconf_buffer_t needle = PKGCONF_BUFFER_INITIALIZER;
192*592efe25SPierre Pronchery
193*592efe25SPierre Pronchery pkgconf_buffer_append(&hay, "the quick brown fox");
194*592efe25SPierre Pronchery
195*592efe25SPierre Pronchery pkgconf_buffer_append(&needle, "quick");
196*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_contains(&hay, &needle));
197*592efe25SPierre Pronchery
198*592efe25SPierre Pronchery pkgconf_buffer_reset(&needle);
199*592efe25SPierre Pronchery pkgconf_buffer_append(&needle, "slow");
200*592efe25SPierre Pronchery TEST_ASSERT_FALSE(pkgconf_buffer_contains(&hay, &needle));
201*592efe25SPierre Pronchery
202*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_contains_byte(&hay, 'q'));
203*592efe25SPierre Pronchery TEST_ASSERT_FALSE(pkgconf_buffer_contains_byte(&hay, 'z'));
204*592efe25SPierre Pronchery
205*592efe25SPierre Pronchery pkgconf_buffer_finalize(&hay);
206*592efe25SPierre Pronchery pkgconf_buffer_finalize(&needle);
207*592efe25SPierre Pronchery }
208*592efe25SPierre Pronchery
209*592efe25SPierre Pronchery static void
test_buffer_match(void)210*592efe25SPierre Pronchery test_buffer_match(void)
211*592efe25SPierre Pronchery {
212*592efe25SPierre Pronchery pkgconf_buffer_t a = PKGCONF_BUFFER_INITIALIZER;
213*592efe25SPierre Pronchery pkgconf_buffer_t b = PKGCONF_BUFFER_INITIALIZER;
214*592efe25SPierre Pronchery
215*592efe25SPierre Pronchery pkgconf_buffer_append(&a, "identical");
216*592efe25SPierre Pronchery pkgconf_buffer_append(&b, "identical");
217*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_match(&a, &b));
218*592efe25SPierre Pronchery
219*592efe25SPierre Pronchery // Identical length, but different contents
220*592efe25SPierre Pronchery pkgconf_buffer_reset(&b);
221*592efe25SPierre Pronchery pkgconf_buffer_append(&b, "different");
222*592efe25SPierre Pronchery TEST_ASSERT_FALSE(pkgconf_buffer_match(&a, &b));
223*592efe25SPierre Pronchery
224*592efe25SPierre Pronchery // Different length and contents
225*592efe25SPierre Pronchery pkgconf_buffer_reset(&b);
226*592efe25SPierre Pronchery pkgconf_buffer_append(&b, "different!");
227*592efe25SPierre Pronchery TEST_ASSERT_FALSE(pkgconf_buffer_match(&a, &b));
228*592efe25SPierre Pronchery
229*592efe25SPierre Pronchery pkgconf_buffer_finalize(&a);
230*592efe25SPierre Pronchery pkgconf_buffer_finalize(&b);
231*592efe25SPierre Pronchery }
232*592efe25SPierre Pronchery
233*592efe25SPierre Pronchery static void
test_buffer_has_prefix(void)234*592efe25SPierre Pronchery test_buffer_has_prefix(void)
235*592efe25SPierre Pronchery {
236*592efe25SPierre Pronchery pkgconf_buffer_t hay = PKGCONF_BUFFER_INITIALIZER;
237*592efe25SPierre Pronchery pkgconf_buffer_t pre = PKGCONF_BUFFER_INITIALIZER;
238*592efe25SPierre Pronchery
239*592efe25SPierre Pronchery pkgconf_buffer_append(&hay, "/usr/local/lib");
240*592efe25SPierre Pronchery
241*592efe25SPierre Pronchery pkgconf_buffer_append(&pre, "/usr");
242*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_has_prefix(&hay, &pre));
243*592efe25SPierre Pronchery
244*592efe25SPierre Pronchery pkgconf_buffer_reset(&pre);
245*592efe25SPierre Pronchery pkgconf_buffer_append(&pre, "/opt");
246*592efe25SPierre Pronchery TEST_ASSERT_FALSE(pkgconf_buffer_has_prefix(&hay, &pre));
247*592efe25SPierre Pronchery
248*592efe25SPierre Pronchery pkgconf_buffer_finalize(&hay);
249*592efe25SPierre Pronchery pkgconf_buffer_finalize(&pre);
250*592efe25SPierre Pronchery }
251*592efe25SPierre Pronchery
252*592efe25SPierre Pronchery static void
test_buffer_subst(void)253*592efe25SPierre Pronchery test_buffer_subst(void)
254*592efe25SPierre Pronchery {
255*592efe25SPierre Pronchery pkgconf_buffer_t src = PKGCONF_BUFFER_INITIALIZER;
256*592efe25SPierre Pronchery pkgconf_buffer_t dst = PKGCONF_BUFFER_INITIALIZER;
257*592efe25SPierre Pronchery
258*592efe25SPierre Pronchery pkgconf_buffer_append(&src, "prefix=${PREFIX}/share");
259*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_subst(&dst, &src, "${PREFIX}", "/opt/foo"));
260*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(pkgconf_buffer_str(&dst), "prefix=/opt/foo/share");
261*592efe25SPierre Pronchery
262*592efe25SPierre Pronchery pkgconf_buffer_finalize(&src);
263*592efe25SPierre Pronchery pkgconf_buffer_finalize(&dst);
264*592efe25SPierre Pronchery }
265*592efe25SPierre Pronchery
266*592efe25SPierre Pronchery static void
test_buffer_subst_empty_pattern(void)267*592efe25SPierre Pronchery test_buffer_subst_empty_pattern(void)
268*592efe25SPierre Pronchery {
269*592efe25SPierre Pronchery pkgconf_buffer_t src = PKGCONF_BUFFER_INITIALIZER;
270*592efe25SPierre Pronchery pkgconf_buffer_t dst0 = PKGCONF_BUFFER_INITIALIZER;
271*592efe25SPierre Pronchery pkgconf_buffer_t dst1 = PKGCONF_BUFFER_INITIALIZER;
272*592efe25SPierre Pronchery pkgconf_buffer_t dst2 = PKGCONF_BUFFER_INITIALIZER;
273*592efe25SPierre Pronchery pkgconf_buffer_t dst3 = PKGCONF_BUFFER_INITIALIZER;
274*592efe25SPierre Pronchery pkgconf_buffer_t dst4 = PKGCONF_BUFFER_INITIALIZER;
275*592efe25SPierre Pronchery pkgconf_buffer_t dst5 = PKGCONF_BUFFER_INITIALIZER;
276*592efe25SPierre Pronchery
277*592efe25SPierre Pronchery pkgconf_buffer_append(&src, "prefix=${PREFIX}/share");
278*592efe25SPierre Pronchery
279*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_subst(&dst0, &src, "", "foo"));
280*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_subst(&dst1, &src, "", ""));
281*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_subst(&dst2, &src, "", NULL));
282*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_subst(&dst3, &src, NULL, "foo"));
283*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_subst(&dst4, &src, NULL, ""));
284*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_subst(&dst5, &src, NULL, NULL));
285*592efe25SPierre Pronchery
286*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(pkgconf_buffer_str(&dst0), "prefix=${PREFIX}/share");
287*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(pkgconf_buffer_str(&dst1), "prefix=${PREFIX}/share");
288*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(pkgconf_buffer_str(&dst2), "prefix=${PREFIX}/share");
289*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(pkgconf_buffer_str(&dst3), "prefix=${PREFIX}/share");
290*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(pkgconf_buffer_str(&dst4), "prefix=${PREFIX}/share");
291*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(pkgconf_buffer_str(&dst5), "prefix=${PREFIX}/share");
292*592efe25SPierre Pronchery
293*592efe25SPierre Pronchery pkgconf_buffer_finalize(&src);
294*592efe25SPierre Pronchery pkgconf_buffer_finalize(&dst0);
295*592efe25SPierre Pronchery pkgconf_buffer_finalize(&dst1);
296*592efe25SPierre Pronchery pkgconf_buffer_finalize(&dst2);
297*592efe25SPierre Pronchery pkgconf_buffer_finalize(&dst3);
298*592efe25SPierre Pronchery pkgconf_buffer_finalize(&dst4);
299*592efe25SPierre Pronchery pkgconf_buffer_finalize(&dst5);
300*592efe25SPierre Pronchery }
301*592efe25SPierre Pronchery
302*592efe25SPierre Pronchery static void
test_buffer_escape(void)303*592efe25SPierre Pronchery test_buffer_escape(void)
304*592efe25SPierre Pronchery {
305*592efe25SPierre Pronchery pkgconf_buffer_t src = PKGCONF_BUFFER_INITIALIZER;
306*592efe25SPierre Pronchery pkgconf_buffer_t dst = PKGCONF_BUFFER_INITIALIZER;
307*592efe25SPierre Pronchery
308*592efe25SPierre Pronchery pkgconf_span_t spans[] = {
309*592efe25SPierre Pronchery { ' ', ' ' },
310*592efe25SPierre Pronchery { '\t', '\t' },
311*592efe25SPierre Pronchery };
312*592efe25SPierre Pronchery
313*592efe25SPierre Pronchery pkgconf_buffer_append(&src, "a b\tc");
314*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_escape(&dst, &src, spans, PKGCONF_ARRAY_SIZE(spans)));
315*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(pkgconf_buffer_str(&dst), "a\\ b\\\tc");
316*592efe25SPierre Pronchery
317*592efe25SPierre Pronchery pkgconf_buffer_finalize(&src);
318*592efe25SPierre Pronchery pkgconf_buffer_finalize(&dst);
319*592efe25SPierre Pronchery }
320*592efe25SPierre Pronchery
321*592efe25SPierre Pronchery static void
test_str_eq_slice(void)322*592efe25SPierre Pronchery test_str_eq_slice(void)
323*592efe25SPierre Pronchery {
324*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_str_eq_slice("hello", "hello", 5));
325*592efe25SPierre Pronchery TEST_ASSERT_FALSE(pkgconf_str_eq_slice("hello!", "hello", 5));
326*592efe25SPierre Pronchery TEST_ASSERT_FALSE(pkgconf_str_eq_slice("hello", "world", 5));
327*592efe25SPierre Pronchery TEST_ASSERT_FALSE(pkgconf_str_eq_slice(NULL, "hello", 5));
328*592efe25SPierre Pronchery }
329*592efe25SPierre Pronchery
330*592efe25SPierre Pronchery static void
test_span_contains(void)331*592efe25SPierre Pronchery test_span_contains(void)
332*592efe25SPierre Pronchery {
333*592efe25SPierre Pronchery pkgconf_span_t spans[] = {
334*592efe25SPierre Pronchery { '0', '9' },
335*592efe25SPierre Pronchery { 'a', 'z' },
336*592efe25SPierre Pronchery };
337*592efe25SPierre Pronchery
338*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_span_contains('5', spans, PKGCONF_ARRAY_SIZE(spans)));
339*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_span_contains('m', spans, PKGCONF_ARRAY_SIZE(spans)));
340*592efe25SPierre Pronchery TEST_ASSERT_FALSE(pkgconf_span_contains('A', spans, PKGCONF_ARRAY_SIZE(spans)));
341*592efe25SPierre Pronchery TEST_ASSERT_FALSE(pkgconf_span_contains('!', spans, PKGCONF_ARRAY_SIZE(spans)));
342*592efe25SPierre Pronchery }
343*592efe25SPierre Pronchery
344*592efe25SPierre Pronchery static void
test_buffer_fputs_nonempty(void)345*592efe25SPierre Pronchery test_buffer_fputs_nonempty(void)
346*592efe25SPierre Pronchery {
347*592efe25SPierre Pronchery pkgconf_buffer_t buf = PKGCONF_BUFFER_INITIALIZER;
348*592efe25SPierre Pronchery FILE *f = tmpfile();
349*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(f);
350*592efe25SPierre Pronchery
351*592efe25SPierre Pronchery pkgconf_buffer_append(&buf, "hello world");
352*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_fputs(&buf, f));
353*592efe25SPierre Pronchery
354*592efe25SPierre Pronchery char out[64];
355*592efe25SPierre Pronchery rewind(f);
356*592efe25SPierre Pronchery size_t n = fread(out, 1, sizeof(out) - 1, f);
357*592efe25SPierre Pronchery out[n] = '\0';
358*592efe25SPierre Pronchery
359*592efe25SPierre Pronchery // Buffer contents followed by a newline.
360*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(out, "hello world\n");
361*592efe25SPierre Pronchery
362*592efe25SPierre Pronchery fclose(f);
363*592efe25SPierre Pronchery pkgconf_buffer_finalize(&buf);
364*592efe25SPierre Pronchery }
365*592efe25SPierre Pronchery
366*592efe25SPierre Pronchery static void
test_buffer_fputs_empty(void)367*592efe25SPierre Pronchery test_buffer_fputs_empty(void)
368*592efe25SPierre Pronchery {
369*592efe25SPierre Pronchery pkgconf_buffer_t buf = PKGCONF_BUFFER_INITIALIZER;
370*592efe25SPierre Pronchery FILE *f = tmpfile();
371*592efe25SPierre Pronchery TEST_ASSERT_NONNULL(f);
372*592efe25SPierre Pronchery
373*592efe25SPierre Pronchery // An empty buffer writes only a newline.
374*592efe25SPierre Pronchery TEST_ASSERT_TRUE(pkgconf_buffer_fputs(&buf, f));
375*592efe25SPierre Pronchery
376*592efe25SPierre Pronchery char out[64];
377*592efe25SPierre Pronchery rewind(f);
378*592efe25SPierre Pronchery size_t n = fread(out, 1, sizeof(out) - 1, f);
379*592efe25SPierre Pronchery out[n] = '\0';
380*592efe25SPierre Pronchery
381*592efe25SPierre Pronchery TEST_ASSERT_STRCMP_EQ(out, "\n");
382*592efe25SPierre Pronchery
383*592efe25SPierre Pronchery fclose(f);
384*592efe25SPierre Pronchery pkgconf_buffer_finalize(&buf);
385*592efe25SPierre Pronchery }
386*592efe25SPierre Pronchery
387*592efe25SPierre Pronchery int
main(int argc,const char ** argv)388*592efe25SPierre Pronchery main(int argc, const char **argv)
389*592efe25SPierre Pronchery {
390*592efe25SPierre Pronchery (void) argc;
391*592efe25SPierre Pronchery
392*592efe25SPierre Pronchery const char *basename = pkgconf_path_find_basename(argv[0]);
393*592efe25SPierre Pronchery
394*592efe25SPierre Pronchery TEST_RUN(basename, test_buffer_empty);
395*592efe25SPierre Pronchery TEST_RUN(basename, test_buffer_append);
396*592efe25SPierre Pronchery TEST_RUN(basename, test_buffer_append_slice);
397*592efe25SPierre Pronchery TEST_RUN(basename, test_buffer_append_fmt);
398*592efe25SPierre Pronchery TEST_RUN(basename, test_buffer_prepend);
399*592efe25SPierre Pronchery TEST_RUN(basename, test_buffer_push_byte);
400*592efe25SPierre Pronchery TEST_RUN(basename, test_buffer_trim_byte);
401*592efe25SPierre Pronchery TEST_RUN(basename, test_buffer_reset);
402*592efe25SPierre Pronchery TEST_RUN(basename, test_buffer_freeze);
403*592efe25SPierre Pronchery TEST_RUN(basename, test_buffer_copy);
404*592efe25SPierre Pronchery TEST_RUN(basename, test_buffer_join);
405*592efe25SPierre Pronchery TEST_RUN(basename, test_buffer_contains);
406*592efe25SPierre Pronchery TEST_RUN(basename, test_buffer_match);
407*592efe25SPierre Pronchery TEST_RUN(basename, test_buffer_has_prefix);
408*592efe25SPierre Pronchery TEST_RUN(basename, test_buffer_subst);
409*592efe25SPierre Pronchery TEST_RUN(basename, test_buffer_subst_empty_pattern);
410*592efe25SPierre Pronchery TEST_RUN(basename, test_buffer_escape);
411*592efe25SPierre Pronchery TEST_RUN(basename, test_str_eq_slice);
412*592efe25SPierre Pronchery TEST_RUN(basename, test_span_contains);
413*592efe25SPierre Pronchery TEST_RUN(basename, test_buffer_fputs_nonempty);
414*592efe25SPierre Pronchery TEST_RUN(basename, test_buffer_fputs_empty);
415*592efe25SPierre Pronchery
416*592efe25SPierre Pronchery return EXIT_SUCCESS;
417*592efe25SPierre Pronchery }
418