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); 47c243e490SMarcel Moolenaar ATF_TC_HEAD(init, tc) 48c243e490SMarcel Moolenaar { 49c243e490SMarcel Moolenaar atf_tc_set_md_var(tc, "descr", "Checks the empty constructor"); 50c243e490SMarcel Moolenaar } 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 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); 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 } 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); 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 } 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); 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 } 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); 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 } 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); 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 } 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); 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 } 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); 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 } 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); 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 } 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); 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 } 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); 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 } 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 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 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); 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 } 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); 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 } 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); 445c243e490SMarcel Moolenaar ATF_TC_HEAD(clear, tc) 446c243e490SMarcel Moolenaar { 447c243e490SMarcel Moolenaar atf_tc_set_md_var(tc, "descr", "Checks clearing a string"); 448c243e490SMarcel Moolenaar } 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 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 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); 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 } 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); 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 } 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); 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 } 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); 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 } 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 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