1.1 --- a/tests/test_string.cpp Thu Dec 28 19:17:45 2023 +0100 1.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 1.3 @@ -1,882 +0,0 @@ 1.4 -/* 1.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 1.6 - * 1.7 - * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved. 1.8 - * 1.9 - * Redistribution and use in source and binary forms, with or without 1.10 - * modification, are permitted provided that the following conditions are met: 1.11 - * 1.12 - * 1. Redistributions of source code must retain the above copyright 1.13 - * notice, this list of conditions and the following disclaimer. 1.14 - * 1.15 - * 2. Redistributions in binary form must reproduce the above copyright 1.16 - * notice, this list of conditions and the following disclaimer in the 1.17 - * documentation and/or other materials provided with the distribution. 1.18 - * 1.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 1.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 1.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 1.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 1.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 1.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 1.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 1.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 1.29 - * POSSIBILITY OF SUCH DAMAGE. 1.30 - */ 1.31 - 1.32 -#include "cx/string.h" 1.33 -#include "util_allocator.h" 1.34 - 1.35 -#include <gtest/gtest.h> 1.36 - 1.37 -#define EXPECT_ZERO_TERMINATED(str) EXPECT_EQ((str).ptr[(str).length], '\0') 1.38 - 1.39 -TEST(String, construct) { 1.40 - cxstring s1 = CX_STR("1234"); 1.41 - cxstring s2 = cx_strn("abcd", 2); 1.42 - cxmutstr s3 = cx_mutstr((char *) "1234"); 1.43 - cxmutstr s4 = cx_mutstrn((char *) "abcd", 2); 1.44 - 1.45 - EXPECT_EQ(s1.length, 4); 1.46 - EXPECT_EQ(s2.length, 2); 1.47 - EXPECT_EQ(s3.length, 4); 1.48 - EXPECT_EQ(s4.length, 2); 1.49 -} 1.50 - 1.51 -TEST(String, strfree) { 1.52 - CxTestingAllocator alloc; 1.53 - auto test = (char *) cxMalloc(&alloc, 16); 1.54 - cxmutstr str = cx_mutstrn(test, 16); 1.55 - ASSERT_EQ(str.ptr, test); 1.56 - EXPECT_EQ(str.length, 16); 1.57 - cx_strfree_a(&alloc, &str); 1.58 - EXPECT_EQ(str.ptr, nullptr); 1.59 - EXPECT_EQ(str.length, 0); 1.60 - EXPECT_TRUE(alloc.verify()); 1.61 -} 1.62 - 1.63 -TEST(String, strdup) { 1.64 - cxstring str = CX_STR("test"); 1.65 - cxmutstr dup = cx_strdup(str); 1.66 - ASSERT_EQ(dup.length, str.length); 1.67 - EXPECT_STREQ(dup.ptr, str.ptr); 1.68 - EXPECT_ZERO_TERMINATED(dup); 1.69 - cx_strfree(&dup); 1.70 - 1.71 - str.length = 2; 1.72 - dup = cx_strdup(str); 1.73 - ASSERT_EQ(dup.length, str.length); 1.74 - EXPECT_STREQ(dup.ptr, "te"); 1.75 - EXPECT_ZERO_TERMINATED(dup); 1.76 - cx_strfree(&dup); 1.77 -} 1.78 - 1.79 -TEST(String, strlen) { 1.80 - cxstring s1 = CX_STR("1234"); 1.81 - cxstring s2 = CX_STR(".:.:."); 1.82 - cxstring s3 = CX_STR("X"); 1.83 - 1.84 - size_t len0 = cx_strlen(0); 1.85 - size_t len1 = cx_strlen(1, s1); 1.86 - size_t len2 = cx_strlen(2, s1, s2); 1.87 - size_t len3 = cx_strlen(3, s1, s2, s3); 1.88 - 1.89 - EXPECT_EQ(len0, 0); 1.90 - EXPECT_EQ(len1, 4); 1.91 - EXPECT_EQ(len2, 9); 1.92 - EXPECT_EQ(len3, 10); 1.93 -} 1.94 - 1.95 -TEST(String, strsubs) { 1.96 - cxstring str = CX_STR("A test string"); 1.97 - 1.98 - cxstring sub = cx_strsubs(str, 0); 1.99 - EXPECT_EQ(cx_strcmp(sub, str), 0); 1.100 - 1.101 - sub = cx_strsubs(str, 2); 1.102 - EXPECT_EQ(cx_strcmp(sub, CX_STR("test string")), 0); 1.103 - 1.104 - sub = cx_strsubs(str, 7); 1.105 - EXPECT_EQ(cx_strcmp(sub, CX_STR("string")), 0); 1.106 - 1.107 - sub = cx_strsubs(str, 15); 1.108 - EXPECT_EQ(cx_strcmp(sub, CX_STR("")), 0); 1.109 - 1.110 - sub = cx_strsubsl(str, 2, 4); 1.111 - EXPECT_EQ(cx_strcmp(sub, CX_STR("test")), 0); 1.112 - 1.113 - sub = cx_strsubsl(str, 7, 3); 1.114 - EXPECT_EQ(cx_strcmp(sub, CX_STR("str")), 0); 1.115 - 1.116 - sub = cx_strsubsl(str, 7, 20); 1.117 - EXPECT_EQ(cx_strcmp(sub, CX_STR("string")), 0); 1.118 - 1.119 - // just for coverage, call the _m variant 1.120 - auto m = cx_strsubs_m(cx_mutstrn(nullptr, 0), 0); 1.121 - EXPECT_EQ(cx_strcmp(cx_strcast(m), CX_STR("")), 0); 1.122 -} 1.123 - 1.124 -TEST(String, strchr) { 1.125 - cxstring str = CX_STR("I will find you - and I will kill you"); 1.126 - 1.127 - cxstring notfound = cx_strchr(str, 'x'); 1.128 - EXPECT_EQ(notfound.length, 0); 1.129 - 1.130 - cxstring result = cx_strchr(str, 'w'); 1.131 - EXPECT_EQ(result.length, 35); 1.132 - EXPECT_STREQ(result.ptr, "will find you - and I will kill you"); 1.133 - 1.134 - // just for coverage, call the _m variant 1.135 - auto m = cx_strchr_m(cx_mutstrn(nullptr, 0), 'a'); 1.136 - EXPECT_EQ(cx_strcmp(cx_strcast(m), CX_STR("")), 0); 1.137 -} 1.138 - 1.139 -TEST(String, strrchr) { 1.140 - cxstring str = CX_STR("I will find you - and I will kill you"); 1.141 - 1.142 - cxstring notfound = cx_strrchr(str, 'x'); 1.143 - EXPECT_EQ(notfound.length, 0); 1.144 - 1.145 - cxstring result = cx_strrchr(str, 'w'); 1.146 - EXPECT_EQ(result.length, 13); 1.147 - EXPECT_STREQ(result.ptr, "will kill you"); 1.148 - 1.149 - // just for coverage, call the _m variant 1.150 - auto m = cx_strrchr_m(cx_mutstrn(nullptr, 0), 'a'); 1.151 - EXPECT_EQ(cx_strcmp(cx_strcast(m), CX_STR("")), 0); 1.152 -} 1.153 - 1.154 -TEST(String, strstr) { 1.155 - cxstring str = CX_STR("find the match in this string"); 1.156 - cxstring longstr = CX_STR( 1.157 - "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl" 1.158 - "mnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwx" 1.159 - "yzabcdeababababnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghij" 1.160 - "klmnopqrstuvwxyzaababababababababrstuvwxyzabcdefghijklmnopqrstuv" 1.161 - "abababababababababababababababababababababababababababababababab" 1.162 - "abababababababababababababababababababababababababababababababab" 1.163 - "abababababababababababababababababababababababababababababababab" 1.164 - "abababababababababababababababababababababababababababababababab" 1.165 - "abababababababababababababababababababababababababababababababab" 1.166 - "abababababababababababababababababababababababababababababababab" 1.167 - "wxyz1234567890"); 1.168 - cxstring longstrpattern = CX_STR( 1.169 - "abababababababababababababababababababababababababababababababab" 1.170 - "abababababababababababababababababababababababababababababababab" 1.171 - "abababababababababababababababababababababababababababababababab" 1.172 - "abababababababababababababababababababababababababababababababab" 1.173 - "abababababababababababababababababababababababababababababababab" 1.174 - ); 1.175 - cxstring longstrresult = CX_STR( 1.176 - "abababababababababababababababababababababababababababababababab" 1.177 - "abababababababababababababababababababababababababababababababab" 1.178 - "abababababababababababababababababababababababababababababababab" 1.179 - "abababababababababababababababababababababababababababababababab" 1.180 - "abababababababababababababababababababababababababababababababab" 1.181 - "abababababababababababababababababababababababababababababababab" 1.182 - "wxyz1234567890" 1.183 - ); 1.184 - 1.185 - cxstring notfound = cx_strstr(str, CX_STR("no match")); 1.186 - EXPECT_EQ(notfound.length, 0); 1.187 - 1.188 - cxstring result = cx_strstr(str, CX_STR("match")); 1.189 - EXPECT_EQ(result.length, 20); 1.190 - EXPECT_STREQ(result.ptr, "match in this string"); 1.191 - 1.192 - result = cx_strstr(str, CX_STR("")); 1.193 - EXPECT_EQ(result.length, str.length); 1.194 - EXPECT_STREQ(result.ptr, str.ptr); 1.195 - 1.196 - result = cx_strstr(longstr, longstrpattern); 1.197 - EXPECT_EQ(result.length, longstrresult.length); 1.198 - EXPECT_STREQ(result.ptr, longstrresult.ptr); 1.199 - 1.200 - // just for coverage, call the _m variant 1.201 - auto mstr = cx_strdup(longstr); 1.202 - auto m = cx_strstr_m(mstr, longstrpattern); 1.203 - EXPECT_EQ(m.length, longstrresult.length); 1.204 - EXPECT_STREQ(m.ptr, longstrresult.ptr); 1.205 - cx_strfree(&mstr); 1.206 -} 1.207 - 1.208 -TEST(String, strcmp) { 1.209 - cxstring str = CX_STR("compare this"); 1.210 - 1.211 - EXPECT_EQ(cx_strcmp(CX_STR(""), CX_STR("")), 0); 1.212 - EXPECT_GT(cx_strcmp(str, CX_STR("")), 0); 1.213 - EXPECT_EQ(cx_strcmp(str, CX_STR("compare this")), 0); 1.214 - EXPECT_NE(cx_strcmp(str, CX_STR("Compare This")), 0); 1.215 - EXPECT_LT(cx_strcmp(str, CX_STR("compare tool")), 0); 1.216 - EXPECT_GT(cx_strcmp(str, CX_STR("compare shit")), 0); 1.217 - EXPECT_LT(cx_strcmp(str, CX_STR("compare this not")), 0); 1.218 - EXPECT_GT(cx_strcmp(str, CX_STR("compare")), 0); 1.219 - 1.220 - cxstring str2 = CX_STR("Compare This"); 1.221 - EXPECT_NE(cx_strcmp_p(&str, &str2), 0); 1.222 - str2 = CX_STR("compare this"); 1.223 - EXPECT_EQ(cx_strcmp_p(&str, &str2), 0); 1.224 -} 1.225 - 1.226 -TEST(String, strcasecmp) { 1.227 - cxstring str = CX_STR("compare this"); 1.228 - 1.229 - EXPECT_EQ(cx_strcasecmp(CX_STR(""), CX_STR("")), 0); 1.230 - EXPECT_GT(cx_strcasecmp(str, CX_STR("")), 0); 1.231 - EXPECT_EQ(cx_strcasecmp(str, CX_STR("compare this")), 0); 1.232 - EXPECT_EQ(cx_strcasecmp(str, CX_STR("Compare This")), 0); 1.233 - EXPECT_LT(cx_strcasecmp(str, CX_STR("compare tool")), 0); 1.234 - EXPECT_GT(cx_strcasecmp(str, CX_STR("compare shit")), 0); 1.235 - EXPECT_LT(cx_strcasecmp(str, CX_STR("compare this not")), 0); 1.236 - EXPECT_GT(cx_strcasecmp(str, CX_STR("compare")), 0); 1.237 - 1.238 - cxstring str2 = CX_STR("Compare This"); 1.239 - EXPECT_EQ(cx_strcasecmp_p(&str, &str2), 0); 1.240 - str2 = CX_STR("Compare Tool"); 1.241 - EXPECT_LT(cx_strcasecmp_p(&str, &str2), 0); 1.242 -} 1.243 - 1.244 -TEST(String, strcat) { 1.245 - cxstring s1 = CX_STR("12"); 1.246 - cxstring s2 = CX_STR("34"); 1.247 - cxstring s3 = CX_STR("56"); 1.248 - cxstring sn = {nullptr, 0}; 1.249 - 1.250 - CxTestingAllocator alloc; 1.251 - 1.252 - cxmutstr t1 = cx_strcat_a(&alloc, 2, s1, s2); 1.253 - EXPECT_EQ(cx_strcmp(cx_strcast(t1), CX_STR("1234")), 0); 1.254 - EXPECT_ZERO_TERMINATED(t1); 1.255 - cx_strfree_a(&alloc, &t1); 1.256 - 1.257 - cxmutstr t2 = cx_strcat_a(&alloc, 3, s1, s2, s3); 1.258 - EXPECT_EQ(cx_strcmp(cx_strcast(t2), CX_STR("123456")), 0); 1.259 - EXPECT_ZERO_TERMINATED(t2); 1.260 - cx_strfree_a(&alloc, &t2); 1.261 - 1.262 - cxmutstr t3 = cx_strcat_a(&alloc, 6, s1, sn, s2, sn, s3, sn); 1.263 - EXPECT_EQ(cx_strcmp(cx_strcast(t3), CX_STR("123456")), 0); 1.264 - EXPECT_ZERO_TERMINATED(t3); 1.265 - cx_strfree_a(&alloc, &t3); 1.266 - 1.267 - cxmutstr t4 = cx_strcat_a(&alloc, 2, sn, sn); 1.268 - EXPECT_EQ(cx_strcmp(cx_strcast(t4), CX_STR("")), 0); 1.269 - EXPECT_ZERO_TERMINATED(t4); 1.270 - cx_strfree_a(&alloc, &t4); 1.271 - 1.272 - EXPECT_TRUE(alloc.verify()); 1.273 - 1.274 - // use the macro 1.275 - cxmutstr t5 = cx_strcat(3, s3, s1, s2); 1.276 - EXPECT_EQ(cx_strcmp(cx_strcast(t5), CX_STR("561234")), 0); 1.277 - EXPECT_ZERO_TERMINATED(t5); 1.278 - cx_strfree(&t5); 1.279 - 1.280 - // use an initial string 1.281 - cxmutstr t6 = cx_strdup(CX_STR("Hello")); 1.282 - t6 = cx_strcat_m(t6, 2, CX_STR(", "), CX_STR("World!")); 1.283 - EXPECT_EQ(cx_strcmp(cx_strcast(t6), CX_STR("Hello, World!")), 0); 1.284 - EXPECT_ZERO_TERMINATED(t6); 1.285 - cx_strfree(&t6); 1.286 -} 1.287 - 1.288 -TEST(String, strsplit) { 1.289 - 1.290 - cxstring test = CX_STR("this,is,a,csv,string"); 1.291 - size_t capa = 8; 1.292 - cxstring list[8]; 1.293 - size_t n; 1.294 - 1.295 - // special case: empty string 1.296 - n = cx_strsplit(test, CX_STR(""), capa, list); 1.297 - ASSERT_EQ(n, 1); 1.298 - EXPECT_EQ(cx_strcmp(list[0], test), 0); 1.299 - 1.300 - // no delimiter occurrence 1.301 - n = cx_strsplit(test, CX_STR("z"), capa, list); 1.302 - ASSERT_EQ(n, 1); 1.303 - EXPECT_EQ(cx_strcmp(list[0], test), 0); 1.304 - 1.305 - // partially matching delimiter 1.306 - n = cx_strsplit(test, CX_STR("is,not"), capa, list); 1.307 - ASSERT_EQ(n, 1); 1.308 - EXPECT_EQ(cx_strcmp(list[0], test), 0); 1.309 - 1.310 - // matching single-char delimiter 1.311 - n = cx_strsplit(test, CX_STR(","), capa, list); 1.312 - ASSERT_EQ(n, 5); 1.313 - EXPECT_EQ(cx_strcmp(list[0], CX_STR("this")), 0); 1.314 - EXPECT_EQ(cx_strcmp(list[1], CX_STR("is")), 0); 1.315 - EXPECT_EQ(cx_strcmp(list[2], CX_STR("a")), 0); 1.316 - EXPECT_EQ(cx_strcmp(list[3], CX_STR("csv")), 0); 1.317 - EXPECT_EQ(cx_strcmp(list[4], CX_STR("string")), 0); 1.318 - 1.319 - // matching multi-char delimiter 1.320 - n = cx_strsplit(test, CX_STR("is"), capa, list); 1.321 - ASSERT_EQ(n, 3); 1.322 - EXPECT_EQ(cx_strcmp(list[0], CX_STR("th")), 0); 1.323 - EXPECT_EQ(cx_strcmp(list[1], CX_STR(",")), 0); 1.324 - EXPECT_EQ(cx_strcmp(list[2], CX_STR(",a,csv,string")), 0); 1.325 - 1.326 - // bounded list using single-char delimiter 1.327 - n = cx_strsplit(test, CX_STR(","), 3, list); 1.328 - ASSERT_EQ(n, 3); 1.329 - EXPECT_EQ(cx_strcmp(list[0], CX_STR("this")), 0); 1.330 - EXPECT_EQ(cx_strcmp(list[1], CX_STR("is")), 0); 1.331 - EXPECT_EQ(cx_strcmp(list[2], CX_STR("a,csv,string")), 0); 1.332 - 1.333 - // bounded list using multi-char delimiter 1.334 - n = cx_strsplit(test, CX_STR("is"), 2, list); 1.335 - ASSERT_EQ(n, 2); 1.336 - EXPECT_EQ(cx_strcmp(list[0], CX_STR("th")), 0); 1.337 - EXPECT_EQ(cx_strcmp(list[1], CX_STR(",is,a,csv,string")), 0); 1.338 - 1.339 - // start with delimiter 1.340 - n = cx_strsplit(test, CX_STR("this"), capa, list); 1.341 - ASSERT_EQ(n, 2); 1.342 - EXPECT_EQ(cx_strcmp(list[0], CX_STR("")), 0); 1.343 - EXPECT_EQ(cx_strcmp(list[1], CX_STR(",is,a,csv,string")), 0); 1.344 - 1.345 - // end with delimiter 1.346 - n = cx_strsplit(test, CX_STR("string"), capa, list); 1.347 - ASSERT_EQ(n, 2); 1.348 - EXPECT_EQ(cx_strcmp(list[0], CX_STR("this,is,a,csv,")), 0); 1.349 - EXPECT_EQ(cx_strcmp(list[1], CX_STR("")), 0); 1.350 - 1.351 - 1.352 - // end with delimiter exceed bound 1.353 - n = cx_strsplit(CX_STR("a,b,c,"), CX_STR(","), 3, list); 1.354 - ASSERT_EQ(n, 3); 1.355 - EXPECT_EQ(cx_strcmp(list[0], CX_STR("a")), 0); 1.356 - EXPECT_EQ(cx_strcmp(list[1], CX_STR("b")), 0); 1.357 - EXPECT_EQ(cx_strcmp(list[2], CX_STR("c,")), 0); 1.358 - 1.359 - // exact match 1.360 - n = cx_strsplit(test, CX_STR("this,is,a,csv,string"), capa, list); 1.361 - ASSERT_EQ(n, 2); 1.362 - EXPECT_EQ(cx_strcmp(list[0], CX_STR("")), 0); 1.363 - EXPECT_EQ(cx_strcmp(list[1], CX_STR("")), 0); 1.364 - 1.365 - // string to be split is only substring 1.366 - n = cx_strsplit(test, CX_STR("this,is,a,csv,string,with,extension"), capa, list); 1.367 - ASSERT_EQ(n, 1); 1.368 - EXPECT_EQ(cx_strcmp(list[0], test), 0); 1.369 - 1.370 - // subsequent encounter of delimiter (the string between is empty) 1.371 - n = cx_strsplit(test, CX_STR("is,"), capa, list); 1.372 - ASSERT_EQ(n, 3); 1.373 - EXPECT_EQ(cx_strcmp(list[0], CX_STR("th")), 0); 1.374 - EXPECT_EQ(cx_strcmp(list[1], CX_STR("")), 0); 1.375 - EXPECT_EQ(cx_strcmp(list[2], CX_STR("a,csv,string")), 0); 1.376 - 1.377 - // call the _m variant just for coverage 1.378 - auto mtest = cx_strdup(test); 1.379 - cxmutstr mlist[4]; 1.380 - n = cx_strsplit_m(mtest, CX_STR("is,"), 4, mlist); 1.381 - ASSERT_EQ(n, 3); 1.382 - EXPECT_EQ(cx_strcmp(cx_strcast(mlist[0]), CX_STR("th")), 0); 1.383 - EXPECT_EQ(cx_strcmp(cx_strcast(mlist[1]), CX_STR("")), 0); 1.384 - EXPECT_EQ(cx_strcmp(cx_strcast(mlist[2]), CX_STR("a,csv,string")), 0); 1.385 - cx_strfree(&mtest); 1.386 -} 1.387 - 1.388 -TEST(String, strsplit_a) { 1.389 - CxTestingAllocator alloc; 1.390 - 1.391 - cxstring test = CX_STR("this,is,a,csv,string"); 1.392 - size_t capa = 8; 1.393 - cxstring *list; 1.394 - size_t n; 1.395 - 1.396 - // special case: empty string 1.397 - n = cx_strsplit_a(&alloc, test, CX_STR(""), capa, &list); 1.398 - ASSERT_EQ(n, 1); 1.399 - EXPECT_EQ(cx_strcmp(list[0], test), 0); 1.400 - cxFree(&alloc, list); 1.401 - 1.402 - // no delimiter occurrence 1.403 - n = cx_strsplit_a(&alloc, test, CX_STR("z"), capa, &list); 1.404 - ASSERT_EQ(n, 1); 1.405 - EXPECT_EQ(cx_strcmp(list[0], test), 0); 1.406 - cxFree(&alloc, list); 1.407 - 1.408 - // partially matching delimiter 1.409 - n = cx_strsplit_a(&alloc, test, CX_STR("is,not"), capa, &list); 1.410 - ASSERT_EQ(n, 1); 1.411 - EXPECT_EQ(cx_strcmp(list[0], test), 0); 1.412 - cxFree(&alloc, list); 1.413 - 1.414 - // matching single-char delimiter 1.415 - n = cx_strsplit_a(&alloc, test, CX_STR(","), capa, &list); 1.416 - ASSERT_EQ(n, 5); 1.417 - EXPECT_EQ(cx_strcmp(list[0], CX_STR("this")), 0); 1.418 - EXPECT_EQ(cx_strcmp(list[1], CX_STR("is")), 0); 1.419 - EXPECT_EQ(cx_strcmp(list[2], CX_STR("a")), 0); 1.420 - EXPECT_EQ(cx_strcmp(list[3], CX_STR("csv")), 0); 1.421 - EXPECT_EQ(cx_strcmp(list[4], CX_STR("string")), 0); 1.422 - cxFree(&alloc, list); 1.423 - 1.424 - // matching multi-char delimiter 1.425 - n = cx_strsplit_a(&alloc, test, CX_STR("is"), capa, &list); 1.426 - ASSERT_EQ(n, 3); 1.427 - EXPECT_EQ(cx_strcmp(list[0], CX_STR("th")), 0); 1.428 - EXPECT_EQ(cx_strcmp(list[1], CX_STR(",")), 0); 1.429 - EXPECT_EQ(cx_strcmp(list[2], CX_STR(",a,csv,string")), 0); 1.430 - cxFree(&alloc, list); 1.431 - 1.432 - // bounded list using single-char delimiter 1.433 - n = cx_strsplit_a(&alloc, test, CX_STR(","), 3, &list); 1.434 - ASSERT_EQ(n, 3); 1.435 - EXPECT_EQ(cx_strcmp(list[0], CX_STR("this")), 0); 1.436 - EXPECT_EQ(cx_strcmp(list[1], CX_STR("is")), 0); 1.437 - EXPECT_EQ(cx_strcmp(list[2], CX_STR("a,csv,string")), 0); 1.438 - cxFree(&alloc, list); 1.439 - 1.440 - // bounded list using multi-char delimiter 1.441 - n = cx_strsplit_a(&alloc, test, CX_STR("is"), 2, &list); 1.442 - ASSERT_EQ(n, 2); 1.443 - EXPECT_EQ(cx_strcmp(list[0], CX_STR("th")), 0); 1.444 - EXPECT_EQ(cx_strcmp(list[1], CX_STR(",is,a,csv,string")), 0); 1.445 - cxFree(&alloc, list); 1.446 - 1.447 - // start with delimiter 1.448 - n = cx_strsplit_a(&alloc, test, CX_STR("this"), capa, &list); 1.449 - ASSERT_EQ(n, 2); 1.450 - EXPECT_EQ(cx_strcmp(list[0], CX_STR("")), 0); 1.451 - EXPECT_EQ(cx_strcmp(list[1], CX_STR(",is,a,csv,string")), 0); 1.452 - cxFree(&alloc, list); 1.453 - 1.454 - // end with delimiter 1.455 - n = cx_strsplit_a(&alloc, test, CX_STR("string"), capa, &list); 1.456 - ASSERT_EQ(n, 2); 1.457 - EXPECT_EQ(cx_strcmp(list[0], CX_STR("this,is,a,csv,")), 0); 1.458 - EXPECT_EQ(cx_strcmp(list[1], CX_STR("")), 0); 1.459 - cxFree(&alloc, list); 1.460 - 1.461 - // end with delimiter exceed bound 1.462 - n = cx_strsplit_a(&alloc, CX_STR("a,b,c,"), CX_STR(","), 3, &list); 1.463 - ASSERT_EQ(n, 3); 1.464 - EXPECT_EQ(cx_strcmp(list[0], CX_STR("a")), 0); 1.465 - EXPECT_EQ(cx_strcmp(list[1], CX_STR("b")), 0); 1.466 - EXPECT_EQ(cx_strcmp(list[2], CX_STR("c,")), 0); 1.467 - cxFree(&alloc, list); 1.468 - 1.469 - // exact match 1.470 - n = cx_strsplit_a(&alloc, test, CX_STR("this,is,a,csv,string"), capa, &list); 1.471 - ASSERT_EQ(n, 2); 1.472 - EXPECT_EQ(cx_strcmp(list[0], CX_STR("")), 0); 1.473 - EXPECT_EQ(cx_strcmp(list[1], CX_STR("")), 0); 1.474 - cxFree(&alloc, list); 1.475 - 1.476 - // string to be split is only substring 1.477 - n = cx_strsplit_a(&alloc, test, CX_STR("this,is,a,csv,string,with,extension"), capa, &list); 1.478 - ASSERT_EQ(n, 1); 1.479 - EXPECT_EQ(cx_strcmp(list[0], test), 0); 1.480 - cxFree(&alloc, list); 1.481 - 1.482 - // subsequent encounter of delimiter (the string between is empty) 1.483 - n = cx_strsplit_a(&alloc, test, CX_STR("is,"), capa, &list); 1.484 - ASSERT_EQ(n, 3); 1.485 - EXPECT_EQ(cx_strcmp(list[0], CX_STR("th")), 0); 1.486 - EXPECT_EQ(cx_strcmp(list[1], CX_STR("")), 0); 1.487 - EXPECT_EQ(cx_strcmp(list[2], CX_STR("a,csv,string")), 0); 1.488 - cxFree(&alloc, list); 1.489 - 1.490 - // call the _m variant just for coverage 1.491 - auto mtest = cx_strdup(test); 1.492 - cxmutstr *mlist; 1.493 - n = cx_strsplit_ma(&alloc, mtest, CX_STR("is,"), 4, &mlist); 1.494 - ASSERT_EQ(n, 3); 1.495 - EXPECT_EQ(cx_strcmp(cx_strcast(mlist[0]), CX_STR("th")), 0); 1.496 - EXPECT_EQ(cx_strcmp(cx_strcast(mlist[1]), CX_STR("")), 0); 1.497 - EXPECT_EQ(cx_strcmp(cx_strcast(mlist[2]), CX_STR("a,csv,string")), 0); 1.498 - cxFree(&alloc, mlist); 1.499 - cx_strfree(&mtest); 1.500 - 1.501 - EXPECT_TRUE(alloc.verify()); 1.502 -} 1.503 - 1.504 -TEST(String, strtrim) { 1.505 - cxstring t1 = cx_strtrim(CX_STR(" ein test \t ")); 1.506 - cxstring t2 = cx_strtrim(CX_STR("abc")); 1.507 - cxstring t3 = cx_strtrim(CX_STR(" 123")); 1.508 - cxstring t4 = cx_strtrim(CX_STR("xyz ")); 1.509 - cxstring t5 = cx_strtrim(CX_STR(" ")); 1.510 - cxstring empty = cx_strtrim(CX_STR("")); 1.511 - 1.512 - EXPECT_EQ(cx_strcmp(t1, CX_STR("ein test")), 0); 1.513 - EXPECT_EQ(cx_strcmp(t2, CX_STR("abc")), 0); 1.514 - EXPECT_EQ(cx_strcmp(t3, CX_STR("123")), 0); 1.515 - EXPECT_EQ(cx_strcmp(t4, CX_STR("xyz")), 0); 1.516 - EXPECT_EQ(cx_strcmp(t5, CX_STR("")), 0); 1.517 - EXPECT_EQ(cx_strcmp(empty, CX_STR("")), 0); 1.518 - 1.519 - // call the _m variant just for coverage 1.520 - cxmutstr m1 = cx_strtrim_m(cx_mutstr((char *) " ein test \t ")); 1.521 - EXPECT_EQ(cx_strcmp(cx_strcast(m1), CX_STR("ein test")), 0); 1.522 -} 1.523 - 1.524 -TEST(String, strprefix) { 1.525 - cxstring str = CX_STR("test my prefix and my suffix"); 1.526 - cxstring empty = CX_STR(""); 1.527 - EXPECT_FALSE(cx_strprefix(empty, CX_STR("pref"))); 1.528 - EXPECT_TRUE(cx_strprefix(str, empty)); 1.529 - EXPECT_TRUE(cx_strprefix(empty, empty)); 1.530 - EXPECT_TRUE(cx_strprefix(str, CX_STR("test "))); 1.531 - EXPECT_FALSE(cx_strprefix(str, CX_STR("8-) fsck "))); 1.532 -} 1.533 - 1.534 -TEST(String, strsuffix) { 1.535 - cxstring str = CX_STR("test my prefix and my suffix"); 1.536 - cxstring empty = CX_STR(""); 1.537 - EXPECT_FALSE(cx_strsuffix(empty, CX_STR("suf"))); 1.538 - EXPECT_TRUE(cx_strsuffix(str, empty)); 1.539 - EXPECT_TRUE(cx_strsuffix(empty, empty)); 1.540 - EXPECT_TRUE(cx_strsuffix(str, CX_STR("fix"))); 1.541 - EXPECT_FALSE(cx_strsuffix(str, CX_STR("fox"))); 1.542 -} 1.543 - 1.544 -TEST(String, strcaseprefix) { 1.545 - cxstring str = CX_STR("test my prefix and my suffix"); 1.546 - cxstring empty = CX_STR(""); 1.547 - EXPECT_FALSE(cx_strcaseprefix(empty, CX_STR("pREf"))); 1.548 - EXPECT_TRUE(cx_strcaseprefix(str, empty)); 1.549 - EXPECT_TRUE(cx_strcaseprefix(empty, empty)); 1.550 - EXPECT_TRUE(cx_strcaseprefix(str, CX_STR("TEST "))); 1.551 - EXPECT_FALSE(cx_strcaseprefix(str, CX_STR("8-) fsck "))); 1.552 -} 1.553 - 1.554 -TEST(String, strcasesuffix) { 1.555 - cxstring str = CX_STR("test my prefix and my suffix"); 1.556 - cxstring empty = CX_STR(""); 1.557 - EXPECT_FALSE(cx_strcasesuffix(empty, CX_STR("sUf"))); 1.558 - EXPECT_TRUE(cx_strcasesuffix(str, empty)); 1.559 - EXPECT_TRUE(cx_strcasesuffix(empty, empty)); 1.560 - EXPECT_TRUE(cx_strcasesuffix(str, CX_STR("FIX"))); 1.561 - EXPECT_FALSE(cx_strcasesuffix(str, CX_STR("fox"))); 1.562 -} 1.563 - 1.564 -TEST(String, strreplace) { 1.565 - CxTestingAllocator alloc; 1.566 - cxstring str = CX_STR("test ababab string aba"); 1.567 - cxstring longstr = CX_STR( 1.568 - "xyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacd"); 1.569 - cxstring notrail = CX_STR("test abab"); 1.570 - cxstring empty = CX_STR(""); 1.571 - cxstring astr = CX_STR("aaaaaaaaaa"); 1.572 - cxstring csstr = CX_STR("test AB ab TEST xyz"); 1.573 - 1.574 - cxmutstr repl = cx_strreplace(str, CX_STR("abab"), CX_STR("muchlonger")); 1.575 - auto expected = "test muchlongerab string aba"; 1.576 - 1.577 - cxmutstr repln = cx_strreplacen(str, CX_STR("ab"), CX_STR("c"), 2); 1.578 - auto expectedn = "test ccab string aba"; 1.579 - 1.580 - cxmutstr longrepl = cx_strreplace(longstr, CX_STR("a"), CX_STR("z")); 1.581 - auto longexpect = "xyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzcd"; 1.582 - 1.583 - cxmutstr replnotrail = cx_strreplace(notrail, CX_STR("ab"), CX_STR("z")); 1.584 - auto notrailexpect = "test zz"; 1.585 - 1.586 - cxmutstr repleq = cx_strreplace(str, str, CX_STR("hello")); 1.587 - auto eqexpect = "hello"; 1.588 - 1.589 - cxmutstr replempty1 = cx_strreplace(empty, CX_STR("ab"), CX_STR("c")); // expect: empty 1.590 - cxmutstr replempty2 = cx_strreplace(str, CX_STR("abab"), empty); 1.591 - auto emptyexpect2 = "test ab string aba"; 1.592 - 1.593 - cxmutstr replpre = cx_strreplace(str, CX_STR("test "), CX_STR("TEST ")); 1.594 - auto preexpected = "TEST ababab string aba"; 1.595 - 1.596 - cxmutstr replan1 = cx_strreplacen(astr, CX_STR("a"), CX_STR("x"), 1); 1.597 - auto an1expected = "xaaaaaaaaa"; 1.598 - 1.599 - cxmutstr replan4 = cx_strreplacen(astr, CX_STR("a"), CX_STR("x"), 4); 1.600 - auto an4expected = "xxxxaaaaaa"; 1.601 - 1.602 - cxmutstr replan9 = cx_strreplacen(astr, CX_STR("a"), CX_STR("x"), 9); 1.603 - auto an9expected = "xxxxxxxxxa"; 1.604 - 1.605 - cxmutstr replan10 = cx_strreplacen(astr, CX_STR("a"), CX_STR("x"), 10); 1.606 - auto an10expected = "xxxxxxxxxx"; 1.607 - 1.608 - cxmutstr repl1_a = cx_strreplace_a(&alloc, csstr, CX_STR("AB"), CX_STR("*")); 1.609 - auto expeced1_a = "test * ab TEST xyz"; 1.610 - 1.611 - cxmutstr repl2_a = cx_strreplace_a(&alloc, csstr, CX_STR("test"), CX_STR("TEST")); 1.612 - auto expected2_a = "TEST AB ab TEST xyz"; 1.613 - 1.614 - 1.615 - EXPECT_NE(repl.ptr, str.ptr); 1.616 - EXPECT_ZERO_TERMINATED(repl); 1.617 - EXPECT_STREQ(repl.ptr, expected); 1.618 - EXPECT_ZERO_TERMINATED(repln); 1.619 - EXPECT_STREQ(repln.ptr, expectedn); 1.620 - EXPECT_ZERO_TERMINATED(longrepl); 1.621 - EXPECT_STREQ(longrepl.ptr, longexpect); 1.622 - EXPECT_ZERO_TERMINATED(replnotrail); 1.623 - EXPECT_STREQ(replnotrail.ptr, notrailexpect); 1.624 - EXPECT_ZERO_TERMINATED(repleq); 1.625 - EXPECT_STREQ(repleq.ptr, eqexpect); 1.626 - EXPECT_ZERO_TERMINATED(replempty1); 1.627 - EXPECT_STREQ(replempty1.ptr, ""); 1.628 - EXPECT_ZERO_TERMINATED(replempty2); 1.629 - EXPECT_STREQ(replempty2.ptr, emptyexpect2); 1.630 - EXPECT_ZERO_TERMINATED(replpre); 1.631 - EXPECT_STREQ(replpre.ptr, preexpected); 1.632 - EXPECT_ZERO_TERMINATED(replan1); 1.633 - EXPECT_STREQ(replan1.ptr, an1expected); 1.634 - EXPECT_ZERO_TERMINATED(replan4); 1.635 - EXPECT_STREQ(replan4.ptr, an4expected); 1.636 - EXPECT_ZERO_TERMINATED(replan9); 1.637 - EXPECT_STREQ(replan9.ptr, an9expected); 1.638 - EXPECT_ZERO_TERMINATED(replan10); 1.639 - EXPECT_STREQ(replan10.ptr, an10expected); 1.640 - EXPECT_ZERO_TERMINATED(repl1_a); 1.641 - EXPECT_STREQ(repl1_a.ptr, expeced1_a); 1.642 - EXPECT_ZERO_TERMINATED(repl2_a); 1.643 - EXPECT_STREQ(repl2_a.ptr, expected2_a); 1.644 - 1.645 - cx_strfree(&repl); 1.646 - cx_strfree(&repln); 1.647 - cx_strfree(&longrepl); 1.648 - cx_strfree(&replnotrail); 1.649 - cx_strfree(&repleq); 1.650 - cx_strfree(&replempty1); 1.651 - cx_strfree(&replempty2); 1.652 - cx_strfree(&replpre); 1.653 - cx_strfree(&replan1); 1.654 - cx_strfree(&replan4); 1.655 - cx_strfree(&replan9); 1.656 - cx_strfree(&replan10); 1.657 - 1.658 - cx_strfree_a(&alloc, &repl1_a); 1.659 - cx_strfree_a(&alloc, &repl2_a); 1.660 - EXPECT_TRUE(alloc.verify()); 1.661 -} 1.662 - 1.663 -TEST(String, strupper) { 1.664 - cxmutstr str = cx_strdup(CX_STR("thIs 1s @ Te$t")); 1.665 - cx_strupper(str); 1.666 - EXPECT_STREQ(str.ptr, "THIS 1S @ TE$T"); 1.667 - cx_strfree(&str); 1.668 -} 1.669 - 1.670 -TEST(String, strlower) { 1.671 - cxmutstr str = cx_strdup(CX_STR("thIs 1s @ Te$t")); 1.672 - cx_strlower(str); 1.673 - EXPECT_STREQ(str.ptr, "this 1s @ te$t"); 1.674 - cx_strfree(&str); 1.675 -} 1.676 - 1.677 -TEST(String, strtok) { 1.678 - cxstring str = CX_STR("a,comma,separated,string"); 1.679 - cxstring delim = CX_STR(","); 1.680 - CxStrtokCtx ctx = cx_strtok(str, delim, 3); 1.681 - EXPECT_EQ(ctx.str.ptr, str.ptr); 1.682 - EXPECT_EQ(ctx.str.length, str.length); 1.683 - EXPECT_EQ(ctx.delim.ptr, delim.ptr); 1.684 - EXPECT_EQ(ctx.delim.length, delim.length); 1.685 - EXPECT_EQ(ctx.limit, 3); 1.686 - EXPECT_EQ(ctx.found, 0); 1.687 - EXPECT_EQ(ctx.pos, 0); 1.688 - EXPECT_EQ(ctx.next_pos, 0); 1.689 - EXPECT_EQ(ctx.delim_more, nullptr); 1.690 - EXPECT_EQ(ctx.delim_more_count, 0); 1.691 -} 1.692 - 1.693 -TEST(String, strtok_m) { 1.694 - cxmutstr str = cx_strdup(CX_STR("a,comma,separated,string")); 1.695 - cxstring delim = CX_STR(","); 1.696 - CxStrtokCtx ctx = cx_strtok_m(str, delim, 3); 1.697 - EXPECT_EQ(ctx.str.ptr, str.ptr); 1.698 - EXPECT_EQ(ctx.str.length, str.length); 1.699 - EXPECT_EQ(ctx.delim.ptr, delim.ptr); 1.700 - EXPECT_EQ(ctx.delim.length, delim.length); 1.701 - EXPECT_EQ(ctx.limit, 3); 1.702 - EXPECT_EQ(ctx.found, 0); 1.703 - EXPECT_EQ(ctx.pos, 0); 1.704 - EXPECT_EQ(ctx.next_pos, 0); 1.705 - EXPECT_EQ(ctx.delim_more, nullptr); 1.706 - EXPECT_EQ(ctx.delim_more_count, 0); 1.707 - cx_strfree(&str); 1.708 -} 1.709 - 1.710 -TEST(String, strtok_delim) { 1.711 - cxstring str = CX_STR("an,arbitrarily|separated;string"); 1.712 - cxstring delim = CX_STR(","); 1.713 - cxstring delim_more[2] = {CX_STR("|"), CX_STR(";")}; 1.714 - CxStrtokCtx ctx = cx_strtok(str, delim, 3); 1.715 - cx_strtok_delim(&ctx, delim_more, 2); 1.716 - EXPECT_EQ(ctx.str.ptr, str.ptr); 1.717 - EXPECT_EQ(ctx.str.length, str.length); 1.718 - EXPECT_EQ(ctx.delim.ptr, delim.ptr); 1.719 - EXPECT_EQ(ctx.delim.length, delim.length); 1.720 - EXPECT_EQ(ctx.limit, 3); 1.721 - EXPECT_EQ(ctx.found, 0); 1.722 - EXPECT_EQ(ctx.pos, 0); 1.723 - EXPECT_EQ(ctx.next_pos, 0); 1.724 - EXPECT_EQ(ctx.delim_more, delim_more); 1.725 - EXPECT_EQ(ctx.delim_more_count, 2); 1.726 -} 1.727 - 1.728 -TEST(String, strtok_next_easy) { 1.729 - cxstring str = CX_STR("a,comma,separated,string"); 1.730 - cxstring delim = CX_STR(","); 1.731 - CxStrtokCtx ctx = cx_strtok(str, delim, 3); 1.732 - bool ret; 1.733 - cxstring tok; 1.734 - 1.735 - ret = cx_strtok_next(&ctx, &tok); 1.736 - ASSERT_TRUE(ret); 1.737 - EXPECT_EQ(cx_strcmp(tok, CX_STR("a")), 0); 1.738 - EXPECT_EQ(ctx.pos, 0); 1.739 - EXPECT_EQ(ctx.next_pos, 2); 1.740 - EXPECT_EQ(ctx.delim_pos, 1); 1.741 - EXPECT_EQ(ctx.found, 1); 1.742 - 1.743 - ret = cx_strtok_next(&ctx, &tok); 1.744 - ASSERT_TRUE(ret); 1.745 - EXPECT_EQ(cx_strcmp(tok, CX_STR("comma")), 0); 1.746 - EXPECT_EQ(ctx.pos, 2); 1.747 - EXPECT_EQ(ctx.next_pos, 8); 1.748 - EXPECT_EQ(ctx.delim_pos, 7); 1.749 - EXPECT_EQ(ctx.found, 2); 1.750 - 1.751 - ret = cx_strtok_next(&ctx, &tok); 1.752 - ASSERT_TRUE(ret); 1.753 - EXPECT_EQ(cx_strcmp(tok, CX_STR("separated")), 0); 1.754 - EXPECT_EQ(ctx.pos, 8); 1.755 - EXPECT_EQ(ctx.next_pos, 18); 1.756 - EXPECT_EQ(ctx.delim_pos, 17); 1.757 - EXPECT_EQ(ctx.found, 3); 1.758 - 1.759 - ret = cx_strtok_next(&ctx, &tok); 1.760 - ASSERT_FALSE(ret); 1.761 - EXPECT_EQ(ctx.pos, 8); 1.762 - EXPECT_EQ(ctx.next_pos, 18); 1.763 - EXPECT_EQ(ctx.delim_pos, 17); 1.764 - EXPECT_EQ(ctx.found, 3); 1.765 -} 1.766 - 1.767 -TEST(String, strtok_next_unlimited) { 1.768 - cxstring str = CX_STR("some;-;otherwise;-;separated;-;string;-;"); 1.769 - cxstring delim = CX_STR(";-;"); 1.770 - CxStrtokCtx ctx = cx_strtok(str, delim, SIZE_MAX); 1.771 - bool ret; 1.772 - cxstring tok; 1.773 - 1.774 - ret = cx_strtok_next(&ctx, &tok); 1.775 - ASSERT_TRUE(ret); 1.776 - EXPECT_EQ(cx_strcmp(tok, CX_STR("some")), 0); 1.777 - EXPECT_EQ(ctx.pos, 0); 1.778 - EXPECT_EQ(ctx.next_pos, 7); 1.779 - EXPECT_EQ(ctx.delim_pos, 4); 1.780 - EXPECT_EQ(ctx.found, 1); 1.781 - 1.782 - ret = cx_strtok_next(&ctx, &tok); 1.783 - ASSERT_TRUE(ret); 1.784 - EXPECT_EQ(cx_strcmp(tok, CX_STR("otherwise")), 0); 1.785 - EXPECT_EQ(ctx.pos, 7); 1.786 - EXPECT_EQ(ctx.next_pos, 19); 1.787 - EXPECT_EQ(ctx.delim_pos, 16); 1.788 - EXPECT_EQ(ctx.found, 2); 1.789 - 1.790 - ret = cx_strtok_next(&ctx, &tok); 1.791 - ASSERT_TRUE(ret); 1.792 - EXPECT_EQ(cx_strcmp(tok, CX_STR("separated")), 0); 1.793 - EXPECT_EQ(ctx.pos, 19); 1.794 - EXPECT_EQ(ctx.next_pos, 31); 1.795 - EXPECT_EQ(ctx.delim_pos, 28); 1.796 - EXPECT_EQ(ctx.found, 3); 1.797 - 1.798 - ret = cx_strtok_next(&ctx, &tok); 1.799 - ASSERT_TRUE(ret); 1.800 - EXPECT_EQ(cx_strcmp(tok, CX_STR("string")), 0); 1.801 - EXPECT_EQ(ctx.pos, 31); 1.802 - EXPECT_EQ(ctx.next_pos, 40); 1.803 - EXPECT_EQ(ctx.delim_pos, 37); 1.804 - EXPECT_EQ(ctx.found, 4); 1.805 - 1.806 - ret = cx_strtok_next(&ctx, &tok); 1.807 - ASSERT_TRUE(ret); 1.808 - EXPECT_EQ(cx_strcmp(tok, CX_STR("")), 0); 1.809 - EXPECT_EQ(ctx.pos, 40); 1.810 - EXPECT_EQ(ctx.next_pos, 40); 1.811 - EXPECT_EQ(ctx.delim_pos, 40); 1.812 - EXPECT_EQ(ctx.found, 5); 1.813 - 1.814 - ret = cx_strtok_next(&ctx, &tok); 1.815 - ASSERT_FALSE(ret); 1.816 - EXPECT_EQ(ctx.pos, 40); 1.817 - EXPECT_EQ(ctx.delim_pos, 40); 1.818 - EXPECT_EQ(ctx.found, 5); 1.819 -} 1.820 - 1.821 -TEST(String, strtok_next_advanced) { 1.822 - cxmutstr str = cx_strdup(CX_STR("an,arbitrarily;||separated;string")); 1.823 - cxstring delim = CX_STR(","); 1.824 - cxstring delim_more[2] = {CX_STR("||"), CX_STR(";")}; 1.825 - CxStrtokCtx ctx = cx_strtok_m(str, delim, 10); 1.826 - cx_strtok_delim(&ctx, delim_more, 2); 1.827 - bool ret; 1.828 - cxmutstr tok; 1.829 - 1.830 - ret = cx_strtok_next_m(&ctx, &tok); 1.831 - ASSERT_TRUE(ret); 1.832 - EXPECT_EQ(cx_strcmp(cx_strcast(tok), CX_STR("an")), 0); 1.833 - EXPECT_EQ(ctx.pos, 0); 1.834 - EXPECT_EQ(ctx.next_pos, 3); 1.835 - EXPECT_EQ(ctx.delim_pos, 2); 1.836 - EXPECT_EQ(ctx.found, 1); 1.837 - cx_strupper(tok); 1.838 - 1.839 - ret = cx_strtok_next_m(&ctx, &tok); 1.840 - ASSERT_TRUE(ret); 1.841 - EXPECT_EQ(cx_strcmp(cx_strcast(tok), CX_STR("arbitrarily")), 0); 1.842 - EXPECT_EQ(ctx.pos, 3); 1.843 - EXPECT_EQ(ctx.next_pos, 15); 1.844 - EXPECT_EQ(ctx.delim_pos, 14); 1.845 - EXPECT_EQ(ctx.found, 2); 1.846 - cx_strupper(tok); 1.847 - 1.848 - ret = cx_strtok_next_m(&ctx, &tok); 1.849 - ASSERT_TRUE(ret); 1.850 - EXPECT_EQ(cx_strcmp(cx_strcast(tok), CX_STR("")), 0); 1.851 - EXPECT_EQ(ctx.pos, 15); 1.852 - EXPECT_EQ(ctx.next_pos, 17); 1.853 - EXPECT_EQ(ctx.delim_pos, 15); 1.854 - EXPECT_EQ(ctx.found, 3); 1.855 - cx_strupper(tok); 1.856 - 1.857 - ret = cx_strtok_next_m(&ctx, &tok); 1.858 - ASSERT_TRUE(ret); 1.859 - EXPECT_EQ(cx_strcmp(cx_strcast(tok), CX_STR("separated")), 0); 1.860 - EXPECT_EQ(ctx.pos, 17); 1.861 - EXPECT_EQ(ctx.next_pos, 27); 1.862 - EXPECT_EQ(ctx.delim_pos, 26); 1.863 - EXPECT_EQ(ctx.found, 4); 1.864 - cx_strupper(tok); 1.865 - 1.866 - ret = cx_strtok_next_m(&ctx, &tok); 1.867 - ASSERT_TRUE(ret); 1.868 - EXPECT_EQ(cx_strcmp(cx_strcast(tok), CX_STR("string")), 0); 1.869 - EXPECT_EQ(ctx.pos, 27); 1.870 - EXPECT_EQ(ctx.next_pos, 33); 1.871 - EXPECT_EQ(ctx.delim_pos, 33); 1.872 - EXPECT_EQ(ctx.found, 5); 1.873 - cx_strupper(tok); 1.874 - 1.875 - ret = cx_strtok_next_m(&ctx, &tok); 1.876 - ASSERT_FALSE(ret); 1.877 - EXPECT_EQ(ctx.pos, 27); 1.878 - EXPECT_EQ(ctx.next_pos, 33); 1.879 - EXPECT_EQ(ctx.delim_pos, 33); 1.880 - EXPECT_EQ(ctx.found, 5); 1.881 - 1.882 - EXPECT_EQ(cx_strcmp(cx_strcast(str), CX_STR("AN,ARBITRARILY;||SEPARATED;STRING")), 0); 1.883 - 1.884 - cx_strfree(&str); 1.885 -}