xref: /freebsd/contrib/atf/atf-c/detail/dynstr_test.c (revision c243e4902be8df1e643c76b5f18b68bb77cc5268)
1*c243e490SMarcel Moolenaar /*
2*c243e490SMarcel Moolenaar  * Automated Testing Framework (atf)
3*c243e490SMarcel Moolenaar  *
4*c243e490SMarcel Moolenaar  * Copyright (c) 2008 The NetBSD Foundation, Inc.
5*c243e490SMarcel Moolenaar  * All rights reserved.
6*c243e490SMarcel Moolenaar  *
7*c243e490SMarcel Moolenaar  * Redistribution and use in source and binary forms, with or without
8*c243e490SMarcel Moolenaar  * modification, are permitted provided that the following conditions
9*c243e490SMarcel Moolenaar  * are met:
10*c243e490SMarcel Moolenaar  * 1. Redistributions of source code must retain the above copyright
11*c243e490SMarcel Moolenaar  *    notice, this list of conditions and the following disclaimer.
12*c243e490SMarcel Moolenaar  * 2. Redistributions in binary form must reproduce the above copyright
13*c243e490SMarcel Moolenaar  *    notice, this list of conditions and the following disclaimer in the
14*c243e490SMarcel Moolenaar  *    documentation and/or other materials provided with the distribution.
15*c243e490SMarcel Moolenaar  *
16*c243e490SMarcel Moolenaar  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17*c243e490SMarcel Moolenaar  * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18*c243e490SMarcel Moolenaar  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19*c243e490SMarcel Moolenaar  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20*c243e490SMarcel Moolenaar  * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21*c243e490SMarcel Moolenaar  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22*c243e490SMarcel Moolenaar  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23*c243e490SMarcel Moolenaar  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24*c243e490SMarcel Moolenaar  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25*c243e490SMarcel Moolenaar  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26*c243e490SMarcel Moolenaar  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27*c243e490SMarcel Moolenaar  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*c243e490SMarcel Moolenaar  */
29*c243e490SMarcel Moolenaar 
30*c243e490SMarcel Moolenaar #include <stdarg.h>
31*c243e490SMarcel Moolenaar #include <stdint.h>
32*c243e490SMarcel Moolenaar #include <stdio.h>
33*c243e490SMarcel Moolenaar #include <stdlib.h>
34*c243e490SMarcel Moolenaar #include <string.h>
35*c243e490SMarcel Moolenaar 
36*c243e490SMarcel Moolenaar #include <atf-c.h>
37*c243e490SMarcel Moolenaar 
38*c243e490SMarcel Moolenaar #include "dynstr.h"
39*c243e490SMarcel Moolenaar #include "test_helpers.h"
40*c243e490SMarcel Moolenaar 
41*c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
42*c243e490SMarcel Moolenaar  * Tests for the "atf_dynstr" type.
43*c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
44*c243e490SMarcel Moolenaar 
45*c243e490SMarcel Moolenaar /*
46*c243e490SMarcel Moolenaar  * Constructors and destructors.
47*c243e490SMarcel Moolenaar  */
48*c243e490SMarcel Moolenaar 
49*c243e490SMarcel Moolenaar ATF_TC(init);
50*c243e490SMarcel Moolenaar ATF_TC_HEAD(init, tc)
51*c243e490SMarcel Moolenaar {
52*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks the empty constructor");
53*c243e490SMarcel Moolenaar }
54*c243e490SMarcel Moolenaar ATF_TC_BODY(init, tc)
55*c243e490SMarcel Moolenaar {
56*c243e490SMarcel Moolenaar     atf_dynstr_t str;
57*c243e490SMarcel Moolenaar 
58*c243e490SMarcel Moolenaar     RE(atf_dynstr_init(&str));
59*c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(atf_dynstr_length(&str), 0);
60*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "") == 0);
61*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
62*c243e490SMarcel Moolenaar }
63*c243e490SMarcel Moolenaar 
64*c243e490SMarcel Moolenaar static
65*c243e490SMarcel Moolenaar void
66*c243e490SMarcel Moolenaar init_fmt(atf_dynstr_t *str, const char *fmt, ...)
67*c243e490SMarcel Moolenaar {
68*c243e490SMarcel Moolenaar     va_list ap;
69*c243e490SMarcel Moolenaar 
70*c243e490SMarcel Moolenaar     va_start(ap, fmt);
71*c243e490SMarcel Moolenaar     RE(atf_dynstr_init_ap(str, fmt, ap));
72*c243e490SMarcel Moolenaar     va_end(ap);
73*c243e490SMarcel Moolenaar }
74*c243e490SMarcel Moolenaar 
75*c243e490SMarcel Moolenaar ATF_TC(init_ap);
76*c243e490SMarcel Moolenaar ATF_TC_HEAD(init_ap, tc)
77*c243e490SMarcel Moolenaar {
78*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks the formatted constructor using "
79*c243e490SMarcel Moolenaar                       "a va_list argument");
80*c243e490SMarcel Moolenaar }
81*c243e490SMarcel Moolenaar ATF_TC_BODY(init_ap, tc)
82*c243e490SMarcel Moolenaar {
83*c243e490SMarcel Moolenaar     atf_dynstr_t str;
84*c243e490SMarcel Moolenaar 
85*c243e490SMarcel Moolenaar     init_fmt(&str, "String 1");
86*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "String 1") == 0);
87*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
88*c243e490SMarcel Moolenaar 
89*c243e490SMarcel Moolenaar     init_fmt(&str, "String %d", 2);
90*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "String 2") == 0);
91*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
92*c243e490SMarcel Moolenaar 
93*c243e490SMarcel Moolenaar     init_fmt(&str, "%s %d", "String", 3);
94*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "String 3") == 0);
95*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
96*c243e490SMarcel Moolenaar 
97*c243e490SMarcel Moolenaar     init_fmt(&str, "%s%s%s%s%s%s%s", "This ", "should ", "be ", "a ",
98*c243e490SMarcel Moolenaar              "large ", "string ", "aaaabbbbccccdddd");
99*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str),
100*c243e490SMarcel Moolenaar                      "This should be a large string "
101*c243e490SMarcel Moolenaar                      "aaaabbbbccccdddd") == 0);
102*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
103*c243e490SMarcel Moolenaar }
104*c243e490SMarcel Moolenaar 
105*c243e490SMarcel Moolenaar ATF_TC(init_fmt);
106*c243e490SMarcel Moolenaar ATF_TC_HEAD(init_fmt, tc)
107*c243e490SMarcel Moolenaar {
108*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks the formatted constructor using "
109*c243e490SMarcel Moolenaar                       "a variable list of parameters");
110*c243e490SMarcel Moolenaar }
111*c243e490SMarcel Moolenaar ATF_TC_BODY(init_fmt, tc)
112*c243e490SMarcel Moolenaar {
113*c243e490SMarcel Moolenaar     atf_dynstr_t str;
114*c243e490SMarcel Moolenaar 
115*c243e490SMarcel Moolenaar     RE(atf_dynstr_init_fmt(&str, "String 1"));
116*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "String 1") == 0);
117*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
118*c243e490SMarcel Moolenaar 
119*c243e490SMarcel Moolenaar     RE(atf_dynstr_init_fmt(&str, "String %d", 2));
120*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "String 2") == 0);
121*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
122*c243e490SMarcel Moolenaar 
123*c243e490SMarcel Moolenaar     RE(atf_dynstr_init_fmt(&str, "%s %d", "String", 3));
124*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "String 3") == 0);
125*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
126*c243e490SMarcel Moolenaar 
127*c243e490SMarcel Moolenaar     RE(atf_dynstr_init_fmt(&str, "%s%s%s%s%s%s%s", "This ", "should ",
128*c243e490SMarcel Moolenaar                            "be ", "a ", "large ", "string ",
129*c243e490SMarcel Moolenaar                            "aaaabbbbccccdddd"));
130*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str),
131*c243e490SMarcel Moolenaar                      "This should be a large string "
132*c243e490SMarcel Moolenaar                      "aaaabbbbccccdddd") == 0);
133*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
134*c243e490SMarcel Moolenaar }
135*c243e490SMarcel Moolenaar 
136*c243e490SMarcel Moolenaar ATF_TC(init_raw);
137*c243e490SMarcel Moolenaar ATF_TC_HEAD(init_raw, tc)
138*c243e490SMarcel Moolenaar {
139*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks the construction of a string "
140*c243e490SMarcel Moolenaar                       "using a raw memory pointer");
141*c243e490SMarcel Moolenaar }
142*c243e490SMarcel Moolenaar ATF_TC_BODY(init_raw, tc)
143*c243e490SMarcel Moolenaar {
144*c243e490SMarcel Moolenaar     const char *src = "String 1, String 2";
145*c243e490SMarcel Moolenaar     atf_dynstr_t str;
146*c243e490SMarcel Moolenaar 
147*c243e490SMarcel Moolenaar     RE(atf_dynstr_init_raw(&str, src, 0));
148*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "") == 0);
149*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
150*c243e490SMarcel Moolenaar 
151*c243e490SMarcel Moolenaar     RE(atf_dynstr_init_raw(&str, src, 8));
152*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "String 1") == 0);
153*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
154*c243e490SMarcel Moolenaar 
155*c243e490SMarcel Moolenaar     RE(atf_dynstr_init_raw(&str, src + 10, 8));
156*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "String 2") == 0);
157*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
158*c243e490SMarcel Moolenaar 
159*c243e490SMarcel Moolenaar     RE(atf_dynstr_init_raw(&str, "String\0Lost", 11));
160*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "String") == 0);
161*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
162*c243e490SMarcel Moolenaar 
163*c243e490SMarcel Moolenaar     {
164*c243e490SMarcel Moolenaar         atf_error_t err = atf_dynstr_init_raw(&str, "NULL", SIZE_MAX - 1);
165*c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_is_error(err));
166*c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_error_is(err, "no_memory"));
167*c243e490SMarcel Moolenaar         atf_error_free(err);
168*c243e490SMarcel Moolenaar     }
169*c243e490SMarcel Moolenaar }
170*c243e490SMarcel Moolenaar 
171*c243e490SMarcel Moolenaar ATF_TC(init_rep);
172*c243e490SMarcel Moolenaar ATF_TC_HEAD(init_rep, tc)
173*c243e490SMarcel Moolenaar {
174*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks the construction of a string by "
175*c243e490SMarcel Moolenaar                       "repeating characters");
176*c243e490SMarcel Moolenaar }
177*c243e490SMarcel Moolenaar ATF_TC_BODY(init_rep, tc)
178*c243e490SMarcel Moolenaar {
179*c243e490SMarcel Moolenaar     const size_t maxlen = 8192;
180*c243e490SMarcel Moolenaar     char buf[maxlen + 1];
181*c243e490SMarcel Moolenaar     size_t i;
182*c243e490SMarcel Moolenaar 
183*c243e490SMarcel Moolenaar     buf[0] = '\0';
184*c243e490SMarcel Moolenaar 
185*c243e490SMarcel Moolenaar     for (i = 0; i < maxlen; i++) {
186*c243e490SMarcel Moolenaar         atf_dynstr_t str;
187*c243e490SMarcel Moolenaar 
188*c243e490SMarcel Moolenaar         RE(atf_dynstr_init_rep(&str, i, 'a'));
189*c243e490SMarcel Moolenaar 
190*c243e490SMarcel Moolenaar         if (strcmp(atf_dynstr_cstring(&str), buf) != 0) {
191*c243e490SMarcel Moolenaar             fprintf(stderr, "Failed at iteration %zd\n", i);
192*c243e490SMarcel Moolenaar             atf_tc_fail("Failed to construct dynstr by repeating %zd "
193*c243e490SMarcel Moolenaar                         "times the '%c' character", i, 'a');
194*c243e490SMarcel Moolenaar         }
195*c243e490SMarcel Moolenaar 
196*c243e490SMarcel Moolenaar         atf_dynstr_fini(&str);
197*c243e490SMarcel Moolenaar 
198*c243e490SMarcel Moolenaar         strcat(buf, "a");
199*c243e490SMarcel Moolenaar     }
200*c243e490SMarcel Moolenaar 
201*c243e490SMarcel Moolenaar     {
202*c243e490SMarcel Moolenaar         atf_dynstr_t str;
203*c243e490SMarcel Moolenaar         atf_error_t err;
204*c243e490SMarcel Moolenaar 
205*c243e490SMarcel Moolenaar         err = atf_dynstr_init_rep(&str, SIZE_MAX, 'a');
206*c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_is_error(err));
207*c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_error_is(err, "no_memory"));
208*c243e490SMarcel Moolenaar         atf_error_free(err);
209*c243e490SMarcel Moolenaar 
210*c243e490SMarcel Moolenaar         err = atf_dynstr_init_rep(&str, SIZE_MAX - 1, 'a');
211*c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_is_error(err));
212*c243e490SMarcel Moolenaar         ATF_REQUIRE(atf_error_is(err, "no_memory"));
213*c243e490SMarcel Moolenaar         atf_error_free(err);
214*c243e490SMarcel Moolenaar     }
215*c243e490SMarcel Moolenaar }
216*c243e490SMarcel Moolenaar 
217*c243e490SMarcel Moolenaar ATF_TC(init_substr);
218*c243e490SMarcel Moolenaar ATF_TC_HEAD(init_substr, tc)
219*c243e490SMarcel Moolenaar {
220*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks the construction of a string "
221*c243e490SMarcel Moolenaar                       "using a substring of another one");
222*c243e490SMarcel Moolenaar }
223*c243e490SMarcel Moolenaar ATF_TC_BODY(init_substr, tc)
224*c243e490SMarcel Moolenaar {
225*c243e490SMarcel Moolenaar     atf_dynstr_t src;
226*c243e490SMarcel Moolenaar     atf_dynstr_t str;
227*c243e490SMarcel Moolenaar 
228*c243e490SMarcel Moolenaar     RE(atf_dynstr_init_fmt(&src, "Str 1, Str 2"));
229*c243e490SMarcel Moolenaar 
230*c243e490SMarcel Moolenaar     RE(atf_dynstr_init_substr(&str, &src, 0, 0));
231*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "") == 0);
232*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
233*c243e490SMarcel Moolenaar 
234*c243e490SMarcel Moolenaar     RE(atf_dynstr_init_substr(&str, &src, 0, atf_dynstr_npos));
235*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "Str 1, Str 2") == 0);
236*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
237*c243e490SMarcel Moolenaar 
238*c243e490SMarcel Moolenaar     RE(atf_dynstr_init_substr(&str, &src, 0, 100));
239*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "Str 1, Str 2") == 0);
240*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
241*c243e490SMarcel Moolenaar 
242*c243e490SMarcel Moolenaar     RE(atf_dynstr_init_substr(&str, &src, 0, 5));
243*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "Str 1") == 0);
244*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
245*c243e490SMarcel Moolenaar 
246*c243e490SMarcel Moolenaar     RE(atf_dynstr_init_substr(&str, &src, 100, atf_dynstr_npos));
247*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "") == 0);
248*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
249*c243e490SMarcel Moolenaar 
250*c243e490SMarcel Moolenaar     RE(atf_dynstr_init_substr(&str, &src, 7, atf_dynstr_npos));
251*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "Str 2") == 0);
252*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
253*c243e490SMarcel Moolenaar 
254*c243e490SMarcel Moolenaar     atf_dynstr_fini(&src);
255*c243e490SMarcel Moolenaar }
256*c243e490SMarcel Moolenaar 
257*c243e490SMarcel Moolenaar ATF_TC(copy);
258*c243e490SMarcel Moolenaar ATF_TC_HEAD(copy, tc)
259*c243e490SMarcel Moolenaar {
260*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks the atf_dynstr_copy constructor");
261*c243e490SMarcel Moolenaar }
262*c243e490SMarcel Moolenaar ATF_TC_BODY(copy, tc)
263*c243e490SMarcel Moolenaar {
264*c243e490SMarcel Moolenaar     atf_dynstr_t str, str2;
265*c243e490SMarcel Moolenaar 
266*c243e490SMarcel Moolenaar     RE(atf_dynstr_init_fmt(&str, "Test string"));
267*c243e490SMarcel Moolenaar     RE(atf_dynstr_copy(&str2, &str));
268*c243e490SMarcel Moolenaar 
269*c243e490SMarcel Moolenaar     ATF_REQUIRE(atf_equal_dynstr_dynstr(&str, &str2));
270*c243e490SMarcel Moolenaar 
271*c243e490SMarcel Moolenaar     RE(atf_dynstr_append_fmt(&str2, " non-shared text"));
272*c243e490SMarcel Moolenaar 
273*c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_equal_dynstr_dynstr(&str, &str2));
274*c243e490SMarcel Moolenaar 
275*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str2);
276*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
277*c243e490SMarcel Moolenaar }
278*c243e490SMarcel Moolenaar 
279*c243e490SMarcel Moolenaar ATF_TC(fini_disown);
280*c243e490SMarcel Moolenaar ATF_TC_HEAD(fini_disown, tc)
281*c243e490SMarcel Moolenaar {
282*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks grabbing ownership of the "
283*c243e490SMarcel Moolenaar                       "internal plain C string");
284*c243e490SMarcel Moolenaar }
285*c243e490SMarcel Moolenaar ATF_TC_BODY(fini_disown, tc)
286*c243e490SMarcel Moolenaar {
287*c243e490SMarcel Moolenaar     const char *cstr;
288*c243e490SMarcel Moolenaar     char *cstr2;
289*c243e490SMarcel Moolenaar     atf_dynstr_t str;
290*c243e490SMarcel Moolenaar 
291*c243e490SMarcel Moolenaar     RE(atf_dynstr_init_fmt(&str, "Test string 1"));
292*c243e490SMarcel Moolenaar     cstr = atf_dynstr_cstring(&str);
293*c243e490SMarcel Moolenaar     cstr2 = atf_dynstr_fini_disown(&str);
294*c243e490SMarcel Moolenaar 
295*c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(cstr, cstr2);
296*c243e490SMarcel Moolenaar     free(cstr2);
297*c243e490SMarcel Moolenaar }
298*c243e490SMarcel Moolenaar 
299*c243e490SMarcel Moolenaar /*
300*c243e490SMarcel Moolenaar  * Getters.
301*c243e490SMarcel Moolenaar  */
302*c243e490SMarcel Moolenaar 
303*c243e490SMarcel Moolenaar ATF_TC(cstring);
304*c243e490SMarcel Moolenaar ATF_TC_HEAD(cstring, tc)
305*c243e490SMarcel Moolenaar {
306*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks the method to obtain a plain C "
307*c243e490SMarcel Moolenaar                       "string");
308*c243e490SMarcel Moolenaar }
309*c243e490SMarcel Moolenaar ATF_TC_BODY(cstring, tc)
310*c243e490SMarcel Moolenaar {
311*c243e490SMarcel Moolenaar     const char *cstr;
312*c243e490SMarcel Moolenaar     atf_dynstr_t str;
313*c243e490SMarcel Moolenaar 
314*c243e490SMarcel Moolenaar     RE(atf_dynstr_init_fmt(&str, "Test string 1"));
315*c243e490SMarcel Moolenaar     cstr = atf_dynstr_cstring(&str);
316*c243e490SMarcel Moolenaar     ATF_REQUIRE(cstr != NULL);
317*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(cstr, "Test string 1") == 0);
318*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
319*c243e490SMarcel Moolenaar 
320*c243e490SMarcel Moolenaar     RE(atf_dynstr_init_fmt(&str, "Test string 2"));
321*c243e490SMarcel Moolenaar     cstr = atf_dynstr_cstring(&str);
322*c243e490SMarcel Moolenaar     ATF_REQUIRE(cstr != NULL);
323*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(cstr, "Test string 2") == 0);
324*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
325*c243e490SMarcel Moolenaar }
326*c243e490SMarcel Moolenaar 
327*c243e490SMarcel Moolenaar ATF_TC(length);
328*c243e490SMarcel Moolenaar ATF_TC_HEAD(length, tc)
329*c243e490SMarcel Moolenaar {
330*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks the method to obtain the length");
331*c243e490SMarcel Moolenaar }
332*c243e490SMarcel Moolenaar ATF_TC_BODY(length, tc)
333*c243e490SMarcel Moolenaar {
334*c243e490SMarcel Moolenaar     size_t i;
335*c243e490SMarcel Moolenaar 
336*c243e490SMarcel Moolenaar     for (i = 0; i < 8192; i++) {
337*c243e490SMarcel Moolenaar         atf_dynstr_t str;
338*c243e490SMarcel Moolenaar         RE(atf_dynstr_init_rep(&str, i, 'a'));
339*c243e490SMarcel Moolenaar         ATF_REQUIRE_EQ(atf_dynstr_length(&str), i);
340*c243e490SMarcel Moolenaar         atf_dynstr_fini(&str);
341*c243e490SMarcel Moolenaar     }
342*c243e490SMarcel Moolenaar }
343*c243e490SMarcel Moolenaar 
344*c243e490SMarcel Moolenaar ATF_TC(rfind_ch);
345*c243e490SMarcel Moolenaar ATF_TC_HEAD(rfind_ch, tc)
346*c243e490SMarcel Moolenaar {
347*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks the method to locate the first "
348*c243e490SMarcel Moolenaar                       "occurrence of a character starting from the end");
349*c243e490SMarcel Moolenaar }
350*c243e490SMarcel Moolenaar ATF_TC_BODY(rfind_ch, tc)
351*c243e490SMarcel Moolenaar {
352*c243e490SMarcel Moolenaar     atf_dynstr_t str;
353*c243e490SMarcel Moolenaar 
354*c243e490SMarcel Moolenaar     RE(atf_dynstr_init_fmt(&str, "Foo1/Bar2/,.Baz"));
355*c243e490SMarcel Moolenaar 
356*c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(atf_dynstr_rfind_ch(&str, '\0'), atf_dynstr_npos);
357*c243e490SMarcel Moolenaar 
358*c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(atf_dynstr_rfind_ch(&str, '0'), atf_dynstr_npos);
359*c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(atf_dynstr_rfind_ch(&str, 'b'), atf_dynstr_npos);
360*c243e490SMarcel Moolenaar 
361*c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(atf_dynstr_rfind_ch(&str, 'F'), 0);
362*c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(atf_dynstr_rfind_ch(&str, '/'), 9);
363*c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(atf_dynstr_rfind_ch(&str, 'a'), 13);
364*c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(atf_dynstr_rfind_ch(&str, 'z'), 14);
365*c243e490SMarcel Moolenaar 
366*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
367*c243e490SMarcel Moolenaar }
368*c243e490SMarcel Moolenaar 
369*c243e490SMarcel Moolenaar /*
370*c243e490SMarcel Moolenaar  * Modifiers.
371*c243e490SMarcel Moolenaar  */
372*c243e490SMarcel Moolenaar 
373*c243e490SMarcel Moolenaar static
374*c243e490SMarcel Moolenaar void
375*c243e490SMarcel Moolenaar check_append(atf_error_t (*append)(atf_dynstr_t *, const char *, ...))
376*c243e490SMarcel Moolenaar {
377*c243e490SMarcel Moolenaar     const size_t maxlen = 8192;
378*c243e490SMarcel Moolenaar     char buf[maxlen + 1];
379*c243e490SMarcel Moolenaar     size_t i;
380*c243e490SMarcel Moolenaar     atf_dynstr_t str;
381*c243e490SMarcel Moolenaar 
382*c243e490SMarcel Moolenaar     printf("Appending with plain string\n");
383*c243e490SMarcel Moolenaar     buf[0] = '\0';
384*c243e490SMarcel Moolenaar     RE(atf_dynstr_init(&str));
385*c243e490SMarcel Moolenaar     for (i = 0; i < maxlen; i++) {
386*c243e490SMarcel Moolenaar         if (strcmp(atf_dynstr_cstring(&str), buf) != 0) {
387*c243e490SMarcel Moolenaar             fprintf(stderr, "Failed at iteration %zd\n", i);
388*c243e490SMarcel Moolenaar             atf_tc_fail("Failed to append character at iteration %zd", i);
389*c243e490SMarcel Moolenaar         }
390*c243e490SMarcel Moolenaar 
391*c243e490SMarcel Moolenaar         RE(append(&str, "a"));
392*c243e490SMarcel Moolenaar         strcat(buf, "a");
393*c243e490SMarcel Moolenaar     }
394*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
395*c243e490SMarcel Moolenaar 
396*c243e490SMarcel Moolenaar     printf("Appending with formatted string\n");
397*c243e490SMarcel Moolenaar     buf[0] = '\0';
398*c243e490SMarcel Moolenaar     RE(atf_dynstr_init(&str));
399*c243e490SMarcel Moolenaar     for (i = 0; i < maxlen; i++) {
400*c243e490SMarcel Moolenaar         if (strcmp(atf_dynstr_cstring(&str), buf) != 0) {
401*c243e490SMarcel Moolenaar             fprintf(stderr, "Failed at iteration %zd\n", i);
402*c243e490SMarcel Moolenaar             atf_tc_fail("Failed to append character at iteration %zd", i);
403*c243e490SMarcel Moolenaar         }
404*c243e490SMarcel Moolenaar 
405*c243e490SMarcel Moolenaar         RE(append(&str, "%s", "a"));
406*c243e490SMarcel Moolenaar         strcat(buf, "a");
407*c243e490SMarcel Moolenaar     }
408*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
409*c243e490SMarcel Moolenaar }
410*c243e490SMarcel Moolenaar 
411*c243e490SMarcel Moolenaar static
412*c243e490SMarcel Moolenaar atf_error_t
413*c243e490SMarcel Moolenaar append_ap_aux(atf_dynstr_t *str, const char *fmt, ...)
414*c243e490SMarcel Moolenaar {
415*c243e490SMarcel Moolenaar     va_list ap;
416*c243e490SMarcel Moolenaar     atf_error_t err;
417*c243e490SMarcel Moolenaar 
418*c243e490SMarcel Moolenaar     va_start(ap, fmt);
419*c243e490SMarcel Moolenaar     err = atf_dynstr_append_ap(str, fmt, ap);
420*c243e490SMarcel Moolenaar     va_end(ap);
421*c243e490SMarcel Moolenaar 
422*c243e490SMarcel Moolenaar     return err;
423*c243e490SMarcel Moolenaar }
424*c243e490SMarcel Moolenaar 
425*c243e490SMarcel Moolenaar ATF_TC(append_ap);
426*c243e490SMarcel Moolenaar ATF_TC_HEAD(append_ap, tc)
427*c243e490SMarcel Moolenaar {
428*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks that appending a string to "
429*c243e490SMarcel Moolenaar                       "another one works");
430*c243e490SMarcel Moolenaar }
431*c243e490SMarcel Moolenaar ATF_TC_BODY(append_ap, tc)
432*c243e490SMarcel Moolenaar {
433*c243e490SMarcel Moolenaar     check_append(append_ap_aux);
434*c243e490SMarcel Moolenaar }
435*c243e490SMarcel Moolenaar 
436*c243e490SMarcel Moolenaar ATF_TC(append_fmt);
437*c243e490SMarcel Moolenaar ATF_TC_HEAD(append_fmt, tc)
438*c243e490SMarcel Moolenaar {
439*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks that appending a string to "
440*c243e490SMarcel Moolenaar                       "another one works");
441*c243e490SMarcel Moolenaar }
442*c243e490SMarcel Moolenaar ATF_TC_BODY(append_fmt, tc)
443*c243e490SMarcel Moolenaar {
444*c243e490SMarcel Moolenaar     check_append(atf_dynstr_append_fmt);
445*c243e490SMarcel Moolenaar }
446*c243e490SMarcel Moolenaar 
447*c243e490SMarcel Moolenaar ATF_TC(clear);
448*c243e490SMarcel Moolenaar ATF_TC_HEAD(clear, tc)
449*c243e490SMarcel Moolenaar {
450*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks clearing a string");
451*c243e490SMarcel Moolenaar }
452*c243e490SMarcel Moolenaar ATF_TC_BODY(clear, tc)
453*c243e490SMarcel Moolenaar {
454*c243e490SMarcel Moolenaar     atf_dynstr_t str;
455*c243e490SMarcel Moolenaar 
456*c243e490SMarcel Moolenaar     printf("Clear an empty string\n");
457*c243e490SMarcel Moolenaar     RE(atf_dynstr_init(&str));
458*c243e490SMarcel Moolenaar     atf_dynstr_clear(&str);
459*c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(atf_dynstr_length(&str), 0);
460*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "") == 0);
461*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
462*c243e490SMarcel Moolenaar 
463*c243e490SMarcel Moolenaar     printf("Clear a non-empty string\n");
464*c243e490SMarcel Moolenaar     RE(atf_dynstr_init_fmt(&str, "Not empty"));
465*c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(atf_dynstr_length(&str), strlen("Not empty"));
466*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "Not empty") == 0);
467*c243e490SMarcel Moolenaar     atf_dynstr_clear(&str);
468*c243e490SMarcel Moolenaar     ATF_REQUIRE_EQ(atf_dynstr_length(&str), 0);
469*c243e490SMarcel Moolenaar     ATF_REQUIRE(strcmp(atf_dynstr_cstring(&str), "") == 0);
470*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
471*c243e490SMarcel Moolenaar }
472*c243e490SMarcel Moolenaar 
473*c243e490SMarcel Moolenaar static
474*c243e490SMarcel Moolenaar void
475*c243e490SMarcel Moolenaar check_prepend(atf_error_t (*prepend)(atf_dynstr_t *, const char *, ...))
476*c243e490SMarcel Moolenaar {
477*c243e490SMarcel Moolenaar     const size_t maxlen = 8192;
478*c243e490SMarcel Moolenaar     char buf[maxlen + 1];
479*c243e490SMarcel Moolenaar     size_t i;
480*c243e490SMarcel Moolenaar     atf_dynstr_t str;
481*c243e490SMarcel Moolenaar 
482*c243e490SMarcel Moolenaar     printf("Prepending with plain string\n");
483*c243e490SMarcel Moolenaar     buf[0] = '\0';
484*c243e490SMarcel Moolenaar     RE(atf_dynstr_init(&str));
485*c243e490SMarcel Moolenaar     for (i = 0; i < maxlen; i++) {
486*c243e490SMarcel Moolenaar         if (strcmp(atf_dynstr_cstring(&str), buf) != 0) {
487*c243e490SMarcel Moolenaar             fprintf(stderr, "Failed at iteration %zd\n", i);
488*c243e490SMarcel Moolenaar             atf_tc_fail("Failed to prepend character at iteration %zd", i);
489*c243e490SMarcel Moolenaar         }
490*c243e490SMarcel Moolenaar 
491*c243e490SMarcel Moolenaar         memmove(buf + 1, buf, i + 1);
492*c243e490SMarcel Moolenaar         if (i % 2 == 0) {
493*c243e490SMarcel Moolenaar             RE(prepend(&str, "%s", "a"));
494*c243e490SMarcel Moolenaar             buf[0] = 'a';
495*c243e490SMarcel Moolenaar         } else {
496*c243e490SMarcel Moolenaar             RE(prepend(&str, "%s", "b"));
497*c243e490SMarcel Moolenaar             buf[0] = 'b';
498*c243e490SMarcel Moolenaar         }
499*c243e490SMarcel Moolenaar     }
500*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
501*c243e490SMarcel Moolenaar 
502*c243e490SMarcel Moolenaar     printf("Prepending with formatted string\n");
503*c243e490SMarcel Moolenaar     buf[0] = '\0';
504*c243e490SMarcel Moolenaar     RE(atf_dynstr_init(&str));
505*c243e490SMarcel Moolenaar     for (i = 0; i < maxlen; i++) {
506*c243e490SMarcel Moolenaar         if (strcmp(atf_dynstr_cstring(&str), buf) != 0) {
507*c243e490SMarcel Moolenaar             fprintf(stderr, "Failed at iteration %zd\n", i);
508*c243e490SMarcel Moolenaar             atf_tc_fail("Failed to prepend character at iteration %zd", i);
509*c243e490SMarcel Moolenaar         }
510*c243e490SMarcel Moolenaar 
511*c243e490SMarcel Moolenaar         memmove(buf + 1, buf, i + 1);
512*c243e490SMarcel Moolenaar         if (i % 2 == 0) {
513*c243e490SMarcel Moolenaar             RE(prepend(&str, "%s", "a"));
514*c243e490SMarcel Moolenaar             buf[0] = 'a';
515*c243e490SMarcel Moolenaar         } else {
516*c243e490SMarcel Moolenaar             RE(prepend(&str, "%s", "b"));
517*c243e490SMarcel Moolenaar             buf[0] = 'b';
518*c243e490SMarcel Moolenaar         }
519*c243e490SMarcel Moolenaar     }
520*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
521*c243e490SMarcel Moolenaar }
522*c243e490SMarcel Moolenaar 
523*c243e490SMarcel Moolenaar static
524*c243e490SMarcel Moolenaar atf_error_t
525*c243e490SMarcel Moolenaar prepend_ap_aux(atf_dynstr_t *str, const char *fmt, ...)
526*c243e490SMarcel Moolenaar {
527*c243e490SMarcel Moolenaar     va_list ap;
528*c243e490SMarcel Moolenaar     atf_error_t err;
529*c243e490SMarcel Moolenaar 
530*c243e490SMarcel Moolenaar     va_start(ap, fmt);
531*c243e490SMarcel Moolenaar     err = atf_dynstr_prepend_ap(str, fmt, ap);
532*c243e490SMarcel Moolenaar     va_end(ap);
533*c243e490SMarcel Moolenaar 
534*c243e490SMarcel Moolenaar     return err;
535*c243e490SMarcel Moolenaar }
536*c243e490SMarcel Moolenaar 
537*c243e490SMarcel Moolenaar ATF_TC(prepend_ap);
538*c243e490SMarcel Moolenaar ATF_TC_HEAD(prepend_ap, tc)
539*c243e490SMarcel Moolenaar {
540*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks that prepending a string to "
541*c243e490SMarcel Moolenaar                       "another one works");
542*c243e490SMarcel Moolenaar }
543*c243e490SMarcel Moolenaar ATF_TC_BODY(prepend_ap, tc)
544*c243e490SMarcel Moolenaar {
545*c243e490SMarcel Moolenaar     check_prepend(prepend_ap_aux);
546*c243e490SMarcel Moolenaar }
547*c243e490SMarcel Moolenaar 
548*c243e490SMarcel Moolenaar ATF_TC(prepend_fmt);
549*c243e490SMarcel Moolenaar ATF_TC_HEAD(prepend_fmt, tc)
550*c243e490SMarcel Moolenaar {
551*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks that prepending a string to "
552*c243e490SMarcel Moolenaar                       "another one works");
553*c243e490SMarcel Moolenaar }
554*c243e490SMarcel Moolenaar ATF_TC_BODY(prepend_fmt, tc)
555*c243e490SMarcel Moolenaar {
556*c243e490SMarcel Moolenaar     check_prepend(atf_dynstr_prepend_fmt);
557*c243e490SMarcel Moolenaar }
558*c243e490SMarcel Moolenaar 
559*c243e490SMarcel Moolenaar /*
560*c243e490SMarcel Moolenaar  * Operators.
561*c243e490SMarcel Moolenaar  */
562*c243e490SMarcel Moolenaar 
563*c243e490SMarcel Moolenaar ATF_TC(equal_cstring);
564*c243e490SMarcel Moolenaar ATF_TC_HEAD(equal_cstring, tc)
565*c243e490SMarcel Moolenaar {
566*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks the atf_equal_dynstr_cstring "
567*c243e490SMarcel Moolenaar                       "function");
568*c243e490SMarcel Moolenaar }
569*c243e490SMarcel Moolenaar ATF_TC_BODY(equal_cstring, tc)
570*c243e490SMarcel Moolenaar {
571*c243e490SMarcel Moolenaar     atf_dynstr_t str;
572*c243e490SMarcel Moolenaar 
573*c243e490SMarcel Moolenaar     RE(atf_dynstr_init(&str));
574*c243e490SMarcel Moolenaar     ATF_REQUIRE( atf_equal_dynstr_cstring(&str, ""));
575*c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_equal_dynstr_cstring(&str, "Test"));
576*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
577*c243e490SMarcel Moolenaar 
578*c243e490SMarcel Moolenaar     RE(atf_dynstr_init_fmt(&str, "Test"));
579*c243e490SMarcel Moolenaar     ATF_REQUIRE( atf_equal_dynstr_cstring(&str, "Test"));
580*c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_equal_dynstr_cstring(&str, ""));
581*c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_equal_dynstr_cstring(&str, "Tes"));
582*c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_equal_dynstr_cstring(&str, "Test "));
583*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
584*c243e490SMarcel Moolenaar }
585*c243e490SMarcel Moolenaar 
586*c243e490SMarcel Moolenaar ATF_TC(equal_dynstr);
587*c243e490SMarcel Moolenaar ATF_TC_HEAD(equal_dynstr, tc)
588*c243e490SMarcel Moolenaar {
589*c243e490SMarcel Moolenaar     atf_tc_set_md_var(tc, "descr", "Checks the atf_equal_dynstr_dynstr "
590*c243e490SMarcel Moolenaar                       "function");
591*c243e490SMarcel Moolenaar }
592*c243e490SMarcel Moolenaar ATF_TC_BODY(equal_dynstr, tc)
593*c243e490SMarcel Moolenaar {
594*c243e490SMarcel Moolenaar     atf_dynstr_t str, str2;
595*c243e490SMarcel Moolenaar 
596*c243e490SMarcel Moolenaar     RE(atf_dynstr_init(&str));
597*c243e490SMarcel Moolenaar     RE(atf_dynstr_init_fmt(&str2, "Test"));
598*c243e490SMarcel Moolenaar     ATF_REQUIRE( atf_equal_dynstr_dynstr(&str, &str));
599*c243e490SMarcel Moolenaar     ATF_REQUIRE(!atf_equal_dynstr_dynstr(&str, &str2));
600*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str2);
601*c243e490SMarcel Moolenaar     atf_dynstr_fini(&str);
602*c243e490SMarcel Moolenaar }
603*c243e490SMarcel Moolenaar 
604*c243e490SMarcel Moolenaar /* ---------------------------------------------------------------------
605*c243e490SMarcel Moolenaar  * Main.
606*c243e490SMarcel Moolenaar  * --------------------------------------------------------------------- */
607*c243e490SMarcel Moolenaar 
608*c243e490SMarcel Moolenaar ATF_TP_ADD_TCS(tp)
609*c243e490SMarcel Moolenaar {
610*c243e490SMarcel Moolenaar     /* Constructors and destructors. */
611*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, init);
612*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, init_ap);
613*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, init_fmt);
614*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, init_raw);
615*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, init_rep);
616*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, init_substr);
617*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, copy);
618*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, fini_disown);
619*c243e490SMarcel Moolenaar 
620*c243e490SMarcel Moolenaar     /* Getters. */
621*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, cstring);
622*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, length);
623*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, rfind_ch);
624*c243e490SMarcel Moolenaar 
625*c243e490SMarcel Moolenaar     /* Modifiers. */
626*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, append_ap);
627*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, append_fmt);
628*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, clear);
629*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, prepend_ap);
630*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, prepend_fmt);
631*c243e490SMarcel Moolenaar 
632*c243e490SMarcel Moolenaar     /* Operators. */
633*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, equal_cstring);
634*c243e490SMarcel Moolenaar     ATF_TP_ADD_TC(tp, equal_dynstr);
635*c243e490SMarcel Moolenaar 
636*c243e490SMarcel Moolenaar     return atf_no_error();
637*c243e490SMarcel Moolenaar }
638