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