test/test_string.cpp

Tue, 20 Sep 2022 10:36:04 +0200

author
Mike Becker <universe@uap-core.de>
date
Tue, 20 Sep 2022 10:36:04 +0200
changeset 587
3dd55e246d2d
parent 586
aa51aaa907b9
child 588
6a3cd8f0a2cf
permissions
-rw-r--r--

use EXPECT_STREQ instead of strcmp

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@585 74 TEST(String, strsubs) {
universe@585 75 cxstring str = CX_STR("A test string");
universe@585 76
universe@585 77 cxstring sub = cx_strsubs(str, 0);
universe@585 78 EXPECT_EQ(cx_strcmp(sub, str), 0);
universe@585 79
universe@585 80 sub = cx_strsubs(str, 2);
universe@585 81 EXPECT_EQ(cx_strcmp(sub, cx_str("test string")), 0);
universe@585 82
universe@585 83 sub = cx_strsubs(str, 7);
universe@585 84 EXPECT_EQ(cx_strcmp(sub, cx_str("string")), 0);
universe@585 85
universe@585 86 sub = cx_strsubs(str, 15);
universe@585 87 EXPECT_EQ(cx_strcmp(sub, cx_str("")), 0);
universe@585 88
universe@585 89 sub = cx_strsubsl(str, 2, 4);
universe@585 90 EXPECT_EQ(cx_strcmp(sub, cx_str("test")), 0);
universe@585 91
universe@585 92 sub = cx_strsubsl(str, 7, 3);
universe@585 93 EXPECT_EQ(cx_strcmp(sub, cx_str("str")), 0);
universe@585 94
universe@585 95 sub = cx_strsubsl(str, 7, 20);
universe@585 96 EXPECT_EQ(cx_strcmp(sub, cx_str("string")), 0);
universe@585 97
universe@585 98 // just for coverage, call the _m variant
universe@585 99 auto m = cx_strsubs_m(cx_mutstrn(nullptr, 0), 0);
universe@585 100 EXPECT_EQ(cx_strcmp(cx_strcast(m), cx_str("")), 0);
universe@585 101 }
universe@583 102
universe@583 103 TEST(String, strchr) {
universe@583 104 cxstring str = CX_STR("I will find you - and I will kill you");
universe@583 105
universe@583 106 cxstring notfound = cx_strchr(str, 'x');
universe@583 107 EXPECT_EQ(notfound.length, 0);
universe@583 108
universe@583 109 cxstring result = cx_strchr(str, 'w');
universe@583 110 EXPECT_EQ(result.length, 35);
universe@587 111 EXPECT_STREQ(result.ptr, "will find you - and I will kill you");
universe@585 112
universe@585 113 // just for coverage, call the _m variant
universe@585 114 auto m = cx_strchr_m(cx_mutstrn(nullptr, 0), 'a');
universe@585 115 EXPECT_EQ(cx_strcmp(cx_strcast(m), cx_str("")), 0);
universe@583 116 }
universe@583 117
universe@583 118 TEST(String, strrchr) {
universe@583 119 cxstring str = CX_STR("I will find you - and I will kill you");
universe@583 120
universe@583 121 cxstring notfound = cx_strrchr(str, 'x');
universe@583 122 EXPECT_EQ(notfound.length, 0);
universe@583 123
universe@583 124 cxstring result = cx_strrchr(str, 'w');
universe@583 125 EXPECT_EQ(result.length, 13);
universe@587 126 EXPECT_STREQ(result.ptr, "will kill you");
universe@585 127
universe@585 128 // just for coverage, call the _m variant
universe@585 129 auto m = cx_strrchr_m(cx_mutstrn(nullptr, 0), 'a');
universe@585 130 EXPECT_EQ(cx_strcmp(cx_strcast(m), cx_str("")), 0);
universe@583 131 }
universe@583 132
universe@583 133 TEST(String, strstr) {
universe@583 134 cxstring str = CX_STR("find the match in this string");
universe@583 135 cxstring longstr = CX_STR(
universe@583 136 "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl"
universe@583 137 "mnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwx"
universe@583 138 "yzabcdeababababnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghij"
universe@583 139 "klmnopqrstuvwxyzaababababababababrstuvwxyzabcdefghijklmnopqrstuv"
universe@583 140 "abababababababababababababababababababababababababababababababab"
universe@583 141 "abababababababababababababababababababababababababababababababab"
universe@583 142 "abababababababababababababababababababababababababababababababab"
universe@583 143 "abababababababababababababababababababababababababababababababab"
universe@583 144 "abababababababababababababababababababababababababababababababab"
universe@583 145 "abababababababababababababababababababababababababababababababab"
universe@583 146 "wxyz1234567890");
universe@583 147 cxstring longstrpattern = CX_STR(
universe@583 148 "abababababababababababababababababababababababababababababababab"
universe@583 149 "abababababababababababababababababababababababababababababababab"
universe@583 150 "abababababababababababababababababababababababababababababababab"
universe@583 151 "abababababababababababababababababababababababababababababababab"
universe@583 152 "abababababababababababababababababababababababababababababababab"
universe@583 153 );
universe@583 154 cxstring longstrresult = CX_STR(
universe@583 155 "abababababababababababababababababababababababababababababababab"
universe@583 156 "abababababababababababababababababababababababababababababababab"
universe@583 157 "abababababababababababababababababababababababababababababababab"
universe@583 158 "abababababababababababababababababababababababababababababababab"
universe@583 159 "abababababababababababababababababababababababababababababababab"
universe@583 160 "abababababababababababababababababababababababababababababababab"
universe@583 161 "wxyz1234567890"
universe@583 162 );
universe@583 163
universe@583 164 cxstring notfound = cx_strstr(str, cx_str("no match"));
universe@583 165 EXPECT_EQ(notfound.length, 0);
universe@583 166
universe@583 167 cxstring result = cx_strstr(str, cx_str("match"));
universe@583 168 EXPECT_EQ(result.length, 20);
universe@587 169 EXPECT_STREQ(result.ptr, "match in this string");
universe@583 170
universe@583 171 result = cx_strstr(str, cx_str(""));
universe@583 172 EXPECT_EQ(result.length, str.length);
universe@587 173 EXPECT_STREQ(result.ptr, str.ptr);
universe@583 174
universe@583 175 result = cx_strstr(longstr, longstrpattern);
universe@583 176 EXPECT_EQ(result.length, longstrresult.length);
universe@587 177 EXPECT_STREQ(result.ptr, longstrresult.ptr);
universe@585 178
universe@585 179 // just for coverage, call the _m variant
universe@585 180 auto mstr = cx_strdup(longstr);
universe@585 181 auto m = cx_strstr_m(mstr, longstrpattern);
universe@585 182 EXPECT_EQ(m.length, longstrresult.length);
universe@587 183 EXPECT_STREQ(m.ptr, longstrresult.ptr);
universe@585 184 cx_strfree(&mstr);
universe@583 185 }
universe@583 186
universe@583 187 TEST(String, strcmp) {
universe@583 188 cxstring str = CX_STR("compare this");
universe@583 189
universe@583 190 EXPECT_EQ(cx_strcmp(CX_STR(""), CX_STR("")), 0);
universe@583 191 EXPECT_GT(cx_strcmp(str, CX_STR("")), 0);
universe@583 192 EXPECT_EQ(cx_strcmp(str, CX_STR("compare this")), 0);
universe@583 193 EXPECT_NE(cx_strcmp(str, CX_STR("Compare This")), 0);
universe@583 194 EXPECT_LT(cx_strcmp(str, CX_STR("compare tool")), 0);
universe@583 195 EXPECT_GT(cx_strcmp(str, CX_STR("compare shit")), 0);
universe@583 196 EXPECT_LT(cx_strcmp(str, CX_STR("compare this not")), 0);
universe@583 197 EXPECT_GT(cx_strcmp(str, CX_STR("compare")), 0);
universe@583 198 }
universe@583 199
universe@583 200 TEST(String, strcasecmp) {
universe@583 201 cxstring str = CX_STR("compare this");
universe@583 202
universe@583 203 EXPECT_EQ(cx_strcasecmp(CX_STR(""), CX_STR("")), 0);
universe@583 204 EXPECT_GT(cx_strcasecmp(str, CX_STR("")), 0);
universe@583 205 EXPECT_EQ(cx_strcasecmp(str, CX_STR("compare this")), 0);
universe@583 206 EXPECT_EQ(cx_strcasecmp(str, CX_STR("Compare This")), 0);
universe@583 207 EXPECT_LT(cx_strcasecmp(str, CX_STR("compare tool")), 0);
universe@583 208 EXPECT_GT(cx_strcasecmp(str, CX_STR("compare shit")), 0);
universe@583 209 EXPECT_LT(cx_strcasecmp(str, CX_STR("compare this not")), 0);
universe@583 210 EXPECT_GT(cx_strcasecmp(str, CX_STR("compare")), 0);
universe@583 211 }
universe@583 212
universe@583 213
universe@583 214 TEST(String, strcat) {
universe@583 215 cxstring s1 = CX_STR("12");
universe@583 216 cxstring s2 = CX_STR("34");
universe@583 217 cxstring s3 = CX_STR("56");
universe@583 218 cxstring sn = {nullptr, 0};
universe@583 219
universe@583 220 CxTestingAllocator alloc;
universe@583 221
universe@583 222 cxmutstr t1 = cx_strcat_a(&alloc, 2, s1, s2);
universe@583 223 EXPECT_EQ(cx_strcmp(cx_strcast(t1), CX_STR("1234")), 0);
universe@583 224 cx_strfree_a(&alloc, &t1);
universe@583 225
universe@583 226 cxmutstr t2 = cx_strcat_a(&alloc, 3, s1, s2, s3);
universe@583 227 EXPECT_EQ(cx_strcmp(cx_strcast(t2), CX_STR("123456")), 0);
universe@583 228 cx_strfree_a(&alloc, &t2);
universe@583 229
universe@583 230 cxmutstr t3 = cx_strcat_a(&alloc, 6, s1, sn, s2, sn, s3, sn);
universe@583 231 EXPECT_EQ(cx_strcmp(cx_strcast(t3), CX_STR("123456")), 0);
universe@583 232 cx_strfree_a(&alloc, &t3);
universe@583 233
universe@583 234 cxmutstr t4 = cx_strcat_a(&alloc, 2, sn, sn);
universe@583 235 EXPECT_EQ(cx_strcmp(cx_strcast(t4), CX_STR("")), 0);
universe@583 236 cx_strfree_a(&alloc, &t4);
universe@583 237
universe@583 238 EXPECT_TRUE(alloc.verify());
universe@583 239 }
universe@583 240
universe@583 241 TEST(String, strsplit) {
universe@583 242
universe@583 243 cxstring test = cx_str("this,is,a,csv,string");
universe@583 244 size_t capa = 8;
universe@583 245 cxstring list[8];
universe@583 246 size_t n;
universe@583 247
universe@583 248 /* special case: empty string */
universe@583 249 n = cx_strsplit(test, cx_str(""), capa, list);
universe@583 250 ASSERT_EQ(n, 1);
universe@583 251 EXPECT_EQ(cx_strcmp(list[0], test), 0);
universe@583 252
universe@583 253 /* no delimiter occurrence */
universe@583 254 n = cx_strsplit(test, cx_str("z"), capa, list);
universe@583 255 ASSERT_EQ(n, 1);
universe@583 256 EXPECT_EQ(cx_strcmp(list[0], test), 0);
universe@583 257
universe@583 258 /* partially matching delimiter */
universe@583 259 n = cx_strsplit(test, cx_str("is,not"), capa, list);
universe@583 260 ASSERT_EQ(n, 1);
universe@583 261 EXPECT_EQ(cx_strcmp(list[0], test), 0);
universe@583 262
universe@583 263 /* matching single-char delimiter */
universe@583 264 n = cx_strsplit(test, cx_str(","), capa, list);
universe@583 265 ASSERT_EQ(n, 5);
universe@583 266 EXPECT_EQ(cx_strcmp(list[0], cx_str("this")), 0);
universe@583 267 EXPECT_EQ(cx_strcmp(list[1], cx_str("is")), 0);
universe@583 268 EXPECT_EQ(cx_strcmp(list[2], cx_str("a")), 0);
universe@583 269 EXPECT_EQ(cx_strcmp(list[3], cx_str("csv")), 0);
universe@583 270 EXPECT_EQ(cx_strcmp(list[4], cx_str("string")), 0);
universe@583 271
universe@583 272 /* matching multi-char delimiter */
universe@583 273 n = cx_strsplit(test, cx_str("is"), capa, list);
universe@583 274 ASSERT_EQ(n, 3);
universe@583 275 EXPECT_EQ(cx_strcmp(list[0], cx_str("th")), 0);
universe@583 276 EXPECT_EQ(cx_strcmp(list[1], cx_str(",")), 0);
universe@583 277 EXPECT_EQ(cx_strcmp(list[2], cx_str(",a,csv,string")), 0);
universe@583 278
universe@583 279 /* bounded list using single-char delimiter */
universe@583 280 n = cx_strsplit(test, cx_str(","), 3, list);
universe@583 281 ASSERT_EQ(n, 3);
universe@583 282 EXPECT_EQ(cx_strcmp(list[0], cx_str("this")), 0);
universe@583 283 EXPECT_EQ(cx_strcmp(list[1], cx_str("is")), 0);
universe@583 284 EXPECT_EQ(cx_strcmp(list[2], cx_str("a,csv,string")), 0);
universe@583 285
universe@583 286 /* bounded list using multi-char delimiter */
universe@583 287 n = cx_strsplit(test, cx_str("is"), 2, list);
universe@583 288 ASSERT_EQ(n, 2);
universe@583 289 EXPECT_EQ(cx_strcmp(list[0], cx_str("th")), 0);
universe@583 290 EXPECT_EQ(cx_strcmp(list[1], cx_str(",is,a,csv,string")), 0);
universe@583 291
universe@583 292 /* start with delimiter */
universe@583 293 n = cx_strsplit(test, cx_str("this"), capa, list);
universe@583 294 ASSERT_EQ(n, 2);
universe@583 295 EXPECT_EQ(cx_strcmp(list[0], cx_str("")), 0);
universe@583 296 EXPECT_EQ(cx_strcmp(list[1], cx_str(",is,a,csv,string")), 0);
universe@583 297
universe@583 298 /* end with delimiter */
universe@583 299 n = cx_strsplit(test, cx_str("string"), capa, list);
universe@583 300 ASSERT_EQ(n, 2);
universe@583 301 EXPECT_EQ(cx_strcmp(list[0], cx_str("this,is,a,csv,")), 0);
universe@583 302 EXPECT_EQ(cx_strcmp(list[1], cx_str("")), 0);
universe@583 303
universe@583 304
universe@583 305 /* end with delimiter exceed bound */
universe@583 306 n = cx_strsplit(cx_str("a,b,c,"), cx_str(","), 3, list);
universe@583 307 ASSERT_EQ(n, 3);
universe@583 308 EXPECT_EQ(cx_strcmp(list[0], cx_str("a")), 0);
universe@583 309 EXPECT_EQ(cx_strcmp(list[1], cx_str("b")), 0);
universe@583 310 EXPECT_EQ(cx_strcmp(list[2], cx_str("c,")), 0);
universe@583 311
universe@583 312 /* exact match */
universe@583 313 n = cx_strsplit(test, cx_str("this,is,a,csv,string"), capa, list);
universe@583 314 ASSERT_EQ(n, 2);
universe@583 315 EXPECT_EQ(cx_strcmp(list[0], cx_str("")), 0);
universe@583 316 EXPECT_EQ(cx_strcmp(list[1], cx_str("")), 0);
universe@583 317
universe@583 318 /* string to be split is only substring */
universe@583 319 n = cx_strsplit(test, cx_str("this,is,a,csv,string,with,extension"), capa, list);
universe@583 320 ASSERT_EQ(n, 1);
universe@583 321 EXPECT_EQ(cx_strcmp(list[0], test), 0);
universe@583 322
universe@583 323 /* subsequent encounter of delimiter (the string between is empty) */
universe@583 324 n = cx_strsplit(test, cx_str("is,"), capa, list);
universe@583 325 ASSERT_EQ(n, 3);
universe@583 326 EXPECT_EQ(cx_strcmp(list[0], cx_str("th")), 0);
universe@583 327 EXPECT_EQ(cx_strcmp(list[1], cx_str("")), 0);
universe@583 328 EXPECT_EQ(cx_strcmp(list[2], cx_str("a,csv,string")), 0);
universe@585 329
universe@585 330 /* call the _m variant just for coverage */
universe@585 331 auto mtest = cx_strdup(test);
universe@585 332 cxmutstr mlist[4];
universe@585 333 n = cx_strsplit_m(mtest, cx_str("is,"), 4, mlist);
universe@585 334 ASSERT_EQ(n, 3);
universe@585 335 EXPECT_EQ(cx_strcmp(cx_strcast(mlist[0]), cx_str("th")), 0);
universe@585 336 EXPECT_EQ(cx_strcmp(cx_strcast(mlist[1]), cx_str("")), 0);
universe@585 337 EXPECT_EQ(cx_strcmp(cx_strcast(mlist[2]), cx_str("a,csv,string")), 0);
universe@585 338 cx_strfree(&mtest);
universe@583 339 }
universe@583 340
universe@583 341 TEST(String, strsplit_a) {
universe@583 342 CxTestingAllocator alloc;
universe@583 343
universe@583 344 cxstring test = cx_str("this,is,a,csv,string");
universe@583 345 size_t capa = 8;
universe@583 346 cxstring *list;
universe@583 347 size_t n;
universe@583 348
universe@583 349 /* special case: empty string */
universe@583 350 n = cx_strsplit_a(&alloc, test, cx_str(""), capa, &list);
universe@583 351 ASSERT_EQ(n, 1);
universe@583 352 EXPECT_EQ(cx_strcmp(list[0], test), 0);
universe@583 353 cxFree(&alloc, list);
universe@583 354
universe@583 355 /* no delimiter occurrence */
universe@583 356 n = cx_strsplit_a(&alloc, test, cx_str("z"), capa, &list);
universe@583 357 ASSERT_EQ(n, 1);
universe@583 358 EXPECT_EQ(cx_strcmp(list[0], test), 0);
universe@583 359 cxFree(&alloc, list);
universe@583 360
universe@583 361 /* partially matching delimiter */
universe@583 362 n = cx_strsplit_a(&alloc, test, cx_str("is,not"), capa, &list);
universe@583 363 ASSERT_EQ(n, 1);
universe@583 364 EXPECT_EQ(cx_strcmp(list[0], test), 0);
universe@583 365 cxFree(&alloc, list);
universe@583 366
universe@583 367 /* matching single-char delimiter */
universe@583 368 n = cx_strsplit_a(&alloc, test, cx_str(","), capa, &list);
universe@583 369 ASSERT_EQ(n, 5);
universe@583 370 EXPECT_EQ(cx_strcmp(list[0], cx_str("this")), 0);
universe@583 371 EXPECT_EQ(cx_strcmp(list[1], cx_str("is")), 0);
universe@583 372 EXPECT_EQ(cx_strcmp(list[2], cx_str("a")), 0);
universe@583 373 EXPECT_EQ(cx_strcmp(list[3], cx_str("csv")), 0);
universe@583 374 EXPECT_EQ(cx_strcmp(list[4], cx_str("string")), 0);
universe@583 375 cxFree(&alloc, list);
universe@583 376
universe@583 377 /* matching multi-char delimiter */
universe@583 378 n = cx_strsplit_a(&alloc, test, cx_str("is"), capa, &list);
universe@583 379 ASSERT_EQ(n, 3);
universe@583 380 EXPECT_EQ(cx_strcmp(list[0], cx_str("th")), 0);
universe@583 381 EXPECT_EQ(cx_strcmp(list[1], cx_str(",")), 0);
universe@583 382 EXPECT_EQ(cx_strcmp(list[2], cx_str(",a,csv,string")), 0);
universe@583 383 cxFree(&alloc, list);
universe@583 384
universe@583 385 /* bounded list using single-char delimiter */
universe@583 386 n = cx_strsplit_a(&alloc, test, cx_str(","), 3, &list);
universe@583 387 ASSERT_EQ(n, 3);
universe@583 388 EXPECT_EQ(cx_strcmp(list[0], cx_str("this")), 0);
universe@583 389 EXPECT_EQ(cx_strcmp(list[1], cx_str("is")), 0);
universe@583 390 EXPECT_EQ(cx_strcmp(list[2], cx_str("a,csv,string")), 0);
universe@583 391 cxFree(&alloc, list);
universe@583 392
universe@583 393 /* bounded list using multi-char delimiter */
universe@583 394 n = cx_strsplit_a(&alloc, test, cx_str("is"), 2, &list);
universe@583 395 ASSERT_EQ(n, 2);
universe@583 396 EXPECT_EQ(cx_strcmp(list[0], cx_str("th")), 0);
universe@583 397 EXPECT_EQ(cx_strcmp(list[1], cx_str(",is,a,csv,string")), 0);
universe@583 398 cxFree(&alloc, list);
universe@583 399
universe@583 400 /* start with delimiter */
universe@583 401 n = cx_strsplit_a(&alloc, test, cx_str("this"), capa, &list);
universe@583 402 ASSERT_EQ(n, 2);
universe@583 403 EXPECT_EQ(cx_strcmp(list[0], cx_str("")), 0);
universe@583 404 EXPECT_EQ(cx_strcmp(list[1], cx_str(",is,a,csv,string")), 0);
universe@583 405 cxFree(&alloc, list);
universe@583 406
universe@583 407 /* end with delimiter */
universe@583 408 n = cx_strsplit_a(&alloc, test, cx_str("string"), capa, &list);
universe@583 409 ASSERT_EQ(n, 2);
universe@583 410 EXPECT_EQ(cx_strcmp(list[0], cx_str("this,is,a,csv,")), 0);
universe@583 411 EXPECT_EQ(cx_strcmp(list[1], cx_str("")), 0);
universe@583 412 cxFree(&alloc, list);
universe@583 413
universe@583 414 /* end with delimiter exceed bound */
universe@583 415 n = cx_strsplit_a(&alloc, cx_str("a,b,c,"), cx_str(","), 3, &list);
universe@583 416 ASSERT_EQ(n, 3);
universe@583 417 EXPECT_EQ(cx_strcmp(list[0], cx_str("a")), 0);
universe@583 418 EXPECT_EQ(cx_strcmp(list[1], cx_str("b")), 0);
universe@583 419 EXPECT_EQ(cx_strcmp(list[2], cx_str("c,")), 0);
universe@583 420 cxFree(&alloc, list);
universe@583 421
universe@583 422 /* exact match */
universe@583 423 n = cx_strsplit_a(&alloc, test, cx_str("this,is,a,csv,string"), capa, &list);
universe@583 424 ASSERT_EQ(n, 2);
universe@583 425 EXPECT_EQ(cx_strcmp(list[0], cx_str("")), 0);
universe@583 426 EXPECT_EQ(cx_strcmp(list[1], cx_str("")), 0);
universe@583 427 cxFree(&alloc, list);
universe@583 428
universe@583 429 /* string to be split is only substring */
universe@583 430 n = cx_strsplit_a(&alloc, test, cx_str("this,is,a,csv,string,with,extension"), capa, &list);
universe@583 431 ASSERT_EQ(n, 1);
universe@583 432 EXPECT_EQ(cx_strcmp(list[0], test), 0);
universe@583 433 cxFree(&alloc, list);
universe@583 434
universe@583 435 /* subsequent encounter of delimiter (the string between is empty) */
universe@583 436 n = cx_strsplit_a(&alloc, test, cx_str("is,"), capa, &list);
universe@583 437 ASSERT_EQ(n, 3);
universe@583 438 EXPECT_EQ(cx_strcmp(list[0], cx_str("th")), 0);
universe@583 439 EXPECT_EQ(cx_strcmp(list[1], cx_str("")), 0);
universe@583 440 EXPECT_EQ(cx_strcmp(list[2], cx_str("a,csv,string")), 0);
universe@583 441 cxFree(&alloc, list);
universe@583 442
universe@585 443 /* call the _m variant just for coverage */
universe@585 444 auto mtest = cx_strdup(test);
universe@585 445 cxmutstr *mlist;
universe@585 446 n = cx_strsplit_ma(&alloc, mtest, cx_str("is,"), 4, &mlist);
universe@585 447 ASSERT_EQ(n, 3);
universe@585 448 EXPECT_EQ(cx_strcmp(cx_strcast(mlist[0]), cx_str("th")), 0);
universe@585 449 EXPECT_EQ(cx_strcmp(cx_strcast(mlist[1]), cx_str("")), 0);
universe@585 450 EXPECT_EQ(cx_strcmp(cx_strcast(mlist[2]), cx_str("a,csv,string")), 0);
universe@585 451 cxFree(&alloc, mlist);
universe@585 452 cx_strfree(&mtest);
universe@585 453
universe@583 454 EXPECT_TRUE(alloc.verify());
universe@583 455 }
universe@583 456
universe@583 457 TEST(String, strtrim) {
universe@583 458 cxstring t1 = cx_strtrim(cx_str(" ein test \t "));
universe@583 459 cxstring t2 = cx_strtrim(cx_str("abc"));
universe@583 460 cxstring t3 = cx_strtrim(cx_str(" 123"));
universe@583 461 cxstring t4 = cx_strtrim(cx_str("xyz "));
universe@583 462 cxstring t5 = cx_strtrim(cx_str(" "));
universe@583 463 cxstring empty = cx_strtrim(cx_str(""));
universe@583 464
universe@583 465 EXPECT_EQ(cx_strcmp(t1, cx_str("ein test")), 0);
universe@583 466 EXPECT_EQ(cx_strcmp(t2, cx_str("abc")), 0);
universe@583 467 EXPECT_EQ(cx_strcmp(t3, cx_str("123")), 0);
universe@583 468 EXPECT_EQ(cx_strcmp(t4, cx_str("xyz")), 0);
universe@583 469 EXPECT_EQ(cx_strcmp(t5, cx_str("")), 0);
universe@583 470 EXPECT_EQ(cx_strcmp(empty, cx_str("")), 0);
universe@585 471
universe@585 472 /* call the _m variant just for coverage */
universe@585 473 cxmutstr m1 = cx_strtrim_m(cx_mutstr((char *) " ein test \t "));
universe@585 474 EXPECT_EQ(cx_strcmp(cx_strcast(m1), cx_str("ein test")), 0);
universe@583 475 }
universe@583 476
universe@583 477 TEST(String, strprefix) {
universe@583 478 cxstring str = CX_STR("test my prefix and my suffix");
universe@583 479 cxstring empty = CX_STR("");
universe@583 480 EXPECT_FALSE(cx_strprefix(empty, cx_str("pref")));
universe@583 481 EXPECT_TRUE(cx_strprefix(str, empty));
universe@583 482 EXPECT_TRUE(cx_strprefix(empty, empty));
universe@583 483 EXPECT_TRUE(cx_strprefix(str, cx_str("test ")));
universe@583 484 EXPECT_FALSE(cx_strprefix(str, cx_str("8-) fsck ")));
universe@583 485 }
universe@583 486
universe@583 487 TEST(String, strsuffix) {
universe@583 488 cxstring str = CX_STR("test my prefix and my suffix");
universe@583 489 cxstring empty = CX_STR("");
universe@583 490 EXPECT_FALSE(cx_strsuffix(empty, cx_str("suf")));
universe@583 491 EXPECT_TRUE(cx_strsuffix(str, empty));
universe@583 492 EXPECT_TRUE(cx_strsuffix(empty, empty));
universe@583 493 EXPECT_TRUE(cx_strsuffix(str, cx_str("fix")));
universe@583 494 EXPECT_FALSE(cx_strsuffix(str, cx_str("fox")));
universe@583 495 }
universe@583 496
universe@583 497 TEST(String, strcaseprefix) {
universe@583 498 cxstring str = CX_STR("test my prefix and my suffix");
universe@583 499 cxstring empty = CX_STR("");
universe@583 500 EXPECT_FALSE(cx_strcaseprefix(empty, cx_str("pREf")));
universe@583 501 EXPECT_TRUE(cx_strcaseprefix(str, empty));
universe@583 502 EXPECT_TRUE(cx_strcaseprefix(empty, empty));
universe@583 503 EXPECT_TRUE(cx_strcaseprefix(str, cx_str("TEST ")));
universe@583 504 EXPECT_FALSE(cx_strcaseprefix(str, cx_str("8-) fsck ")));
universe@583 505 }
universe@583 506
universe@583 507 TEST(String, strcasesuffix) {
universe@583 508 cxstring str = CX_STR("test my prefix and my suffix");
universe@583 509 cxstring empty = CX_STR("");
universe@583 510 EXPECT_FALSE(cx_strcasesuffix(empty, cx_str("sUf")));
universe@583 511 EXPECT_TRUE(cx_strcasesuffix(str, empty));
universe@583 512 EXPECT_TRUE(cx_strcasesuffix(empty, empty));
universe@583 513 EXPECT_TRUE(cx_strcasesuffix(str, cx_str("FIX")));
universe@583 514 EXPECT_FALSE(cx_strcasesuffix(str, cx_str("fox")));
universe@583 515 }
universe@583 516
universe@583 517 TEST(String, strreplace) {
universe@583 518 cxstring str = CX_STR("test ababab string aba");
universe@583 519 cxstring longstr = CX_STR(
universe@583 520 "xyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacd");
universe@583 521 cxstring notrail = CX_STR("test abab");
universe@583 522 cxstring empty = CX_STR("");
universe@583 523 cxstring astr = CX_STR("aaaaaaaaaa");
universe@583 524 cxstring csstr = CX_STR("test AB ab TEST xyz");
universe@583 525
universe@583 526 cxmutstr repl = cx_strreplace(str, cx_str("abab"), cx_str("muchlonger"));
universe@583 527 cxstring expected = CX_STR("test muchlongerab string aba");
universe@583 528
universe@583 529 cxmutstr repln = cx_strreplacen(str, cx_str("ab"), cx_str("c"), 2);
universe@583 530 cxstring expectedn = CX_STR("test ccab string aba");
universe@583 531
universe@583 532 cxmutstr longrepl = cx_strreplace(longstr, cx_str("a"), cx_str("z"));
universe@583 533 cxstring longexpect = CX_STR(
universe@583 534 "xyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzcd");
universe@583 535
universe@583 536 cxmutstr replnotrail = cx_strreplace(notrail, cx_str("ab"), cx_str("z"));
universe@583 537 cxstring notrailexpect = CX_STR("test zz");
universe@583 538
universe@583 539 cxmutstr repleq = cx_strreplace(str, str, cx_str("hello"));
universe@583 540 cxstring eqexpect = CX_STR("hello");
universe@583 541
universe@583 542 cxmutstr replempty1 = cx_strreplace(empty, cx_str("ab"), cx_str("c")); // expect: empty
universe@583 543 cxmutstr replempty2 = cx_strreplace(str, cx_str("abab"), empty);
universe@583 544 cxstring emptyexpect2 = CX_STR("test ab string aba");
universe@583 545
universe@583 546 cxmutstr replpre = cx_strreplace(str, cx_str("test "), cx_str("TEST "));
universe@583 547 cxstring preexpected = CX_STR("TEST ababab string aba");
universe@583 548
universe@583 549 cxmutstr replan1 = cx_strreplacen(astr, cx_str("a"), cx_str("x"), 1);
universe@583 550 cxstring an1expected = CX_STR("xaaaaaaaaa");
universe@583 551
universe@583 552 cxmutstr replan4 = cx_strreplacen(astr, cx_str("a"), cx_str("x"), 4);
universe@583 553 cxstring an4expected = CX_STR("xxxxaaaaaa");
universe@583 554
universe@583 555 cxmutstr replan9 = cx_strreplacen(astr, cx_str("a"), cx_str("x"), 9);
universe@583 556 cxstring an9expected = CX_STR("xxxxxxxxxa");
universe@583 557
universe@583 558 cxmutstr replan10 = cx_strreplacen(astr, cx_str("a"), cx_str("x"), 10);
universe@583 559 cxstring an10expected = CX_STR("xxxxxxxxxx");
universe@583 560
universe@583 561 cxmutstr replcs1 = cx_strreplace(csstr, cx_str("AB"), cx_str("*"));
universe@583 562 cxstring cs1expected = CX_STR("test * ab TEST xyz");
universe@583 563
universe@583 564 cxmutstr replcs2 = cx_strreplace(csstr, cx_str("test"), cx_str("TEST"));
universe@583 565 cxstring cs2expected = CX_STR("TEST AB ab TEST xyz");
universe@583 566
universe@583 567
universe@583 568 EXPECT_NE(repl.ptr, str.ptr);
universe@583 569 EXPECT_EQ(cx_strcmp(cx_strcast(repl), expected), 0);
universe@583 570 EXPECT_NE(repln.ptr, str.ptr);
universe@583 571 EXPECT_EQ(cx_strcmp(cx_strcast(repln), expectedn), 0);
universe@583 572 EXPECT_EQ(cx_strcmp(cx_strcast(longrepl), longexpect), 0);
universe@583 573 EXPECT_EQ(cx_strcmp(cx_strcast(replnotrail), notrailexpect), 0);
universe@583 574 EXPECT_EQ(cx_strcmp(cx_strcast(repleq), eqexpect), 0);
universe@583 575 EXPECT_EQ(cx_strcmp(cx_strcast(replempty1), empty), 0);
universe@583 576 EXPECT_EQ(cx_strcmp(cx_strcast(replempty2), emptyexpect2), 0);
universe@583 577 EXPECT_EQ(cx_strcmp(cx_strcast(replpre), preexpected), 0);
universe@583 578 EXPECT_EQ(cx_strcmp(cx_strcast(replan1), an1expected), 0);
universe@583 579 EXPECT_EQ(cx_strcmp(cx_strcast(replan4), an4expected), 0);
universe@583 580 EXPECT_EQ(cx_strcmp(cx_strcast(replan9), an9expected), 0);
universe@583 581 EXPECT_EQ(cx_strcmp(cx_strcast(replan10), an10expected), 0);
universe@583 582 EXPECT_EQ(cx_strcmp(cx_strcast(replcs1), cs1expected), 0);
universe@583 583 EXPECT_EQ(cx_strcmp(cx_strcast(replcs2), cs2expected), 0);
universe@583 584
universe@583 585 cx_strfree(&repl);
universe@583 586 cx_strfree(&repln);
universe@583 587 cx_strfree(&longrepl);
universe@583 588 cx_strfree(&replnotrail);
universe@583 589 cx_strfree(&repleq);
universe@583 590 cx_strfree(&replempty1);
universe@583 591 cx_strfree(&replempty2);
universe@583 592 cx_strfree(&replpre);
universe@583 593 cx_strfree(&replan1);
universe@583 594 cx_strfree(&replan4);
universe@583 595 cx_strfree(&replan9);
universe@583 596 cx_strfree(&replan10);
universe@583 597 cx_strfree(&replcs1);
universe@583 598 cx_strfree(&replcs2);
universe@583 599 }
universe@586 600
universe@586 601 TEST(String, strupper) {
universe@586 602 cxmutstr str = cx_strdup(cx_str("thIs 1s @ Te$t"));
universe@586 603 cx_strupper(str);
universe@586 604 EXPECT_STREQ(str.ptr, "THIS 1S @ TE$T");
universe@586 605 cx_strfree(&str);
universe@586 606 }
universe@586 607
universe@586 608 TEST(String, strlower) {
universe@586 609 cxmutstr str = cx_strdup(cx_str("thIs 1s @ Te$t"));
universe@586 610 cx_strlower(str);
universe@586 611 EXPECT_STREQ(str.ptr, "this 1s @ te$t");
universe@586 612 cx_strfree(&str);
universe@586 613 }

mercurial