tests/test_string.c

Thu, 28 Dec 2023 20:37:53 +0100

author
Mike Becker <universe@uap-core.de>
date
Thu, 28 Dec 2023 20:37:53 +0100
changeset 777
e5b29e6f0615
child 806
e06249e09f99
permissions
-rw-r--r--

migrate string tests - relates to #342

universe@777 1 /*
universe@777 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
universe@777 3 *
universe@777 4 * Copyright 2023 Mike Becker, Olaf Wintermann All rights reserved.
universe@777 5 *
universe@777 6 * Redistribution and use in source and binary forms, with or without
universe@777 7 * modification, are permitted provided that the following conditions are met:
universe@777 8 *
universe@777 9 * 1. Redistributions of source code must retain the above copyright
universe@777 10 * notice, this list of conditions and the following disclaimer.
universe@777 11 *
universe@777 12 * 2. Redistributions in binary form must reproduce the above copyright
universe@777 13 * notice, this list of conditions and the following disclaimer in the
universe@777 14 * documentation and/or other materials provided with the distribution.
universe@777 15 *
universe@777 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
universe@777 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
universe@777 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
universe@777 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
universe@777 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
universe@777 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
universe@777 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
universe@777 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
universe@777 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
universe@777 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
universe@777 26 * POSSIBILITY OF SUCH DAMAGE.
universe@777 27 */
universe@777 28
universe@777 29 #include "cx/test.h"
universe@777 30 #include "util_allocator.h"
universe@777 31
universe@777 32 #include "cx/string.h"
universe@777 33
universe@777 34 #define ASSERT_ZERO_TERMINATED(str) CX_TEST_ASSERTM((str).ptr[(str).length] == '\0', \
universe@777 35 #str " is not zero terminated")
universe@777 36
universe@777 37 CX_TEST(test_string_construct) {
universe@777 38 cxstring s1 = CX_STR("1234");
universe@777 39 cxstring s2 = cx_strn("abcd", 2);
universe@777 40 cxmutstr s3 = cx_mutstr((char *) "1234");
universe@777 41 cxmutstr s4 = cx_mutstrn((char *) "abcd", 2);
universe@777 42 CX_TEST_DO {
universe@777 43 CX_TEST_ASSERT(s1.length == 4);
universe@777 44 CX_TEST_ASSERT(strncmp(s1.ptr, "1234", 4) == 0);
universe@777 45 CX_TEST_ASSERT(s2.length == 2);
universe@777 46 CX_TEST_ASSERT(strncmp(s2.ptr, "ab", 2) == 0);
universe@777 47 CX_TEST_ASSERT(s3.length == 4);
universe@777 48 CX_TEST_ASSERT(strncmp(s3.ptr, "1234", 4) == 0);
universe@777 49 CX_TEST_ASSERT(s4.length == 2);
universe@777 50 CX_TEST_ASSERT(strncmp(s4.ptr, "ab", 2) == 0);
universe@777 51 }
universe@777 52 }
universe@777 53
universe@777 54 CX_TEST(test_strfree) {
universe@777 55 CxTestingAllocator talloc;
universe@777 56 cx_testing_allocator_init(&talloc);
universe@777 57 CxAllocator *alloc = &talloc.base;
universe@777 58 CX_TEST_DO {
universe@777 59 char *test = cxMalloc(alloc, 16);
universe@777 60 cxmutstr str = cx_mutstrn(test, 16);
universe@777 61 CX_TEST_ASSERT(str.ptr == test);
universe@777 62 CX_TEST_ASSERT(str.length == 16);
universe@777 63 cx_strfree_a(alloc, &str);
universe@777 64 CX_TEST_ASSERT(str.ptr == NULL);
universe@777 65 CX_TEST_ASSERT(str.length == 0);
universe@777 66 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
universe@777 67 }
universe@777 68 cx_testing_allocator_destroy(&talloc);
universe@777 69 }
universe@777 70
universe@777 71 CX_TEST(test_strdup) {
universe@777 72 cxstring str = CX_STR("test");
universe@777 73 cxmutstr dup = cx_strdup(str);
universe@777 74 CX_TEST_DO {
universe@777 75 CX_TEST_ASSERT(dup.length == str.length);
universe@777 76 CX_TEST_ASSERT(0 == strcmp(dup.ptr, str.ptr));
universe@777 77 ASSERT_ZERO_TERMINATED(dup);
universe@777 78 }
universe@777 79 cx_strfree(&dup);
universe@777 80 }
universe@777 81
universe@777 82 CX_TEST(test_strdup_shortened) {
universe@777 83 cxstring str = CX_STR("test");
universe@777 84 str.length = 2;
universe@777 85 cxmutstr dup = cx_strdup(str);
universe@777 86 CX_TEST_DO {
universe@777 87 CX_TEST_ASSERT(dup.length == str.length);
universe@777 88 CX_TEST_ASSERT(0 == strcmp(dup.ptr, "te"));
universe@777 89 ASSERT_ZERO_TERMINATED(dup);
universe@777 90 }
universe@777 91 cx_strfree(&dup);
universe@777 92 }
universe@777 93
universe@777 94 CX_TEST(test_strlen) {
universe@777 95 cxstring s1 = CX_STR("1234");
universe@777 96 cxstring s2 = CX_STR(".:.:.");
universe@777 97 cxstring s3 = CX_STR("X");
universe@777 98 CX_TEST_DO {
universe@777 99 size_t len0 = cx_strlen(0);
universe@777 100 size_t len1 = cx_strlen(1, s1);
universe@777 101 size_t len2 = cx_strlen(2, s1, s2);
universe@777 102 size_t len3 = cx_strlen(3, s1, s2, s3);
universe@777 103
universe@777 104 CX_TEST_ASSERT(len0 == 0);
universe@777 105 CX_TEST_ASSERT(len1 == 4);
universe@777 106 CX_TEST_ASSERT(len2 == 9);
universe@777 107 CX_TEST_ASSERT(len3 == 10);
universe@777 108 }
universe@777 109 }
universe@777 110
universe@777 111 CX_TEST(test_strsubs) {
universe@777 112 cxstring str = CX_STR("A test string");
universe@777 113
universe@777 114 CX_TEST_DO {
universe@777 115 cxstring sub = cx_strsubs(str, 0);
universe@777 116 CX_TEST_ASSERT(0 == cx_strcmp(sub, str));
universe@777 117
universe@777 118 sub = cx_strsubs(str, 2);
universe@777 119 CX_TEST_ASSERT(0 == cx_strcmp(sub, CX_STR("test string")));
universe@777 120
universe@777 121 sub = cx_strsubs(str, 7);
universe@777 122 CX_TEST_ASSERT(0 == cx_strcmp(sub, CX_STR("string")));
universe@777 123
universe@777 124 sub = cx_strsubs(str, 15);
universe@777 125 CX_TEST_ASSERT(0 == cx_strcmp(sub, CX_STR("")));
universe@777 126
universe@777 127 sub = cx_strsubsl(str, 2, 4);
universe@777 128 CX_TEST_ASSERT(0 == cx_strcmp(sub, CX_STR("test")));
universe@777 129
universe@777 130 sub = cx_strsubsl(str, 7, 3);
universe@777 131 CX_TEST_ASSERT(0 == cx_strcmp(sub, CX_STR("str")));
universe@777 132
universe@777 133 sub = cx_strsubsl(str, 7, 20);
universe@777 134 CX_TEST_ASSERT(0 == cx_strcmp(sub, CX_STR("string")));
universe@777 135
universe@777 136 // just for coverage, call the _m variant
universe@777 137 cxmutstr m = cx_strsubs_m(cx_mutstrn(NULL, 0), 0);
universe@777 138 CX_TEST_ASSERT(0 == cx_strcmp(cx_strcast(m), CX_STR("")));
universe@777 139 }
universe@777 140 }
universe@777 141
universe@777 142 CX_TEST(test_strchr) {
universe@777 143 cxstring str = CX_STR("I will find you - and I will kill you");
universe@777 144
universe@777 145 CX_TEST_DO {
universe@777 146 cxstring notfound = cx_strchr(str, 'x');
universe@777 147 CX_TEST_ASSERT(notfound.length == 0);
universe@777 148
universe@777 149 cxstring result = cx_strchr(str, 'w');
universe@777 150 CX_TEST_ASSERT(result.length == 35);
universe@777 151 CX_TEST_ASSERT(0 == strcmp(result.ptr, "will find you - and I will kill you"));
universe@777 152
universe@777 153 // just for coverage, call the _m variant
universe@777 154 cxmutstr m = cx_strchr_m(cx_mutstrn(NULL, 0), 'a');
universe@777 155 CX_TEST_ASSERT(0 == cx_strcmp(cx_strcast(m), CX_STR("")));
universe@777 156 }
universe@777 157 }
universe@777 158
universe@777 159 CX_TEST(test_strrchr) {
universe@777 160 cxstring str = CX_STR("I will find you - and I will kill you");
universe@777 161
universe@777 162 CX_TEST_DO {
universe@777 163 cxstring notfound = cx_strrchr(str, 'x');
universe@777 164 CX_TEST_ASSERT(notfound.length == 0);
universe@777 165
universe@777 166 cxstring result = cx_strrchr(str, 'w');
universe@777 167 CX_TEST_ASSERT(result.length == 13);
universe@777 168 CX_TEST_ASSERT(0 == strcmp(result.ptr, "will kill you"));
universe@777 169
universe@777 170 // just for coverage, call the _m variant
universe@777 171 cxmutstr m = cx_strrchr_m(cx_mutstrn(NULL, 0), 'a');
universe@777 172 CX_TEST_ASSERT(0 == cx_strcmp(cx_strcast(m), CX_STR("")));
universe@777 173 }
universe@777 174 }
universe@777 175
universe@777 176 CX_TEST(test_strstr) {
universe@777 177 cxstring str = CX_STR("find the match in this string");
universe@777 178 cxstring longstr = CX_STR(
universe@777 179 "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl"
universe@777 180 "mnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwx"
universe@777 181 "yzabcdeababababnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghij"
universe@777 182 "klmnopqrstuvwxyzaababababababababrstuvwxyzabcdefghijklmnopqrstuv"
universe@777 183 "abababababababababababababababababababababababababababababababab"
universe@777 184 "abababababababababababababababababababababababababababababababab"
universe@777 185 "abababababababababababababababababababababababababababababababab"
universe@777 186 "abababababababababababababababababababababababababababababababab"
universe@777 187 "abababababababababababababababababababababababababababababababab"
universe@777 188 "abababababababababababababababababababababababababababababababab"
universe@777 189 "wxyz1234567890");
universe@777 190 cxstring longstrpattern = CX_STR(
universe@777 191 "abababababababababababababababababababababababababababababababab"
universe@777 192 "abababababababababababababababababababababababababababababababab"
universe@777 193 "abababababababababababababababababababababababababababababababab"
universe@777 194 "abababababababababababababababababababababababababababababababab"
universe@777 195 "abababababababababababababababababababababababababababababababab"
universe@777 196 );
universe@777 197 cxstring longstrresult = CX_STR(
universe@777 198 "abababababababababababababababababababababababababababababababab"
universe@777 199 "abababababababababababababababababababababababababababababababab"
universe@777 200 "abababababababababababababababababababababababababababababababab"
universe@777 201 "abababababababababababababababababababababababababababababababab"
universe@777 202 "abababababababababababababababababababababababababababababababab"
universe@777 203 "abababababababababababababababababababababababababababababababab"
universe@777 204 "wxyz1234567890"
universe@777 205 );
universe@777 206
universe@777 207 CX_TEST_DO {
universe@777 208 cxstring notfound = cx_strstr(str, CX_STR("no match"));
universe@777 209 CX_TEST_ASSERT(notfound.length == 0);
universe@777 210
universe@777 211 cxstring result = cx_strstr(str, CX_STR("match"));
universe@777 212 CX_TEST_ASSERT(result.length == 20);
universe@777 213 CX_TEST_ASSERT(0 == strcmp(result.ptr, "match in this string"));
universe@777 214
universe@777 215 result = cx_strstr(str, CX_STR(""));
universe@777 216 CX_TEST_ASSERT(result.length == str.length);
universe@777 217 CX_TEST_ASSERT(0 == strcmp(result.ptr, str.ptr));
universe@777 218
universe@777 219 result = cx_strstr(longstr, longstrpattern);
universe@777 220 CX_TEST_ASSERT(result.length == longstrresult.length);
universe@777 221 CX_TEST_ASSERT(0 == strcmp(result.ptr, longstrresult.ptr));
universe@777 222
universe@777 223 // just for coverage, call the _m variant
universe@777 224 cxmutstr mstr = cx_strdup(longstr);
universe@777 225 cxmutstr m = cx_strstr_m(mstr, longstrpattern);
universe@777 226 CX_TEST_ASSERT(m.length == longstrresult.length);
universe@777 227 CX_TEST_ASSERT(0 == strcmp(m.ptr, longstrresult.ptr));
universe@777 228 cx_strfree(&mstr);
universe@777 229 }
universe@777 230 }
universe@777 231
universe@777 232 CX_TEST(test_strcmp) {
universe@777 233 cxstring str = CX_STR("compare this");
universe@777 234 CX_TEST_DO {
universe@777 235 CX_TEST_ASSERT(0 == cx_strcmp(CX_STR(""), CX_STR("")));
universe@777 236 CX_TEST_ASSERT(0 < cx_strcmp(str, CX_STR("")));
universe@777 237 CX_TEST_ASSERT(0 == cx_strcmp(str, CX_STR("compare this")));
universe@777 238 CX_TEST_ASSERT(0 != cx_strcmp(str, CX_STR("Compare This")));
universe@777 239 CX_TEST_ASSERT(0 > cx_strcmp(str, CX_STR("compare tool")));
universe@777 240 CX_TEST_ASSERT(0 < cx_strcmp(str, CX_STR("compare shit")));
universe@777 241 CX_TEST_ASSERT(0 > cx_strcmp(str, CX_STR("compare this not")));
universe@777 242 CX_TEST_ASSERT(0 < cx_strcmp(str, CX_STR("compare")));
universe@777 243
universe@777 244 cxstring str2 = CX_STR("Compare This");
universe@777 245 CX_TEST_ASSERT(0 != cx_strcmp_p(&str, &str2));
universe@777 246 str2 = CX_STR("compare this");
universe@777 247 CX_TEST_ASSERT(0 == cx_strcmp_p(&str, &str2));
universe@777 248 }
universe@777 249 }
universe@777 250
universe@777 251 CX_TEST(test_strcasecmp) {
universe@777 252 cxstring str = CX_STR("compare this");
universe@777 253 CX_TEST_DO {
universe@777 254 CX_TEST_ASSERT(0 == cx_strcasecmp(CX_STR(""), CX_STR("")));
universe@777 255 CX_TEST_ASSERT(0 < cx_strcasecmp(str, CX_STR("")));
universe@777 256 CX_TEST_ASSERT(0 == cx_strcasecmp(str, CX_STR("compare this")));
universe@777 257 CX_TEST_ASSERT(0 == cx_strcasecmp(str, CX_STR("Compare This")));
universe@777 258 CX_TEST_ASSERT(0 > cx_strcasecmp(str, CX_STR("compare tool")));
universe@777 259 CX_TEST_ASSERT(0 < cx_strcasecmp(str, CX_STR("compare shit")));
universe@777 260 CX_TEST_ASSERT(0 > cx_strcasecmp(str, CX_STR("compare this not")));
universe@777 261 CX_TEST_ASSERT(0 < cx_strcasecmp(str, CX_STR("compare")));
universe@777 262
universe@777 263 cxstring str2 = CX_STR("Compare This");
universe@777 264 CX_TEST_ASSERT(0 == cx_strcasecmp_p(&str, &str2));
universe@777 265 str2 = CX_STR("Compare Tool");
universe@777 266 CX_TEST_ASSERT(0 > cx_strcasecmp_p(&str, &str2));
universe@777 267 }
universe@777 268 }
universe@777 269
universe@777 270 CX_TEST(test_strcat) {
universe@777 271 cxstring s1 = CX_STR("12");
universe@777 272 cxstring s2 = CX_STR("34");
universe@777 273 cxstring s3 = CX_STR("56");
universe@777 274 cxstring sn = {NULL, 0};
universe@777 275
universe@777 276 CxTestingAllocator talloc;
universe@777 277 cx_testing_allocator_init(&talloc);
universe@777 278 CxAllocator *alloc = &talloc.base;
universe@777 279
universe@777 280 CX_TEST_DO {
universe@777 281 cxmutstr t1 = cx_strcat_a(alloc, 2, s1, s2);
universe@777 282 CX_TEST_ASSERT(0 == cx_strcmp(cx_strcast(t1), CX_STR("1234")));
universe@777 283 ASSERT_ZERO_TERMINATED(t1);
universe@777 284 cx_strfree_a(alloc, &t1);
universe@777 285
universe@777 286 cxmutstr t2 = cx_strcat_a(alloc, 3, s1, s2, s3);
universe@777 287 CX_TEST_ASSERT(0 == cx_strcmp(cx_strcast(t2), CX_STR("123456")));
universe@777 288 ASSERT_ZERO_TERMINATED(t2);
universe@777 289 cx_strfree_a(alloc, &t2);
universe@777 290
universe@777 291 cxmutstr t3 = cx_strcat_a(alloc, 6, s1, sn, s2, sn, s3, sn);
universe@777 292 CX_TEST_ASSERT(0 == cx_strcmp(cx_strcast(t3), CX_STR("123456")));
universe@777 293 ASSERT_ZERO_TERMINATED(t3);
universe@777 294 cx_strfree_a(alloc, &t3);
universe@777 295
universe@777 296 cxmutstr t4 = cx_strcat_a(alloc, 2, sn, sn);
universe@777 297 CX_TEST_ASSERT(0 == cx_strcmp(cx_strcast(t4), CX_STR("")));
universe@777 298 ASSERT_ZERO_TERMINATED(t4);
universe@777 299 cx_strfree_a(alloc, &t4);
universe@777 300
universe@777 301 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
universe@777 302
universe@777 303 // use the macro
universe@777 304 cxmutstr t5 = cx_strcat(3, s3, s1, s2);
universe@777 305 CX_TEST_ASSERT(0 == cx_strcmp(cx_strcast(t5), CX_STR("561234")));
universe@777 306 ASSERT_ZERO_TERMINATED(t5);
universe@777 307 cx_strfree(&t5);
universe@777 308
universe@777 309 // use an initial string
universe@777 310 cxmutstr t6 = cx_strdup(CX_STR("Hello"));
universe@777 311 t6 = cx_strcat_m(t6, 2, CX_STR(", "), CX_STR("World!"));
universe@777 312 CX_TEST_ASSERT(0 == cx_strcmp(cx_strcast(t6), CX_STR("Hello, World!")));
universe@777 313 ASSERT_ZERO_TERMINATED(t6);
universe@777 314 cx_strfree(&t6);
universe@777 315 }
universe@777 316 cx_testing_allocator_destroy(&talloc);
universe@777 317 }
universe@777 318
universe@777 319 CX_TEST(test_strsplit) {
universe@777 320 cxstring test = CX_STR("this,is,a,csv,string");
universe@777 321 size_t capa = 8;
universe@777 322 cxstring list[8];
universe@777 323 size_t n;
universe@777 324 CX_TEST_DO {
universe@777 325 // special case: empty string
universe@777 326 n = cx_strsplit(test, CX_STR(""), capa, list);
universe@777 327 CX_TEST_ASSERT(n == 1);
universe@777 328 CX_TEST_ASSERT(0 == cx_strcmp(list[0], test));
universe@777 329
universe@777 330 // no delimiter occurrence
universe@777 331 n = cx_strsplit(test, CX_STR("z"), capa, list);
universe@777 332 CX_TEST_ASSERT(n == 1);
universe@777 333 CX_TEST_ASSERT(0 == cx_strcmp(list[0], test));
universe@777 334
universe@777 335 // partially matching delimiter
universe@777 336 n = cx_strsplit(test, CX_STR("is,not"), capa, list);
universe@777 337 CX_TEST_ASSERT(n == 1);
universe@777 338 CX_TEST_ASSERT(0 == cx_strcmp(list[0], test));
universe@777 339
universe@777 340 // matching single-char delimiter
universe@777 341 n = cx_strsplit(test, CX_STR(","), capa, list);
universe@777 342 CX_TEST_ASSERT(n == 5);
universe@777 343 CX_TEST_ASSERT(0 == cx_strcmp(list[0], CX_STR("this")));
universe@777 344 CX_TEST_ASSERT(0 == cx_strcmp(list[1], CX_STR("is")));
universe@777 345 CX_TEST_ASSERT(0 == cx_strcmp(list[2], CX_STR("a")));
universe@777 346 CX_TEST_ASSERT(0 == cx_strcmp(list[3], CX_STR("csv")));
universe@777 347 CX_TEST_ASSERT(0 == cx_strcmp(list[4], CX_STR("string")));
universe@777 348
universe@777 349 // matching multi-char delimiter
universe@777 350 n = cx_strsplit(test, CX_STR("is"), capa, list);
universe@777 351 CX_TEST_ASSERT(n == 3);
universe@777 352 CX_TEST_ASSERT(0 == cx_strcmp(list[0], CX_STR("th")));
universe@777 353 CX_TEST_ASSERT(0 == cx_strcmp(list[1], CX_STR(",")));
universe@777 354 CX_TEST_ASSERT(0 == cx_strcmp(list[2], CX_STR(",a,csv,string")));
universe@777 355
universe@777 356 // bounded list using single-char delimiter
universe@777 357 n = cx_strsplit(test, CX_STR(","), 3, list);
universe@777 358 CX_TEST_ASSERT(n == 3);
universe@777 359 CX_TEST_ASSERT(0 == cx_strcmp(list[0], CX_STR("this")));
universe@777 360 CX_TEST_ASSERT(0 == cx_strcmp(list[1], CX_STR("is")));
universe@777 361 CX_TEST_ASSERT(0 == cx_strcmp(list[2], CX_STR("a,csv,string")));
universe@777 362
universe@777 363 // bounded list using multi-char delimiter
universe@777 364 n = cx_strsplit(test, CX_STR("is"), 2, list);
universe@777 365 CX_TEST_ASSERT(n == 2);
universe@777 366 CX_TEST_ASSERT(0 == cx_strcmp(list[0], CX_STR("th")));
universe@777 367 CX_TEST_ASSERT(0 == cx_strcmp(list[1], CX_STR(",is,a,csv,string")));
universe@777 368
universe@777 369 // start with delimiter
universe@777 370 n = cx_strsplit(test, CX_STR("this"), capa, list);
universe@777 371 CX_TEST_ASSERT(n == 2);
universe@777 372 CX_TEST_ASSERT(0 == cx_strcmp(list[0], CX_STR("")));
universe@777 373 CX_TEST_ASSERT(0 == cx_strcmp(list[1], CX_STR(",is,a,csv,string")));
universe@777 374
universe@777 375 // end with delimiter
universe@777 376 n = cx_strsplit(test, CX_STR("string"), capa, list);
universe@777 377 CX_TEST_ASSERT(n == 2);
universe@777 378 CX_TEST_ASSERT(0 == cx_strcmp(list[0], CX_STR("this,is,a,csv,")));
universe@777 379 CX_TEST_ASSERT(0 == cx_strcmp(list[1], CX_STR("")));
universe@777 380
universe@777 381
universe@777 382 // end with delimiter exceed bound
universe@777 383 n = cx_strsplit(CX_STR("a,b,c,"), CX_STR(","), 3, list);
universe@777 384 CX_TEST_ASSERT(n == 3);
universe@777 385 CX_TEST_ASSERT(0 == cx_strcmp(list[0], CX_STR("a")));
universe@777 386 CX_TEST_ASSERT(0 == cx_strcmp(list[1], CX_STR("b")));
universe@777 387 CX_TEST_ASSERT(0 == cx_strcmp(list[2], CX_STR("c,")));
universe@777 388
universe@777 389 // exact match
universe@777 390 n = cx_strsplit(test, CX_STR("this,is,a,csv,string"), capa, list);
universe@777 391 CX_TEST_ASSERT(n == 2);
universe@777 392 CX_TEST_ASSERT(0 == cx_strcmp(list[0], CX_STR("")));
universe@777 393 CX_TEST_ASSERT(0 == cx_strcmp(list[1], CX_STR("")));
universe@777 394
universe@777 395 // string to be split is only substring
universe@777 396 n = cx_strsplit(test, CX_STR("this,is,a,csv,string,with,extension"), capa, list);
universe@777 397 CX_TEST_ASSERT(n == 1);
universe@777 398 CX_TEST_ASSERT(0 == cx_strcmp(list[0], test));
universe@777 399
universe@777 400 // subsequent encounter of delimiter (the string between is empty)
universe@777 401 n = cx_strsplit(test, CX_STR("is,"), capa, list);
universe@777 402 CX_TEST_ASSERT(n == 3);
universe@777 403 CX_TEST_ASSERT(0 == cx_strcmp(list[0], CX_STR("th")));
universe@777 404 CX_TEST_ASSERT(0 == cx_strcmp(list[1], CX_STR("")));
universe@777 405 CX_TEST_ASSERT(0 == cx_strcmp(list[2], CX_STR("a,csv,string")));
universe@777 406
universe@777 407 // call the _m variant just for coverage
universe@777 408 cxmutstr mtest = cx_strdup(test);
universe@777 409 cxmutstr mlist[4];
universe@777 410 n = cx_strsplit_m(mtest, CX_STR("is,"), 4, mlist);
universe@777 411 CX_TEST_ASSERT(n == 3);
universe@777 412 CX_TEST_ASSERT(0 == cx_strcmp(cx_strcast(mlist[0]), CX_STR("th")));
universe@777 413 CX_TEST_ASSERT(0 == cx_strcmp(cx_strcast(mlist[1]), CX_STR("")));
universe@777 414 CX_TEST_ASSERT(0 == cx_strcmp(cx_strcast(mlist[2]), CX_STR("a,csv,string")));
universe@777 415 cx_strfree(&mtest);
universe@777 416 }
universe@777 417 }
universe@777 418
universe@777 419 CX_TEST(test_strsplit_a) {
universe@777 420 CxTestingAllocator talloc;
universe@777 421 cx_testing_allocator_init(&talloc);
universe@777 422 CxAllocator *alloc = &talloc.base;
universe@777 423
universe@777 424 cxstring test = CX_STR("this,is,a,csv,string");
universe@777 425 size_t capa = 8;
universe@777 426 cxstring *list;
universe@777 427 size_t n;
universe@777 428 CX_TEST_DO {
universe@777 429 // special case: empty string
universe@777 430 n = cx_strsplit_a(alloc, test, CX_STR(""), capa, &list);
universe@777 431 CX_TEST_ASSERT(n == 1);
universe@777 432 CX_TEST_ASSERT(0 == cx_strcmp(list[0], test));
universe@777 433 cxFree(alloc, list);
universe@777 434
universe@777 435 // no delimiter occurrence
universe@777 436 n = cx_strsplit_a(alloc, test, CX_STR("z"), capa, &list);
universe@777 437 CX_TEST_ASSERT(n == 1);
universe@777 438 CX_TEST_ASSERT(0 == cx_strcmp(list[0], test));
universe@777 439 cxFree(alloc, list);
universe@777 440
universe@777 441 // partially matching delimiter
universe@777 442 n = cx_strsplit_a(alloc, test, CX_STR("is,not"), capa, &list);
universe@777 443 CX_TEST_ASSERT(n == 1);
universe@777 444 CX_TEST_ASSERT(0 == cx_strcmp(list[0], test));
universe@777 445 cxFree(alloc, list);
universe@777 446
universe@777 447 // matching single-char delimiter
universe@777 448 n = cx_strsplit_a(alloc, test, CX_STR(","), capa, &list);
universe@777 449 CX_TEST_ASSERT(n == 5);
universe@777 450 CX_TEST_ASSERT(0 == cx_strcmp(list[0], CX_STR("this")));
universe@777 451 CX_TEST_ASSERT(0 == cx_strcmp(list[1], CX_STR("is")));
universe@777 452 CX_TEST_ASSERT(0 == cx_strcmp(list[2], CX_STR("a")));
universe@777 453 CX_TEST_ASSERT(0 == cx_strcmp(list[3], CX_STR("csv")));
universe@777 454 CX_TEST_ASSERT(0 == cx_strcmp(list[4], CX_STR("string")));
universe@777 455 cxFree(alloc, list);
universe@777 456
universe@777 457 // matching multi-char delimiter
universe@777 458 n = cx_strsplit_a(alloc, test, CX_STR("is"), capa, &list);
universe@777 459 CX_TEST_ASSERT(n == 3);
universe@777 460 CX_TEST_ASSERT(0 == cx_strcmp(list[0], CX_STR("th")));
universe@777 461 CX_TEST_ASSERT(0 == cx_strcmp(list[1], CX_STR(",")));
universe@777 462 CX_TEST_ASSERT(0 == cx_strcmp(list[2], CX_STR(",a,csv,string")));
universe@777 463 cxFree(alloc, list);
universe@777 464
universe@777 465 // bounded list using single-char delimiter
universe@777 466 n = cx_strsplit_a(alloc, test, CX_STR(","), 3, &list);
universe@777 467 CX_TEST_ASSERT(n == 3);
universe@777 468 CX_TEST_ASSERT(0 == cx_strcmp(list[0], CX_STR("this")));
universe@777 469 CX_TEST_ASSERT(0 == cx_strcmp(list[1], CX_STR("is")));
universe@777 470 CX_TEST_ASSERT(0 == cx_strcmp(list[2], CX_STR("a,csv,string")));
universe@777 471 cxFree(alloc, list);
universe@777 472
universe@777 473 // bounded list using multi-char delimiter
universe@777 474 n = cx_strsplit_a(alloc, test, CX_STR("is"), 2, &list);
universe@777 475 CX_TEST_ASSERT(n == 2);
universe@777 476 CX_TEST_ASSERT(0 == cx_strcmp(list[0], CX_STR("th")));
universe@777 477 CX_TEST_ASSERT(0 == cx_strcmp(list[1], CX_STR(",is,a,csv,string")));
universe@777 478 cxFree(alloc, list);
universe@777 479
universe@777 480 // start with delimiter
universe@777 481 n = cx_strsplit_a(alloc, test, CX_STR("this"), capa, &list);
universe@777 482 CX_TEST_ASSERT(n == 2);
universe@777 483 CX_TEST_ASSERT(0 == cx_strcmp(list[0], CX_STR("")));
universe@777 484 CX_TEST_ASSERT(0 == cx_strcmp(list[1], CX_STR(",is,a,csv,string")));
universe@777 485 cxFree(alloc, list);
universe@777 486
universe@777 487 // end with delimiter
universe@777 488 n = cx_strsplit_a(alloc, test, CX_STR("string"), capa, &list);
universe@777 489 CX_TEST_ASSERT(n == 2);
universe@777 490 CX_TEST_ASSERT(0 == cx_strcmp(list[0], CX_STR("this,is,a,csv,")));
universe@777 491 CX_TEST_ASSERT(0 == cx_strcmp(list[1], CX_STR("")));
universe@777 492 cxFree(alloc, list);
universe@777 493
universe@777 494 // end with delimiter exceed bound
universe@777 495 n = cx_strsplit_a(alloc, CX_STR("a,b,c,"), CX_STR(","), 3, &list);
universe@777 496 CX_TEST_ASSERT(n == 3);
universe@777 497 CX_TEST_ASSERT(0 == cx_strcmp(list[0], CX_STR("a")));
universe@777 498 CX_TEST_ASSERT(0 == cx_strcmp(list[1], CX_STR("b")));
universe@777 499 CX_TEST_ASSERT(0 == cx_strcmp(list[2], CX_STR("c,")));
universe@777 500 cxFree(alloc, list);
universe@777 501
universe@777 502 // exact match
universe@777 503 n = cx_strsplit_a(alloc, test, CX_STR("this,is,a,csv,string"), capa, &list);
universe@777 504 CX_TEST_ASSERT(n == 2);
universe@777 505 CX_TEST_ASSERT(0 == cx_strcmp(list[0], CX_STR("")));
universe@777 506 CX_TEST_ASSERT(0 == cx_strcmp(list[1], CX_STR("")));
universe@777 507 cxFree(alloc, list);
universe@777 508
universe@777 509 // string to be split is only substring
universe@777 510 n = cx_strsplit_a(alloc, test, CX_STR("this,is,a,csv,string,with,extension"), capa, &list);
universe@777 511 CX_TEST_ASSERT(n == 1);
universe@777 512 CX_TEST_ASSERT(0 == cx_strcmp(list[0], test));
universe@777 513 cxFree(alloc, list);
universe@777 514
universe@777 515 // subsequent encounter of delimiter (the string between is empty)
universe@777 516 n = cx_strsplit_a(alloc, test, CX_STR("is,"), capa, &list);
universe@777 517 CX_TEST_ASSERT(n == 3);
universe@777 518 CX_TEST_ASSERT(0 == cx_strcmp(list[0], CX_STR("th")));
universe@777 519 CX_TEST_ASSERT(0 == cx_strcmp(list[1], CX_STR("")));
universe@777 520 CX_TEST_ASSERT(0 == cx_strcmp(list[2], CX_STR("a,csv,string")));
universe@777 521 cxFree(alloc, list);
universe@777 522
universe@777 523 // call the _m variant just for coverage
universe@777 524 cxmutstr mtest = cx_strdup(test);
universe@777 525 cxmutstr *mlist;
universe@777 526 n = cx_strsplit_ma(alloc, mtest, CX_STR("is,"), 4, &mlist);
universe@777 527 CX_TEST_ASSERT(n == 3);
universe@777 528 CX_TEST_ASSERT(0 == cx_strcmp(cx_strcast(mlist[0]), CX_STR("th")));
universe@777 529 CX_TEST_ASSERT(0 == cx_strcmp(cx_strcast(mlist[1]), CX_STR("")));
universe@777 530 CX_TEST_ASSERT(0 == cx_strcmp(cx_strcast(mlist[2]), CX_STR("a,csv,string")));
universe@777 531 cxFree(alloc, mlist);
universe@777 532 cx_strfree(&mtest);
universe@777 533
universe@777 534 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
universe@777 535 }
universe@777 536 cx_testing_allocator_destroy(&talloc);
universe@777 537 }
universe@777 538
universe@777 539 CX_TEST(test_strtrim) {
universe@777 540 cxstring t1 = cx_strtrim(CX_STR(" ein test \t "));
universe@777 541 cxstring t2 = cx_strtrim(CX_STR("abc"));
universe@777 542 cxstring t3 = cx_strtrim(CX_STR(" 123"));
universe@777 543 cxstring t4 = cx_strtrim(CX_STR("xyz "));
universe@777 544 cxstring t5 = cx_strtrim(CX_STR(" "));
universe@777 545 cxstring empty = cx_strtrim(CX_STR(""));
universe@777 546
universe@777 547 CX_TEST_DO {
universe@777 548 CX_TEST_ASSERT(0 == cx_strcmp(t1, CX_STR("ein test")));
universe@777 549 CX_TEST_ASSERT(0 == cx_strcmp(t2, CX_STR("abc")));
universe@777 550 CX_TEST_ASSERT(0 == cx_strcmp(t3, CX_STR("123")));
universe@777 551 CX_TEST_ASSERT(0 == cx_strcmp(t4, CX_STR("xyz")));
universe@777 552 CX_TEST_ASSERT(0 == cx_strcmp(t5, CX_STR("")));
universe@777 553 CX_TEST_ASSERT(0 == cx_strcmp(empty, CX_STR("")));
universe@777 554
universe@777 555 // call the _m variant just for coverage
universe@777 556 cxmutstr m1 = cx_strtrim_m(cx_mutstr((char *) " ein test \t "));
universe@777 557 CX_TEST_ASSERT(0 == cx_strcmp(cx_strcast(m1), CX_STR("ein test")));
universe@777 558 }
universe@777 559 }
universe@777 560
universe@777 561 CX_TEST(test_strprefix) {
universe@777 562 cxstring str = CX_STR("test my prefix and my suffix");
universe@777 563 cxstring empty = CX_STR("");
universe@777 564 CX_TEST_DO {
universe@777 565 CX_TEST_ASSERT(!cx_strprefix(empty, CX_STR("pref")));
universe@777 566 CX_TEST_ASSERT(cx_strprefix(str, empty));
universe@777 567 CX_TEST_ASSERT(cx_strprefix(empty, empty));
universe@777 568 CX_TEST_ASSERT(cx_strprefix(str, CX_STR("test ")));
universe@777 569 CX_TEST_ASSERT(!cx_strprefix(str, CX_STR("8-) fsck ")));
universe@777 570 }
universe@777 571 }
universe@777 572
universe@777 573 CX_TEST(test_strsuffix) {
universe@777 574 cxstring str = CX_STR("test my prefix and my suffix");
universe@777 575 cxstring empty = CX_STR("");
universe@777 576 CX_TEST_DO {
universe@777 577 CX_TEST_ASSERT(!cx_strsuffix(empty, CX_STR("suf")));
universe@777 578 CX_TEST_ASSERT(cx_strsuffix(str, empty));
universe@777 579 CX_TEST_ASSERT(cx_strsuffix(empty, empty));
universe@777 580 CX_TEST_ASSERT(cx_strsuffix(str, CX_STR("fix")));
universe@777 581 CX_TEST_ASSERT(!cx_strsuffix(str, CX_STR("fox")));
universe@777 582 }
universe@777 583 }
universe@777 584
universe@777 585 CX_TEST(test_strcaseprefix) {
universe@777 586 cxstring str = CX_STR("test my prefix and my suffix");
universe@777 587 cxstring empty = CX_STR("");
universe@777 588 CX_TEST_DO {
universe@777 589 CX_TEST_ASSERT(!cx_strcaseprefix(empty, CX_STR("pREf")));
universe@777 590 CX_TEST_ASSERT(cx_strcaseprefix(str, empty));
universe@777 591 CX_TEST_ASSERT(cx_strcaseprefix(empty, empty));
universe@777 592 CX_TEST_ASSERT(cx_strcaseprefix(str, CX_STR("TEST ")));
universe@777 593 CX_TEST_ASSERT(!cx_strcaseprefix(str, CX_STR("8-) fsck ")));
universe@777 594 }
universe@777 595 }
universe@777 596
universe@777 597 CX_TEST(test_strcasesuffix) {
universe@777 598 cxstring str = CX_STR("test my prefix and my suffix");
universe@777 599 cxstring empty = CX_STR("");
universe@777 600 CX_TEST_DO {
universe@777 601 CX_TEST_ASSERT(!cx_strcasesuffix(empty, CX_STR("sUf")));
universe@777 602 CX_TEST_ASSERT(cx_strcasesuffix(str, empty));
universe@777 603 CX_TEST_ASSERT(cx_strcasesuffix(empty, empty));
universe@777 604 CX_TEST_ASSERT(cx_strcasesuffix(str, CX_STR("FIX")));
universe@777 605 CX_TEST_ASSERT(!cx_strcasesuffix(str, CX_STR("fox")));
universe@777 606 }
universe@777 607 }
universe@777 608
universe@777 609 CX_TEST(test_strreplace) {
universe@777 610 CxTestingAllocator talloc;
universe@777 611 cx_testing_allocator_init(&talloc);
universe@777 612 CxAllocator *alloc = &talloc.base;
universe@777 613
universe@777 614 cxstring str = CX_STR("test ababab string aba");
universe@777 615 cxstring longstr = CX_STR(
universe@777 616 "xyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacd");
universe@777 617 cxstring notrail = CX_STR("test abab");
universe@777 618 cxstring empty = CX_STR("");
universe@777 619 cxstring astr = CX_STR("aaaaaaaaaa");
universe@777 620 cxstring csstr = CX_STR("test AB ab TEST xyz");
universe@777 621
universe@777 622 cxmutstr repl = cx_strreplace(str, CX_STR("abab"), CX_STR("muchlonger"));
universe@777 623 char const *expected = "test muchlongerab string aba";
universe@777 624
universe@777 625 cxmutstr repln = cx_strreplacen(str, CX_STR("ab"), CX_STR("c"), 2);
universe@777 626 char const *expectedn = "test ccab string aba";
universe@777 627
universe@777 628 cxmutstr longrepl = cx_strreplace(longstr, CX_STR("a"), CX_STR("z"));
universe@777 629 char const *longexpect = "xyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzcd";
universe@777 630
universe@777 631 cxmutstr replnotrail = cx_strreplace(notrail, CX_STR("ab"), CX_STR("z"));
universe@777 632 char const *notrailexpect = "test zz";
universe@777 633
universe@777 634 cxmutstr repleq = cx_strreplace(str, str, CX_STR("hello"));
universe@777 635 char const *eqexpect = "hello";
universe@777 636
universe@777 637 cxmutstr replempty1 = cx_strreplace(empty, CX_STR("ab"), CX_STR("c")); // expect: empty
universe@777 638 cxmutstr replempty2 = cx_strreplace(str, CX_STR("abab"), empty);
universe@777 639 char const *emptyexpect2 = "test ab string aba";
universe@777 640
universe@777 641 cxmutstr replpre = cx_strreplace(str, CX_STR("test "), CX_STR("TEST "));
universe@777 642 char const *preexpected = "TEST ababab string aba";
universe@777 643
universe@777 644 cxmutstr replan1 = cx_strreplacen(astr, CX_STR("a"), CX_STR("x"), 1);
universe@777 645 char const *an1expected = "xaaaaaaaaa";
universe@777 646
universe@777 647 cxmutstr replan4 = cx_strreplacen(astr, CX_STR("a"), CX_STR("x"), 4);
universe@777 648 char const *an4expected = "xxxxaaaaaa";
universe@777 649
universe@777 650 cxmutstr replan9 = cx_strreplacen(astr, CX_STR("a"), CX_STR("x"), 9);
universe@777 651 char const *an9expected = "xxxxxxxxxa";
universe@777 652
universe@777 653 cxmutstr replan10 = cx_strreplacen(astr, CX_STR("a"), CX_STR("x"), 10);
universe@777 654 char const *an10expected = "xxxxxxxxxx";
universe@777 655
universe@777 656 CX_TEST_DO {
universe@777 657 cxmutstr repl1_a = cx_strreplace_a(alloc, csstr, CX_STR("AB"), CX_STR("*"));
universe@777 658 char const *expeced1_a = "test * ab TEST xyz";
universe@777 659
universe@777 660 cxmutstr repl2_a = cx_strreplace_a(alloc, csstr, CX_STR("test"), CX_STR("TEST"));
universe@777 661 char const *expected2_a = "TEST AB ab TEST xyz";
universe@777 662
universe@777 663 CX_TEST_ASSERT(repl.ptr != str.ptr);
universe@777 664 ASSERT_ZERO_TERMINATED(repl);
universe@777 665 CX_TEST_ASSERT(0 == strcmp(repl.ptr, expected));
universe@777 666 ASSERT_ZERO_TERMINATED(repln);
universe@777 667 CX_TEST_ASSERT(0 == strcmp(repln.ptr, expectedn));
universe@777 668 ASSERT_ZERO_TERMINATED(longrepl);
universe@777 669 CX_TEST_ASSERT(0 == strcmp(longrepl.ptr, longexpect));
universe@777 670 ASSERT_ZERO_TERMINATED(replnotrail);
universe@777 671 CX_TEST_ASSERT(0 == strcmp(replnotrail.ptr, notrailexpect));
universe@777 672 ASSERT_ZERO_TERMINATED(repleq);
universe@777 673 CX_TEST_ASSERT(0 == strcmp(repleq.ptr, eqexpect));
universe@777 674 ASSERT_ZERO_TERMINATED(replempty1);
universe@777 675 CX_TEST_ASSERT(0 == strcmp(replempty1.ptr, ""));
universe@777 676 ASSERT_ZERO_TERMINATED(replempty2);
universe@777 677 CX_TEST_ASSERT(0 == strcmp(replempty2.ptr, emptyexpect2));
universe@777 678 ASSERT_ZERO_TERMINATED(replpre);
universe@777 679 CX_TEST_ASSERT(0 == strcmp(replpre.ptr, preexpected));
universe@777 680 ASSERT_ZERO_TERMINATED(replan1);
universe@777 681 CX_TEST_ASSERT(0 == strcmp(replan1.ptr, an1expected));
universe@777 682 ASSERT_ZERO_TERMINATED(replan4);
universe@777 683 CX_TEST_ASSERT(0 == strcmp(replan4.ptr, an4expected));
universe@777 684 ASSERT_ZERO_TERMINATED(replan9);
universe@777 685 CX_TEST_ASSERT(0 == strcmp(replan9.ptr, an9expected));
universe@777 686 ASSERT_ZERO_TERMINATED(replan10);
universe@777 687 CX_TEST_ASSERT(0 == strcmp(replan10.ptr, an10expected));
universe@777 688 ASSERT_ZERO_TERMINATED(repl1_a);
universe@777 689 CX_TEST_ASSERT(0 == strcmp(repl1_a.ptr, expeced1_a));
universe@777 690 ASSERT_ZERO_TERMINATED(repl2_a);
universe@777 691 CX_TEST_ASSERT(0 == strcmp(repl2_a.ptr, expected2_a));
universe@777 692
universe@777 693 cx_strfree_a(alloc, &repl1_a);
universe@777 694 cx_strfree_a(alloc, &repl2_a);
universe@777 695 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
universe@777 696 }
universe@777 697
universe@777 698 cx_strfree(&repl);
universe@777 699 cx_strfree(&repln);
universe@777 700 cx_strfree(&longrepl);
universe@777 701 cx_strfree(&replnotrail);
universe@777 702 cx_strfree(&repleq);
universe@777 703 cx_strfree(&replempty1);
universe@777 704 cx_strfree(&replempty2);
universe@777 705 cx_strfree(&replpre);
universe@777 706 cx_strfree(&replan1);
universe@777 707 cx_strfree(&replan4);
universe@777 708 cx_strfree(&replan9);
universe@777 709 cx_strfree(&replan10);
universe@777 710 cx_testing_allocator_destroy(&talloc);
universe@777 711 }
universe@777 712
universe@777 713 CX_TEST(test_strupper) {
universe@777 714 cxmutstr str = cx_strdup(CX_STR("thIs 1s @ Te$t"));
universe@777 715 CX_TEST_DO {
universe@777 716 cx_strupper(str);
universe@777 717 CX_TEST_ASSERT(0 == strcmp(str.ptr, "THIS 1S @ TE$T"));
universe@777 718 }
universe@777 719 cx_strfree(&str);
universe@777 720 }
universe@777 721
universe@777 722 CX_TEST(test_strlower) {
universe@777 723 cxmutstr str = cx_strdup(CX_STR("thIs 1s @ Te$t"));
universe@777 724 CX_TEST_DO {
universe@777 725 cx_strlower(str);
universe@777 726 CX_TEST_ASSERT(0 == strcmp(str.ptr, "this 1s @ te$t"));
universe@777 727 }
universe@777 728 cx_strfree(&str);
universe@777 729 }
universe@777 730
universe@777 731 CX_TEST(test_strtok) {
universe@777 732 cxstring str = CX_STR("a,comma,separated,string");
universe@777 733 cxstring delim = CX_STR(",");
universe@777 734 CX_TEST_DO {
universe@777 735 CxStrtokCtx ctx = cx_strtok(str, delim, 3);
universe@777 736 CX_TEST_ASSERT(ctx.str.ptr == str.ptr);
universe@777 737 CX_TEST_ASSERT(ctx.str.length == str.length);
universe@777 738 CX_TEST_ASSERT(ctx.delim.ptr == delim.ptr);
universe@777 739 CX_TEST_ASSERT(ctx.delim.length == delim.length);
universe@777 740 CX_TEST_ASSERT(ctx.limit == 3);
universe@777 741 CX_TEST_ASSERT(ctx.found == 0);
universe@777 742 CX_TEST_ASSERT(ctx.pos == 0);
universe@777 743 CX_TEST_ASSERT(ctx.next_pos == 0);
universe@777 744 CX_TEST_ASSERT(ctx.delim_more == NULL);
universe@777 745 CX_TEST_ASSERT(ctx.delim_more_count == 0);
universe@777 746 }
universe@777 747 }
universe@777 748
universe@777 749 CX_TEST(test_strtok_m) {
universe@777 750 cxmutstr str = cx_strdup(CX_STR("a,comma,separated,string"));
universe@777 751 cxstring delim = CX_STR(",");
universe@777 752 CX_TEST_DO {
universe@777 753 CxStrtokCtx ctx = cx_strtok_m(str, delim, 3);
universe@777 754 CX_TEST_ASSERT(ctx.str.ptr == str.ptr);
universe@777 755 CX_TEST_ASSERT(ctx.str.length == str.length);
universe@777 756 CX_TEST_ASSERT(ctx.delim.ptr == delim.ptr);
universe@777 757 CX_TEST_ASSERT(ctx.delim.length == delim.length);
universe@777 758 CX_TEST_ASSERT(ctx.limit == 3);
universe@777 759 CX_TEST_ASSERT(ctx.found == 0);
universe@777 760 CX_TEST_ASSERT(ctx.pos == 0);
universe@777 761 CX_TEST_ASSERT(ctx.next_pos == 0);
universe@777 762 CX_TEST_ASSERT(ctx.delim_more == NULL);
universe@777 763 CX_TEST_ASSERT(ctx.delim_more_count == 0);
universe@777 764 }
universe@777 765 cx_strfree(&str);
universe@777 766 }
universe@777 767
universe@777 768 CX_TEST(test_strtok_delim) {
universe@777 769 cxstring str = CX_STR("an,arbitrarily|separated;string");
universe@777 770 cxstring delim = CX_STR(",");
universe@777 771 cxstring delim_more[2] = {CX_STR("|"), CX_STR(";")};
universe@777 772 CX_TEST_DO {
universe@777 773 CxStrtokCtx ctx = cx_strtok(str, delim, 3);
universe@777 774 cx_strtok_delim(&ctx, delim_more, 2);
universe@777 775 CX_TEST_ASSERT(ctx.str.ptr == str.ptr);
universe@777 776 CX_TEST_ASSERT(ctx.str.length == str.length);
universe@777 777 CX_TEST_ASSERT(ctx.delim.ptr == delim.ptr);
universe@777 778 CX_TEST_ASSERT(ctx.delim.length == delim.length);
universe@777 779 CX_TEST_ASSERT(ctx.limit == 3);
universe@777 780 CX_TEST_ASSERT(ctx.found == 0);
universe@777 781 CX_TEST_ASSERT(ctx.pos == 0);
universe@777 782 CX_TEST_ASSERT(ctx.next_pos == 0);
universe@777 783 CX_TEST_ASSERT(ctx.delim_more == delim_more);
universe@777 784 CX_TEST_ASSERT(ctx.delim_more_count == 2);
universe@777 785 }
universe@777 786 }
universe@777 787
universe@777 788 CX_TEST(test_strtok_next_easy) {
universe@777 789 cxstring str = CX_STR("a,comma,separated,string");
universe@777 790 cxstring delim = CX_STR(",");
universe@777 791 CX_TEST_DO {
universe@777 792 CxStrtokCtx ctx = cx_strtok(str, delim, 3);
universe@777 793 bool ret;
universe@777 794 cxstring tok;
universe@777 795
universe@777 796 ret = cx_strtok_next(&ctx, &tok);
universe@777 797 CX_TEST_ASSERT(ret);
universe@777 798 CX_TEST_ASSERT(0 == cx_strcmp(tok, CX_STR("a")));
universe@777 799 CX_TEST_ASSERT(ctx.pos == 0);
universe@777 800 CX_TEST_ASSERT(ctx.next_pos == 2);
universe@777 801 CX_TEST_ASSERT(ctx.delim_pos == 1);
universe@777 802 CX_TEST_ASSERT(ctx.found == 1);
universe@777 803
universe@777 804 ret = cx_strtok_next(&ctx, &tok);
universe@777 805 CX_TEST_ASSERT(ret);
universe@777 806 CX_TEST_ASSERT(0 == cx_strcmp(tok, CX_STR("comma")));
universe@777 807 CX_TEST_ASSERT(ctx.pos == 2);
universe@777 808 CX_TEST_ASSERT(ctx.next_pos == 8);
universe@777 809 CX_TEST_ASSERT(ctx.delim_pos == 7);
universe@777 810 CX_TEST_ASSERT(ctx.found == 2);
universe@777 811
universe@777 812 ret = cx_strtok_next(&ctx, &tok);
universe@777 813 CX_TEST_ASSERT(ret);
universe@777 814 CX_TEST_ASSERT(0 == cx_strcmp(tok, CX_STR("separated")));
universe@777 815 CX_TEST_ASSERT(ctx.pos == 8);
universe@777 816 CX_TEST_ASSERT(ctx.next_pos == 18);
universe@777 817 CX_TEST_ASSERT(ctx.delim_pos == 17);
universe@777 818 CX_TEST_ASSERT(ctx.found == 3);
universe@777 819
universe@777 820 ret = cx_strtok_next(&ctx, &tok);
universe@777 821 CX_TEST_ASSERT(!ret);
universe@777 822 CX_TEST_ASSERT(ctx.pos == 8);
universe@777 823 CX_TEST_ASSERT(ctx.next_pos == 18);
universe@777 824 CX_TEST_ASSERT(ctx.delim_pos == 17);
universe@777 825 CX_TEST_ASSERT(ctx.found == 3);
universe@777 826 }
universe@777 827 }
universe@777 828
universe@777 829 CX_TEST(test_strtok_next_unlimited) {
universe@777 830 cxstring str = CX_STR("some;-;otherwise;-;separated;-;string;-;");
universe@777 831 cxstring delim = CX_STR(";-;");
universe@777 832 CX_TEST_DO {
universe@777 833 CxStrtokCtx ctx = cx_strtok(str, delim, SIZE_MAX);
universe@777 834 bool ret;
universe@777 835 cxstring tok;
universe@777 836
universe@777 837 ret = cx_strtok_next(&ctx, &tok);
universe@777 838 CX_TEST_ASSERT(ret);
universe@777 839 CX_TEST_ASSERT(0 == cx_strcmp(tok, CX_STR("some")));
universe@777 840 CX_TEST_ASSERT(ctx.pos == 0);
universe@777 841 CX_TEST_ASSERT(ctx.next_pos == 7);
universe@777 842 CX_TEST_ASSERT(ctx.delim_pos == 4);
universe@777 843 CX_TEST_ASSERT(ctx.found == 1);
universe@777 844
universe@777 845 ret = cx_strtok_next(&ctx, &tok);
universe@777 846 CX_TEST_ASSERT(ret);
universe@777 847 CX_TEST_ASSERT(0 == cx_strcmp(tok, CX_STR("otherwise")));
universe@777 848 CX_TEST_ASSERT(ctx.pos == 7);
universe@777 849 CX_TEST_ASSERT(ctx.next_pos == 19);
universe@777 850 CX_TEST_ASSERT(ctx.delim_pos == 16);
universe@777 851 CX_TEST_ASSERT(ctx.found == 2);
universe@777 852
universe@777 853 ret = cx_strtok_next(&ctx, &tok);
universe@777 854 CX_TEST_ASSERT(ret);
universe@777 855 CX_TEST_ASSERT(0 == cx_strcmp(tok, CX_STR("separated")));
universe@777 856 CX_TEST_ASSERT(ctx.pos == 19);
universe@777 857 CX_TEST_ASSERT(ctx.next_pos == 31);
universe@777 858 CX_TEST_ASSERT(ctx.delim_pos == 28);
universe@777 859 CX_TEST_ASSERT(ctx.found == 3);
universe@777 860
universe@777 861 ret = cx_strtok_next(&ctx, &tok);
universe@777 862 CX_TEST_ASSERT(ret);
universe@777 863 CX_TEST_ASSERT(0 == cx_strcmp(tok, CX_STR("string")));
universe@777 864 CX_TEST_ASSERT(ctx.pos == 31);
universe@777 865 CX_TEST_ASSERT(ctx.next_pos == 40);
universe@777 866 CX_TEST_ASSERT(ctx.delim_pos == 37);
universe@777 867 CX_TEST_ASSERT(ctx.found == 4);
universe@777 868
universe@777 869 ret = cx_strtok_next(&ctx, &tok);
universe@777 870 CX_TEST_ASSERT(ret);
universe@777 871 CX_TEST_ASSERT(0 == cx_strcmp(tok, CX_STR("")));
universe@777 872 CX_TEST_ASSERT(ctx.pos == 40);
universe@777 873 CX_TEST_ASSERT(ctx.next_pos == 40);
universe@777 874 CX_TEST_ASSERT(ctx.delim_pos == 40);
universe@777 875 CX_TEST_ASSERT(ctx.found == 5);
universe@777 876
universe@777 877 ret = cx_strtok_next(&ctx, &tok);
universe@777 878 CX_TEST_ASSERT(!ret);
universe@777 879 CX_TEST_ASSERT(ctx.pos == 40);
universe@777 880 CX_TEST_ASSERT(ctx.delim_pos == 40);
universe@777 881 CX_TEST_ASSERT(ctx.found == 5);
universe@777 882 }
universe@777 883 }
universe@777 884
universe@777 885 CX_TEST(test_strtok_next_advanced) {
universe@777 886 cxmutstr str = cx_strdup(CX_STR("an,arbitrarily;||separated;string"));
universe@777 887 cxstring delim = CX_STR(",");
universe@777 888 cxstring delim_more[2] = {CX_STR("||"), CX_STR(";")};
universe@777 889 CX_TEST_DO {
universe@777 890 CxStrtokCtx ctx = cx_strtok_m(str, delim, 10);
universe@777 891 cx_strtok_delim(&ctx, delim_more, 2);
universe@777 892 bool ret;
universe@777 893 cxmutstr tok;
universe@777 894
universe@777 895 ret = cx_strtok_next_m(&ctx, &tok);
universe@777 896 CX_TEST_ASSERT(ret);
universe@777 897 CX_TEST_ASSERT(0 == cx_strcmp(cx_strcast(tok), CX_STR("an")));
universe@777 898 CX_TEST_ASSERT(ctx.pos == 0);
universe@777 899 CX_TEST_ASSERT(ctx.next_pos == 3);
universe@777 900 CX_TEST_ASSERT(ctx.delim_pos == 2);
universe@777 901 CX_TEST_ASSERT(ctx.found == 1);
universe@777 902 cx_strupper(tok);
universe@777 903
universe@777 904 ret = cx_strtok_next_m(&ctx, &tok);
universe@777 905 CX_TEST_ASSERT(ret);
universe@777 906 CX_TEST_ASSERT(0 == cx_strcmp(cx_strcast(tok), CX_STR("arbitrarily")));
universe@777 907 CX_TEST_ASSERT(ctx.pos == 3);
universe@777 908 CX_TEST_ASSERT(ctx.next_pos == 15);
universe@777 909 CX_TEST_ASSERT(ctx.delim_pos == 14);
universe@777 910 CX_TEST_ASSERT(ctx.found == 2);
universe@777 911 cx_strupper(tok);
universe@777 912
universe@777 913 ret = cx_strtok_next_m(&ctx, &tok);
universe@777 914 CX_TEST_ASSERT(ret);
universe@777 915 CX_TEST_ASSERT(0 == cx_strcmp(cx_strcast(tok), CX_STR("")));
universe@777 916 CX_TEST_ASSERT(ctx.pos == 15);
universe@777 917 CX_TEST_ASSERT(ctx.next_pos == 17);
universe@777 918 CX_TEST_ASSERT(ctx.delim_pos == 15);
universe@777 919 CX_TEST_ASSERT(ctx.found == 3);
universe@777 920 cx_strupper(tok);
universe@777 921
universe@777 922 ret = cx_strtok_next_m(&ctx, &tok);
universe@777 923 CX_TEST_ASSERT(ret);
universe@777 924 CX_TEST_ASSERT(0 == cx_strcmp(cx_strcast(tok), CX_STR("separated")));
universe@777 925 CX_TEST_ASSERT(ctx.pos == 17);
universe@777 926 CX_TEST_ASSERT(ctx.next_pos == 27);
universe@777 927 CX_TEST_ASSERT(ctx.delim_pos == 26);
universe@777 928 CX_TEST_ASSERT(ctx.found == 4);
universe@777 929 cx_strupper(tok);
universe@777 930
universe@777 931 ret = cx_strtok_next_m(&ctx, &tok);
universe@777 932 CX_TEST_ASSERT(ret);
universe@777 933 CX_TEST_ASSERT(0 == cx_strcmp(cx_strcast(tok), CX_STR("string")));
universe@777 934 CX_TEST_ASSERT(ctx.pos == 27);
universe@777 935 CX_TEST_ASSERT(ctx.next_pos == 33);
universe@777 936 CX_TEST_ASSERT(ctx.delim_pos == 33);
universe@777 937 CX_TEST_ASSERT(ctx.found == 5);
universe@777 938 cx_strupper(tok);
universe@777 939
universe@777 940 ret = cx_strtok_next_m(&ctx, &tok);
universe@777 941 CX_TEST_ASSERT(!ret);
universe@777 942 CX_TEST_ASSERT(ctx.pos == 27);
universe@777 943 CX_TEST_ASSERT(ctx.next_pos == 33);
universe@777 944 CX_TEST_ASSERT(ctx.delim_pos == 33);
universe@777 945 CX_TEST_ASSERT(ctx.found == 5);
universe@777 946
universe@777 947 CX_TEST_ASSERT(0 == cx_strcmp(cx_strcast(str), CX_STR("AN,ARBITRARILY;||SEPARATED;STRING")));
universe@777 948 }
universe@777 949 cx_strfree(&str);
universe@777 950 }
universe@777 951
universe@777 952
universe@777 953 CxTestSuite *cx_test_suite_string(void) {
universe@777 954 CxTestSuite *suite = cx_test_suite_new("string");
universe@777 955
universe@777 956 cx_test_register(suite, test_string_construct);
universe@777 957 cx_test_register(suite, test_strfree);
universe@777 958 cx_test_register(suite, test_strdup);
universe@777 959 cx_test_register(suite, test_strdup_shortened);
universe@777 960 cx_test_register(suite, test_strlen);
universe@777 961 cx_test_register(suite, test_strsubs);
universe@777 962 cx_test_register(suite, test_strchr);
universe@777 963 cx_test_register(suite, test_strrchr);
universe@777 964 cx_test_register(suite, test_strstr);
universe@777 965 cx_test_register(suite, test_strcmp);
universe@777 966 cx_test_register(suite, test_strcasecmp);
universe@777 967 cx_test_register(suite, test_strcat);
universe@777 968 cx_test_register(suite, test_strsplit);
universe@777 969 cx_test_register(suite, test_strsplit_a);
universe@777 970 cx_test_register(suite, test_strtrim);
universe@777 971 cx_test_register(suite, test_strprefix);
universe@777 972 cx_test_register(suite, test_strsuffix);
universe@777 973 cx_test_register(suite, test_strcaseprefix);
universe@777 974 cx_test_register(suite, test_strcasesuffix);
universe@777 975 cx_test_register(suite, test_strreplace);
universe@777 976 cx_test_register(suite, test_strupper);
universe@777 977 cx_test_register(suite, test_strlower);
universe@777 978 cx_test_register(suite, test_strtok);
universe@777 979 cx_test_register(suite, test_strtok_m);
universe@777 980 cx_test_register(suite, test_strtok_delim);
universe@777 981 cx_test_register(suite, test_strtok_next_easy);
universe@777 982 cx_test_register(suite, test_strtok_next_unlimited);
universe@777 983 cx_test_register(suite, test_strtok_next_advanced);
universe@777 984
universe@777 985 return suite;
universe@777 986 }

mercurial