test/test_string.cpp

Fri, 09 Sep 2022 20:19:08 +0200

author
Mike Becker <universe@uap-core.de>
date
Fri, 09 Sep 2022 20:19:08 +0200
changeset 583
0f3c9662f9b5
child 585
038f5e99e00f
permissions
-rw-r--r--

add tests and missing implementations for strings

universe@583 1 /*
universe@583 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
universe@583 3 *
universe@583 4 * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
universe@583 5 *
universe@583 6 * Redistribution and use in source and binary forms, with or without
universe@583 7 * modification, are permitted provided that the following conditions are met:
universe@583 8 *
universe@583 9 * 1. Redistributions of source code must retain the above copyright
universe@583 10 * notice, this list of conditions and the following disclaimer.
universe@583 11 *
universe@583 12 * 2. Redistributions in binary form must reproduce the above copyright
universe@583 13 * notice, this list of conditions and the following disclaimer in the
universe@583 14 * documentation and/or other materials provided with the distribution.
universe@583 15 *
universe@583 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
universe@583 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
universe@583 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
universe@583 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
universe@583 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
universe@583 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
universe@583 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
universe@583 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
universe@583 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
universe@583 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
universe@583 26 * POSSIBILITY OF SUCH DAMAGE.
universe@583 27 */
universe@583 28
universe@583 29 #include "cx/string.h"
universe@583 30 #include "util_allocator.h"
universe@583 31
universe@583 32 #include <gtest/gtest.h>
universe@583 33
universe@583 34 TEST(String, construct) {
universe@583 35 cxstring s1 = cx_str("1234");
universe@583 36 cxstring s2 = cx_strn("abcd", 2);
universe@583 37 cxmutstr s3 = cx_mutstr((char *) "1234");
universe@583 38 cxmutstr s4 = cx_mutstrn((char *) "abcd", 2);
universe@583 39
universe@583 40 EXPECT_EQ(s1.length, 4);
universe@583 41 EXPECT_EQ(s2.length, 2);
universe@583 42 EXPECT_EQ(s3.length, 4);
universe@583 43 EXPECT_EQ(s4.length, 2);
universe@583 44 }
universe@583 45
universe@583 46 TEST(String, strfree) {
universe@583 47 CxTestingAllocator alloc;
universe@583 48 auto test = (char *) cxMalloc(&alloc, 16);
universe@583 49 cxmutstr str = cx_mutstrn(test, 16);
universe@583 50 ASSERT_EQ(str.ptr, test);
universe@583 51 EXPECT_EQ(str.length, 16);
universe@583 52 cx_strfree_a(&alloc, &str);
universe@583 53 EXPECT_EQ(str.ptr, nullptr);
universe@583 54 EXPECT_EQ(str.length, 0);
universe@583 55 EXPECT_TRUE(alloc.verify());
universe@583 56 }
universe@583 57
universe@583 58 TEST(String, strlen) {
universe@583 59 cxstring s1 = CX_STR("1234");
universe@583 60 cxstring s2 = CX_STR(".:.:.");
universe@583 61 cxstring s3 = CX_STR("X");
universe@583 62
universe@583 63 size_t len0 = cx_strlen(0);
universe@583 64 size_t len1 = cx_strlen(1, s1);
universe@583 65 size_t len2 = cx_strlen(2, s1, s2);
universe@583 66 size_t len3 = cx_strlen(3, s1, s2, s3);
universe@583 67
universe@583 68 EXPECT_EQ(len0, 0);
universe@583 69 EXPECT_EQ(len1, 4);
universe@583 70 EXPECT_EQ(len2, 9);
universe@583 71 EXPECT_EQ(len3, 10);
universe@583 72 }
universe@583 73
universe@583 74
universe@583 75 TEST(String, strchr) {
universe@583 76 cxstring str = CX_STR("I will find you - and I will kill you");
universe@583 77
universe@583 78 cxstring notfound = cx_strchr(str, 'x');
universe@583 79 EXPECT_EQ(notfound.length, 0);
universe@583 80
universe@583 81 cxstring result = cx_strchr(str, 'w');
universe@583 82 EXPECT_EQ(result.length, 35);
universe@583 83 EXPECT_EQ(strcmp("will find you - and I will kill you", result.ptr), 0);
universe@583 84 }
universe@583 85
universe@583 86 TEST(String, strrchr) {
universe@583 87 cxstring str = CX_STR("I will find you - and I will kill you");
universe@583 88
universe@583 89 cxstring notfound = cx_strrchr(str, 'x');
universe@583 90 EXPECT_EQ(notfound.length, 0);
universe@583 91
universe@583 92 cxstring result = cx_strrchr(str, 'w');
universe@583 93 EXPECT_EQ(result.length, 13);
universe@583 94 EXPECT_EQ(strcmp("will kill you", result.ptr), 0);
universe@583 95 }
universe@583 96
universe@583 97 TEST(String, strstr) {
universe@583 98 cxstring str = CX_STR("find the match in this string");
universe@583 99 cxstring longstr = CX_STR(
universe@583 100 "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl"
universe@583 101 "mnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwx"
universe@583 102 "yzabcdeababababnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghij"
universe@583 103 "klmnopqrstuvwxyzaababababababababrstuvwxyzabcdefghijklmnopqrstuv"
universe@583 104 "abababababababababababababababababababababababababababababababab"
universe@583 105 "abababababababababababababababababababababababababababababababab"
universe@583 106 "abababababababababababababababababababababababababababababababab"
universe@583 107 "abababababababababababababababababababababababababababababababab"
universe@583 108 "abababababababababababababababababababababababababababababababab"
universe@583 109 "abababababababababababababababababababababababababababababababab"
universe@583 110 "wxyz1234567890");
universe@583 111 cxstring longstrpattern = CX_STR(
universe@583 112 "abababababababababababababababababababababababababababababababab"
universe@583 113 "abababababababababababababababababababababababababababababababab"
universe@583 114 "abababababababababababababababababababababababababababababababab"
universe@583 115 "abababababababababababababababababababababababababababababababab"
universe@583 116 "abababababababababababababababababababababababababababababababab"
universe@583 117 );
universe@583 118 cxstring longstrresult = CX_STR(
universe@583 119 "abababababababababababababababababababababababababababababababab"
universe@583 120 "abababababababababababababababababababababababababababababababab"
universe@583 121 "abababababababababababababababababababababababababababababababab"
universe@583 122 "abababababababababababababababababababababababababababababababab"
universe@583 123 "abababababababababababababababababababababababababababababababab"
universe@583 124 "abababababababababababababababababababababababababababababababab"
universe@583 125 "wxyz1234567890"
universe@583 126 );
universe@583 127
universe@583 128 cxstring notfound = cx_strstr(str, cx_str("no match"));
universe@583 129 EXPECT_EQ(notfound.length, 0);
universe@583 130
universe@583 131 cxstring result = cx_strstr(str, cx_str("match"));
universe@583 132 EXPECT_EQ(result.length, 20);
universe@583 133 EXPECT_EQ(strcmp("match in this string", result.ptr), 0);
universe@583 134
universe@583 135 result = cx_strstr(str, cx_str(""));
universe@583 136 EXPECT_EQ(result.length, str.length);
universe@583 137 EXPECT_EQ(strcmp(str.ptr, result.ptr), 0);
universe@583 138
universe@583 139 result = cx_strstr(longstr, longstrpattern);
universe@583 140 EXPECT_EQ(result.length, longstrresult.length);
universe@583 141 EXPECT_EQ(strcmp(result.ptr, longstrresult.ptr), 0);
universe@583 142 }
universe@583 143
universe@583 144 TEST(String, strcmp) {
universe@583 145 cxstring str = CX_STR("compare this");
universe@583 146
universe@583 147 EXPECT_EQ(cx_strcmp(CX_STR(""), CX_STR("")), 0);
universe@583 148 EXPECT_GT(cx_strcmp(str, CX_STR("")), 0);
universe@583 149 EXPECT_EQ(cx_strcmp(str, CX_STR("compare this")), 0);
universe@583 150 EXPECT_NE(cx_strcmp(str, CX_STR("Compare This")), 0);
universe@583 151 EXPECT_LT(cx_strcmp(str, CX_STR("compare tool")), 0);
universe@583 152 EXPECT_GT(cx_strcmp(str, CX_STR("compare shit")), 0);
universe@583 153 EXPECT_LT(cx_strcmp(str, CX_STR("compare this not")), 0);
universe@583 154 EXPECT_GT(cx_strcmp(str, CX_STR("compare")), 0);
universe@583 155 }
universe@583 156
universe@583 157 TEST(String, strcasecmp) {
universe@583 158 cxstring str = CX_STR("compare this");
universe@583 159
universe@583 160 EXPECT_EQ(cx_strcasecmp(CX_STR(""), CX_STR("")), 0);
universe@583 161 EXPECT_GT(cx_strcasecmp(str, CX_STR("")), 0);
universe@583 162 EXPECT_EQ(cx_strcasecmp(str, CX_STR("compare this")), 0);
universe@583 163 EXPECT_EQ(cx_strcasecmp(str, CX_STR("Compare This")), 0);
universe@583 164 EXPECT_LT(cx_strcasecmp(str, CX_STR("compare tool")), 0);
universe@583 165 EXPECT_GT(cx_strcasecmp(str, CX_STR("compare shit")), 0);
universe@583 166 EXPECT_LT(cx_strcasecmp(str, CX_STR("compare this not")), 0);
universe@583 167 EXPECT_GT(cx_strcasecmp(str, CX_STR("compare")), 0);
universe@583 168 }
universe@583 169
universe@583 170
universe@583 171 TEST(String, strcat) {
universe@583 172 cxstring s1 = CX_STR("12");
universe@583 173 cxstring s2 = CX_STR("34");
universe@583 174 cxstring s3 = CX_STR("56");
universe@583 175 cxstring sn = {nullptr, 0};
universe@583 176
universe@583 177 CxTestingAllocator alloc;
universe@583 178
universe@583 179 cxmutstr t1 = cx_strcat_a(&alloc, 2, s1, s2);
universe@583 180 EXPECT_EQ(cx_strcmp(cx_strcast(t1), CX_STR("1234")), 0);
universe@583 181 cx_strfree_a(&alloc, &t1);
universe@583 182
universe@583 183 cxmutstr t2 = cx_strcat_a(&alloc, 3, s1, s2, s3);
universe@583 184 EXPECT_EQ(cx_strcmp(cx_strcast(t2), CX_STR("123456")), 0);
universe@583 185 cx_strfree_a(&alloc, &t2);
universe@583 186
universe@583 187 cxmutstr t3 = cx_strcat_a(&alloc, 6, s1, sn, s2, sn, s3, sn);
universe@583 188 EXPECT_EQ(cx_strcmp(cx_strcast(t3), CX_STR("123456")), 0);
universe@583 189 cx_strfree_a(&alloc, &t3);
universe@583 190
universe@583 191 cxmutstr t4 = cx_strcat_a(&alloc, 2, sn, sn);
universe@583 192 EXPECT_EQ(cx_strcmp(cx_strcast(t4), CX_STR("")), 0);
universe@583 193 cx_strfree_a(&alloc, &t4);
universe@583 194
universe@583 195 EXPECT_TRUE(alloc.verify());
universe@583 196 }
universe@583 197
universe@583 198 TEST(String, strsplit) {
universe@583 199
universe@583 200 cxstring test = cx_str("this,is,a,csv,string");
universe@583 201 size_t capa = 8;
universe@583 202 cxstring list[8];
universe@583 203 size_t n;
universe@583 204
universe@583 205 /* special case: empty string */
universe@583 206 n = cx_strsplit(test, cx_str(""), capa, list);
universe@583 207 ASSERT_EQ(n, 1);
universe@583 208 EXPECT_EQ(cx_strcmp(list[0], test), 0);
universe@583 209
universe@583 210 /* no delimiter occurrence */
universe@583 211 n = cx_strsplit(test, cx_str("z"), capa, list);
universe@583 212 ASSERT_EQ(n, 1);
universe@583 213 EXPECT_EQ(cx_strcmp(list[0], test), 0);
universe@583 214
universe@583 215 /* partially matching delimiter */
universe@583 216 n = cx_strsplit(test, cx_str("is,not"), capa, list);
universe@583 217 ASSERT_EQ(n, 1);
universe@583 218 EXPECT_EQ(cx_strcmp(list[0], test), 0);
universe@583 219
universe@583 220 /* matching single-char delimiter */
universe@583 221 n = cx_strsplit(test, cx_str(","), capa, list);
universe@583 222 ASSERT_EQ(n, 5);
universe@583 223 EXPECT_EQ(cx_strcmp(list[0], cx_str("this")), 0);
universe@583 224 EXPECT_EQ(cx_strcmp(list[1], cx_str("is")), 0);
universe@583 225 EXPECT_EQ(cx_strcmp(list[2], cx_str("a")), 0);
universe@583 226 EXPECT_EQ(cx_strcmp(list[3], cx_str("csv")), 0);
universe@583 227 EXPECT_EQ(cx_strcmp(list[4], cx_str("string")), 0);
universe@583 228
universe@583 229 /* matching multi-char delimiter */
universe@583 230 n = cx_strsplit(test, cx_str("is"), capa, list);
universe@583 231 ASSERT_EQ(n, 3);
universe@583 232 EXPECT_EQ(cx_strcmp(list[0], cx_str("th")), 0);
universe@583 233 EXPECT_EQ(cx_strcmp(list[1], cx_str(",")), 0);
universe@583 234 EXPECT_EQ(cx_strcmp(list[2], cx_str(",a,csv,string")), 0);
universe@583 235
universe@583 236 /* bounded list using single-char delimiter */
universe@583 237 n = cx_strsplit(test, cx_str(","), 3, list);
universe@583 238 ASSERT_EQ(n, 3);
universe@583 239 EXPECT_EQ(cx_strcmp(list[0], cx_str("this")), 0);
universe@583 240 EXPECT_EQ(cx_strcmp(list[1], cx_str("is")), 0);
universe@583 241 EXPECT_EQ(cx_strcmp(list[2], cx_str("a,csv,string")), 0);
universe@583 242
universe@583 243 /* bounded list using multi-char delimiter */
universe@583 244 n = cx_strsplit(test, cx_str("is"), 2, list);
universe@583 245 ASSERT_EQ(n, 2);
universe@583 246 EXPECT_EQ(cx_strcmp(list[0], cx_str("th")), 0);
universe@583 247 EXPECT_EQ(cx_strcmp(list[1], cx_str(",is,a,csv,string")), 0);
universe@583 248
universe@583 249 /* start with delimiter */
universe@583 250 n = cx_strsplit(test, cx_str("this"), capa, list);
universe@583 251 ASSERT_EQ(n, 2);
universe@583 252 EXPECT_EQ(cx_strcmp(list[0], cx_str("")), 0);
universe@583 253 EXPECT_EQ(cx_strcmp(list[1], cx_str(",is,a,csv,string")), 0);
universe@583 254
universe@583 255 /* end with delimiter */
universe@583 256 n = cx_strsplit(test, cx_str("string"), capa, list);
universe@583 257 ASSERT_EQ(n, 2);
universe@583 258 EXPECT_EQ(cx_strcmp(list[0], cx_str("this,is,a,csv,")), 0);
universe@583 259 EXPECT_EQ(cx_strcmp(list[1], cx_str("")), 0);
universe@583 260
universe@583 261
universe@583 262 /* end with delimiter exceed bound */
universe@583 263 n = cx_strsplit(cx_str("a,b,c,"), cx_str(","), 3, list);
universe@583 264 ASSERT_EQ(n, 3);
universe@583 265 EXPECT_EQ(cx_strcmp(list[0], cx_str("a")), 0);
universe@583 266 EXPECT_EQ(cx_strcmp(list[1], cx_str("b")), 0);
universe@583 267 EXPECT_EQ(cx_strcmp(list[2], cx_str("c,")), 0);
universe@583 268
universe@583 269 /* exact match */
universe@583 270 n = cx_strsplit(test, cx_str("this,is,a,csv,string"), capa, list);
universe@583 271 ASSERT_EQ(n, 2);
universe@583 272 EXPECT_EQ(cx_strcmp(list[0], cx_str("")), 0);
universe@583 273 EXPECT_EQ(cx_strcmp(list[1], cx_str("")), 0);
universe@583 274
universe@583 275 /* string to be split is only substring */
universe@583 276 n = cx_strsplit(test, cx_str("this,is,a,csv,string,with,extension"), capa, list);
universe@583 277 ASSERT_EQ(n, 1);
universe@583 278 EXPECT_EQ(cx_strcmp(list[0], test), 0);
universe@583 279
universe@583 280 /* subsequent encounter of delimiter (the string between is empty) */
universe@583 281 n = cx_strsplit(test, cx_str("is,"), capa, list);
universe@583 282 ASSERT_EQ(n, 3);
universe@583 283 EXPECT_EQ(cx_strcmp(list[0], cx_str("th")), 0);
universe@583 284 EXPECT_EQ(cx_strcmp(list[1], cx_str("")), 0);
universe@583 285 EXPECT_EQ(cx_strcmp(list[2], cx_str("a,csv,string")), 0);
universe@583 286 }
universe@583 287
universe@583 288 TEST(String, strsplit_a) {
universe@583 289 CxTestingAllocator alloc;
universe@583 290
universe@583 291 cxstring test = cx_str("this,is,a,csv,string");
universe@583 292 size_t capa = 8;
universe@583 293 cxstring *list;
universe@583 294 size_t n;
universe@583 295
universe@583 296 /* special case: empty string */
universe@583 297 n = cx_strsplit_a(&alloc, test, cx_str(""), capa, &list);
universe@583 298 ASSERT_EQ(n, 1);
universe@583 299 EXPECT_EQ(cx_strcmp(list[0], test), 0);
universe@583 300 cxFree(&alloc, list);
universe@583 301
universe@583 302 /* no delimiter occurrence */
universe@583 303 n = cx_strsplit_a(&alloc, test, cx_str("z"), capa, &list);
universe@583 304 ASSERT_EQ(n, 1);
universe@583 305 EXPECT_EQ(cx_strcmp(list[0], test), 0);
universe@583 306 cxFree(&alloc, list);
universe@583 307
universe@583 308 /* partially matching delimiter */
universe@583 309 n = cx_strsplit_a(&alloc, test, cx_str("is,not"), capa, &list);
universe@583 310 ASSERT_EQ(n, 1);
universe@583 311 EXPECT_EQ(cx_strcmp(list[0], test), 0);
universe@583 312 cxFree(&alloc, list);
universe@583 313
universe@583 314 /* matching single-char delimiter */
universe@583 315 n = cx_strsplit_a(&alloc, test, cx_str(","), capa, &list);
universe@583 316 ASSERT_EQ(n, 5);
universe@583 317 EXPECT_EQ(cx_strcmp(list[0], cx_str("this")), 0);
universe@583 318 EXPECT_EQ(cx_strcmp(list[1], cx_str("is")), 0);
universe@583 319 EXPECT_EQ(cx_strcmp(list[2], cx_str("a")), 0);
universe@583 320 EXPECT_EQ(cx_strcmp(list[3], cx_str("csv")), 0);
universe@583 321 EXPECT_EQ(cx_strcmp(list[4], cx_str("string")), 0);
universe@583 322 cxFree(&alloc, list);
universe@583 323
universe@583 324 /* matching multi-char delimiter */
universe@583 325 n = cx_strsplit_a(&alloc, test, cx_str("is"), capa, &list);
universe@583 326 ASSERT_EQ(n, 3);
universe@583 327 EXPECT_EQ(cx_strcmp(list[0], cx_str("th")), 0);
universe@583 328 EXPECT_EQ(cx_strcmp(list[1], cx_str(",")), 0);
universe@583 329 EXPECT_EQ(cx_strcmp(list[2], cx_str(",a,csv,string")), 0);
universe@583 330 cxFree(&alloc, list);
universe@583 331
universe@583 332 /* bounded list using single-char delimiter */
universe@583 333 n = cx_strsplit_a(&alloc, test, cx_str(","), 3, &list);
universe@583 334 ASSERT_EQ(n, 3);
universe@583 335 EXPECT_EQ(cx_strcmp(list[0], cx_str("this")), 0);
universe@583 336 EXPECT_EQ(cx_strcmp(list[1], cx_str("is")), 0);
universe@583 337 EXPECT_EQ(cx_strcmp(list[2], cx_str("a,csv,string")), 0);
universe@583 338 cxFree(&alloc, list);
universe@583 339
universe@583 340 /* bounded list using multi-char delimiter */
universe@583 341 n = cx_strsplit_a(&alloc, test, cx_str("is"), 2, &list);
universe@583 342 ASSERT_EQ(n, 2);
universe@583 343 EXPECT_EQ(cx_strcmp(list[0], cx_str("th")), 0);
universe@583 344 EXPECT_EQ(cx_strcmp(list[1], cx_str(",is,a,csv,string")), 0);
universe@583 345 cxFree(&alloc, list);
universe@583 346
universe@583 347 /* start with delimiter */
universe@583 348 n = cx_strsplit_a(&alloc, test, cx_str("this"), capa, &list);
universe@583 349 ASSERT_EQ(n, 2);
universe@583 350 EXPECT_EQ(cx_strcmp(list[0], cx_str("")), 0);
universe@583 351 EXPECT_EQ(cx_strcmp(list[1], cx_str(",is,a,csv,string")), 0);
universe@583 352 cxFree(&alloc, list);
universe@583 353
universe@583 354 /* end with delimiter */
universe@583 355 n = cx_strsplit_a(&alloc, test, cx_str("string"), capa, &list);
universe@583 356 ASSERT_EQ(n, 2);
universe@583 357 EXPECT_EQ(cx_strcmp(list[0], cx_str("this,is,a,csv,")), 0);
universe@583 358 EXPECT_EQ(cx_strcmp(list[1], cx_str("")), 0);
universe@583 359 cxFree(&alloc, list);
universe@583 360
universe@583 361 /* end with delimiter exceed bound */
universe@583 362 n = cx_strsplit_a(&alloc, cx_str("a,b,c,"), cx_str(","), 3, &list);
universe@583 363 ASSERT_EQ(n, 3);
universe@583 364 EXPECT_EQ(cx_strcmp(list[0], cx_str("a")), 0);
universe@583 365 EXPECT_EQ(cx_strcmp(list[1], cx_str("b")), 0);
universe@583 366 EXPECT_EQ(cx_strcmp(list[2], cx_str("c,")), 0);
universe@583 367 cxFree(&alloc, list);
universe@583 368
universe@583 369 /* exact match */
universe@583 370 n = cx_strsplit_a(&alloc, test, cx_str("this,is,a,csv,string"), capa, &list);
universe@583 371 ASSERT_EQ(n, 2);
universe@583 372 EXPECT_EQ(cx_strcmp(list[0], cx_str("")), 0);
universe@583 373 EXPECT_EQ(cx_strcmp(list[1], cx_str("")), 0);
universe@583 374 cxFree(&alloc, list);
universe@583 375
universe@583 376 /* string to be split is only substring */
universe@583 377 n = cx_strsplit_a(&alloc, test, cx_str("this,is,a,csv,string,with,extension"), capa, &list);
universe@583 378 ASSERT_EQ(n, 1);
universe@583 379 EXPECT_EQ(cx_strcmp(list[0], test), 0);
universe@583 380 cxFree(&alloc, list);
universe@583 381
universe@583 382 /* subsequent encounter of delimiter (the string between is empty) */
universe@583 383 n = cx_strsplit_a(&alloc, test, cx_str("is,"), capa, &list);
universe@583 384 ASSERT_EQ(n, 3);
universe@583 385 EXPECT_EQ(cx_strcmp(list[0], cx_str("th")), 0);
universe@583 386 EXPECT_EQ(cx_strcmp(list[1], cx_str("")), 0);
universe@583 387 EXPECT_EQ(cx_strcmp(list[2], cx_str("a,csv,string")), 0);
universe@583 388 cxFree(&alloc, list);
universe@583 389
universe@583 390 EXPECT_TRUE(alloc.verify());
universe@583 391 }
universe@583 392
universe@583 393 TEST(String, strtrim) {
universe@583 394 cxstring t1 = cx_strtrim(cx_str(" ein test \t "));
universe@583 395 cxstring t2 = cx_strtrim(cx_str("abc"));
universe@583 396 cxstring t3 = cx_strtrim(cx_str(" 123"));
universe@583 397 cxstring t4 = cx_strtrim(cx_str("xyz "));
universe@583 398 cxstring t5 = cx_strtrim(cx_str(" "));
universe@583 399 cxstring empty = cx_strtrim(cx_str(""));
universe@583 400
universe@583 401 EXPECT_EQ(cx_strcmp(t1, cx_str("ein test")), 0);
universe@583 402 EXPECT_EQ(cx_strcmp(t2, cx_str("abc")), 0);
universe@583 403 EXPECT_EQ(cx_strcmp(t3, cx_str("123")), 0);
universe@583 404 EXPECT_EQ(cx_strcmp(t4, cx_str("xyz")), 0);
universe@583 405 EXPECT_EQ(cx_strcmp(t5, cx_str("")), 0);
universe@583 406 EXPECT_EQ(cx_strcmp(empty, cx_str("")), 0);
universe@583 407 }
universe@583 408
universe@583 409 TEST(String, strprefix) {
universe@583 410 cxstring str = CX_STR("test my prefix and my suffix");
universe@583 411 cxstring empty = CX_STR("");
universe@583 412 EXPECT_FALSE(cx_strprefix(empty, cx_str("pref")));
universe@583 413 EXPECT_TRUE(cx_strprefix(str, empty));
universe@583 414 EXPECT_TRUE(cx_strprefix(empty, empty));
universe@583 415 EXPECT_TRUE(cx_strprefix(str, cx_str("test ")));
universe@583 416 EXPECT_FALSE(cx_strprefix(str, cx_str("8-) fsck ")));
universe@583 417 }
universe@583 418
universe@583 419 TEST(String, strsuffix) {
universe@583 420 cxstring str = CX_STR("test my prefix and my suffix");
universe@583 421 cxstring empty = CX_STR("");
universe@583 422 EXPECT_FALSE(cx_strsuffix(empty, cx_str("suf")));
universe@583 423 EXPECT_TRUE(cx_strsuffix(str, empty));
universe@583 424 EXPECT_TRUE(cx_strsuffix(empty, empty));
universe@583 425 EXPECT_TRUE(cx_strsuffix(str, cx_str("fix")));
universe@583 426 EXPECT_FALSE(cx_strsuffix(str, cx_str("fox")));
universe@583 427 }
universe@583 428
universe@583 429 TEST(String, strcaseprefix) {
universe@583 430 cxstring str = CX_STR("test my prefix and my suffix");
universe@583 431 cxstring empty = CX_STR("");
universe@583 432 EXPECT_FALSE(cx_strcaseprefix(empty, cx_str("pREf")));
universe@583 433 EXPECT_TRUE(cx_strcaseprefix(str, empty));
universe@583 434 EXPECT_TRUE(cx_strcaseprefix(empty, empty));
universe@583 435 EXPECT_TRUE(cx_strcaseprefix(str, cx_str("TEST ")));
universe@583 436 EXPECT_FALSE(cx_strcaseprefix(str, cx_str("8-) fsck ")));
universe@583 437 }
universe@583 438
universe@583 439 TEST(String, strcasesuffix) {
universe@583 440 cxstring str = CX_STR("test my prefix and my suffix");
universe@583 441 cxstring empty = CX_STR("");
universe@583 442 EXPECT_FALSE(cx_strcasesuffix(empty, cx_str("sUf")));
universe@583 443 EXPECT_TRUE(cx_strcasesuffix(str, empty));
universe@583 444 EXPECT_TRUE(cx_strcasesuffix(empty, empty));
universe@583 445 EXPECT_TRUE(cx_strcasesuffix(str, cx_str("FIX")));
universe@583 446 EXPECT_FALSE(cx_strcasesuffix(str, cx_str("fox")));
universe@583 447 }
universe@583 448
universe@583 449 TEST(String, strreplace) {
universe@583 450 cxstring str = CX_STR("test ababab string aba");
universe@583 451 cxstring longstr = CX_STR(
universe@583 452 "xyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacd");
universe@583 453 cxstring notrail = CX_STR("test abab");
universe@583 454 cxstring empty = CX_STR("");
universe@583 455 cxstring astr = CX_STR("aaaaaaaaaa");
universe@583 456 cxstring csstr = CX_STR("test AB ab TEST xyz");
universe@583 457
universe@583 458 cxmutstr repl = cx_strreplace(str, cx_str("abab"), cx_str("muchlonger"));
universe@583 459 cxstring expected = CX_STR("test muchlongerab string aba");
universe@583 460
universe@583 461 cxmutstr repln = cx_strreplacen(str, cx_str("ab"), cx_str("c"), 2);
universe@583 462 cxstring expectedn = CX_STR("test ccab string aba");
universe@583 463
universe@583 464 cxmutstr longrepl = cx_strreplace(longstr, cx_str("a"), cx_str("z"));
universe@583 465 cxstring longexpect = CX_STR(
universe@583 466 "xyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzcd");
universe@583 467
universe@583 468 cxmutstr replnotrail = cx_strreplace(notrail, cx_str("ab"), cx_str("z"));
universe@583 469 cxstring notrailexpect = CX_STR("test zz");
universe@583 470
universe@583 471 cxmutstr repleq = cx_strreplace(str, str, cx_str("hello"));
universe@583 472 cxstring eqexpect = CX_STR("hello");
universe@583 473
universe@583 474 cxmutstr replempty1 = cx_strreplace(empty, cx_str("ab"), cx_str("c")); // expect: empty
universe@583 475 cxmutstr replempty2 = cx_strreplace(str, cx_str("abab"), empty);
universe@583 476 cxstring emptyexpect2 = CX_STR("test ab string aba");
universe@583 477
universe@583 478 cxmutstr replpre = cx_strreplace(str, cx_str("test "), cx_str("TEST "));
universe@583 479 cxstring preexpected = CX_STR("TEST ababab string aba");
universe@583 480
universe@583 481 cxmutstr replan1 = cx_strreplacen(astr, cx_str("a"), cx_str("x"), 1);
universe@583 482 cxstring an1expected = CX_STR("xaaaaaaaaa");
universe@583 483
universe@583 484 cxmutstr replan4 = cx_strreplacen(astr, cx_str("a"), cx_str("x"), 4);
universe@583 485 cxstring an4expected = CX_STR("xxxxaaaaaa");
universe@583 486
universe@583 487 cxmutstr replan9 = cx_strreplacen(astr, cx_str("a"), cx_str("x"), 9);
universe@583 488 cxstring an9expected = CX_STR("xxxxxxxxxa");
universe@583 489
universe@583 490 cxmutstr replan10 = cx_strreplacen(astr, cx_str("a"), cx_str("x"), 10);
universe@583 491 cxstring an10expected = CX_STR("xxxxxxxxxx");
universe@583 492
universe@583 493 cxmutstr replcs1 = cx_strreplace(csstr, cx_str("AB"), cx_str("*"));
universe@583 494 cxstring cs1expected = CX_STR("test * ab TEST xyz");
universe@583 495
universe@583 496 cxmutstr replcs2 = cx_strreplace(csstr, cx_str("test"), cx_str("TEST"));
universe@583 497 cxstring cs2expected = CX_STR("TEST AB ab TEST xyz");
universe@583 498
universe@583 499
universe@583 500 EXPECT_NE(repl.ptr, str.ptr);
universe@583 501 EXPECT_EQ(cx_strcmp(cx_strcast(repl), expected), 0);
universe@583 502 EXPECT_NE(repln.ptr, str.ptr);
universe@583 503 EXPECT_EQ(cx_strcmp(cx_strcast(repln), expectedn), 0);
universe@583 504 EXPECT_EQ(cx_strcmp(cx_strcast(longrepl), longexpect), 0);
universe@583 505 EXPECT_EQ(cx_strcmp(cx_strcast(replnotrail), notrailexpect), 0);
universe@583 506 EXPECT_EQ(cx_strcmp(cx_strcast(repleq), eqexpect), 0);
universe@583 507 EXPECT_EQ(cx_strcmp(cx_strcast(replempty1), empty), 0);
universe@583 508 EXPECT_EQ(cx_strcmp(cx_strcast(replempty2), emptyexpect2), 0);
universe@583 509 EXPECT_EQ(cx_strcmp(cx_strcast(replpre), preexpected), 0);
universe@583 510 EXPECT_EQ(cx_strcmp(cx_strcast(replan1), an1expected), 0);
universe@583 511 EXPECT_EQ(cx_strcmp(cx_strcast(replan4), an4expected), 0);
universe@583 512 EXPECT_EQ(cx_strcmp(cx_strcast(replan9), an9expected), 0);
universe@583 513 EXPECT_EQ(cx_strcmp(cx_strcast(replan10), an10expected), 0);
universe@583 514 EXPECT_EQ(cx_strcmp(cx_strcast(replcs1), cs1expected), 0);
universe@583 515 EXPECT_EQ(cx_strcmp(cx_strcast(replcs2), cs2expected), 0);
universe@583 516
universe@583 517 cx_strfree(&repl);
universe@583 518 cx_strfree(&repln);
universe@583 519 cx_strfree(&longrepl);
universe@583 520 cx_strfree(&replnotrail);
universe@583 521 cx_strfree(&repleq);
universe@583 522 cx_strfree(&replempty1);
universe@583 523 cx_strfree(&replempty2);
universe@583 524 cx_strfree(&replpre);
universe@583 525 cx_strfree(&replan1);
universe@583 526 cx_strfree(&replan4);
universe@583 527 cx_strfree(&replan9);
universe@583 528 cx_strfree(&replan10);
universe@583 529 cx_strfree(&replcs1);
universe@583 530 cx_strfree(&replcs2);
universe@583 531 }

mercurial