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