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