1.1 --- a/test/string_tests.c Mon Dec 30 09:54:10 2019 +0100 1.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 1.3 @@ -1,589 +0,0 @@ 1.4 -/* 1.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 1.6 - * 1.7 - * Copyright 2017 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 "string_tests.h" 1.33 - 1.34 -UCX_TEST(test_sstr_macros) { 1.35 - sstr_t hello = ST("Hello"); 1.36 - sstr_t world = S("World"); 1.37 - 1.38 - char buf[20]; 1.39 - snprintf(buf, sizeof(buf), "%" PRIsstr ", %" PRIsstr "!", SFMT(hello), SFMT(world)); 1.40 - 1.41 - UCX_TEST_BEGIN 1.42 - const char* cmp = "Hello, World!"; 1.43 - UCX_TEST_ASSERT(!strcmp(cmp, buf), "Something weird happened."); 1.44 - UCX_TEST_END 1.45 -} 1.46 - 1.47 -UCX_TEST(test_sstr) { 1.48 - sstr_t s1 = sstr((char*)"1234"); 1.49 - sstr_t s2 = sstrn((char*)"ab", 2); 1.50 - 1.51 - UCX_TEST_BEGIN 1.52 - 1.53 - UCX_TEST_ASSERT(s1.length == 4, "s1 length must be 4"); 1.54 - UCX_TEST_ASSERT(s2.length == 2, "s2 length must be 2"); 1.55 - 1.56 - UCX_TEST_END 1.57 -} 1.58 - 1.59 -UCX_TEST(test_sstr_len) { 1.60 - sstr_t s1 = ST("1234"); 1.61 - sstr_t s2 = ST(".:.:."); 1.62 - sstr_t s3 = ST("X"); 1.63 - 1.64 - size_t len1 = sstrnlen(1, s1); 1.65 - size_t len2 = sstrnlen(2, s1, s2); 1.66 - size_t len3 = sstrnlen(3, s1, s2, s3); 1.67 - 1.68 - UCX_TEST_BEGIN 1.69 - 1.70 - UCX_TEST_ASSERT(len1 == 4, "sstrnlen returned wrong size"); 1.71 - UCX_TEST_ASSERT(len2 == 9, "sstrnlen returned wrong size"); 1.72 - UCX_TEST_ASSERT(len3 == 10, "sstrnlen returned wrong size"); 1.73 - 1.74 - UCX_TEST_END 1.75 -} 1.76 - 1.77 - 1.78 -UCX_TEST(test_sstrchr_sstrrchr) { 1.79 - sstr_t str = ST("I will find you - and I will kill you"); 1.80 - UCX_TEST_BEGIN 1.81 - 1.82 - sstr_t notfound = sstrchr(str, 'x'); 1.83 - UCX_TEST_ASSERT(notfound.length == 0, 1.84 - "string length not 0 after forward search w/o result"); 1.85 - 1.86 - notfound = sstrrchr(str, 'x'); 1.87 - UCX_TEST_ASSERT(notfound.length == 0, 1.88 - "string length not 0 after reverse search w/o result"); 1.89 - 1.90 - sstr_t result = sstrchr(str, 'w'); 1.91 - UCX_TEST_ASSERT(result.length == 35, "sstrchr returned wrong length"); 1.92 - UCX_TEST_ASSERT(strcmp("will find you - and I will kill you", result.ptr) 1.93 - == 0, "sstrchr did not return the expected string"); 1.94 - 1.95 - result = sstrrchr(str, 'w'); 1.96 - UCX_TEST_ASSERT(result.length == 13, "sstrrchr returned wrong length"); 1.97 - UCX_TEST_ASSERT(strcmp("will kill you", result.ptr) 1.98 - == 0, "sstrrchr did not return the expected string"); 1.99 - 1.100 - UCX_TEST_END 1.101 -} 1.102 - 1.103 -UCX_TEST(test_sstrstr) { 1.104 - sstr_t str = ST("find the match in this string"); 1.105 - sstr_t longstr = ST( 1.106 - "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl" 1.107 - "mnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwx" 1.108 - "yzabcdeababababnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghij" 1.109 - "klmnopqrstuvwxyzaababababababababrstuvwxyzabcdefghijklmnopqrstuv" 1.110 - "abababababababababababababababababababababababababababababababab" 1.111 - "abababababababababababababababababababababababababababababababab" 1.112 - "abababababababababababababababababababababababababababababababab" 1.113 - "abababababababababababababababababababababababababababababababab" 1.114 - "abababababababababababababababababababababababababababababababab" 1.115 - "abababababababababababababababababababababababababababababababab" 1.116 - "wxyz1234567890"); 1.117 - sstr_t longstrpattern = ST( 1.118 - "abababababababababababababababababababababababababababababababab" 1.119 - "abababababababababababababababababababababababababababababababab" 1.120 - "abababababababababababababababababababababababababababababababab" 1.121 - "abababababababababababababababababababababababababababababababab" 1.122 - "abababababababababababababababababababababababababababababababab" 1.123 - ); 1.124 - sstr_t longstrresult = ST( 1.125 - "abababababababababababababababababababababababababababababababab" 1.126 - "abababababababababababababababababababababababababababababababab" 1.127 - "abababababababababababababababababababababababababababababababab" 1.128 - "abababababababababababababababababababababababababababababababab" 1.129 - "abababababababababababababababababababababababababababababababab" 1.130 - "abababababababababababababababababababababababababababababababab" 1.131 - "wxyz1234567890" 1.132 - ); 1.133 - UCX_TEST_BEGIN 1.134 - 1.135 - sstr_t notfound = sstrstr(str, S("no match")); 1.136 - UCX_TEST_ASSERT(notfound.length == 0, "no match must return empty string"); 1.137 - 1.138 - sstr_t result = sstrstr(str, S("match")); 1.139 - UCX_TEST_ASSERT(result.length == 20, "sstrstr returned wrong length"); 1.140 - UCX_TEST_ASSERT(!strcmp("match in this string", result.ptr), 1.141 - "sstrstr did not return the expected string"); 1.142 - 1.143 - result = sstrstr(str, S("")); 1.144 - UCX_TEST_ASSERT(result.length == str.length, 1.145 - "sstrstr with empty match string returned wrong length"); 1.146 - UCX_TEST_ASSERT(!strcmp(str.ptr, result.ptr), 1.147 - "sstrstr with empty match string did not return the original string"); 1.148 - 1.149 - result = sstrstr(longstr, longstrpattern); 1.150 - UCX_TEST_ASSERT(result.length == longstrresult.length, 1.151 - "long string result length incorrect"); 1.152 - UCX_TEST_ASSERT(!strcmp(result.ptr, longstrresult.ptr), 1.153 - "long string result content incorrect"); 1.154 - 1.155 - UCX_TEST_END 1.156 -} 1.157 - 1.158 -UCX_TEST(test_sstrcmp) { 1.159 - sstr_t str = ST("compare this"); 1.160 - 1.161 - UCX_TEST_BEGIN 1.162 - UCX_TEST_ASSERT(sstrcmp(str, S("")) == 1, "empty cmp failed"); 1.163 - UCX_TEST_ASSERT(sstrcmp(S(""), S("")) == 0, "empty cmp false negative"); 1.164 - UCX_TEST_ASSERT(sstrcmp(str, S("compare this")) == 0, "false negative"); 1.165 - UCX_TEST_ASSERT(sstrcmp(str, S("Compare This")) != 0, "false positive"); 1.166 - UCX_TEST_ASSERT(sstrcmp(str, S("compare tool")) < 0, "memcmp < 0 failed"); 1.167 - UCX_TEST_ASSERT(sstrcmp(str, S("compare shit")) > 0, "memcmp > 0 failed"); 1.168 - UCX_TEST_ASSERT(sstrcmp(str, S("compare this not")) < 0, "len < 0 failed"); 1.169 - UCX_TEST_ASSERT(sstrcmp(str, S("compare")) > 0, "len > 0 failed"); 1.170 - UCX_TEST_END 1.171 -} 1.172 - 1.173 -UCX_TEST(test_sstrcasecmp) { 1.174 - 1.175 - sstr_t str = ST("compare this"); 1.176 - 1.177 - UCX_TEST_BEGIN 1.178 - UCX_TEST_ASSERT(sstrcasecmp(str, S("")) == 1, "empty cmp failed"); 1.179 - UCX_TEST_ASSERT(sstrcasecmp(S(""), S("")) == 0, "empty cmp false negative"); 1.180 - UCX_TEST_ASSERT(sstrcasecmp(str, S("compare this")) == 0, "false negative"); 1.181 - UCX_TEST_ASSERT(sstrcasecmp(str, S("Compare This")) == 0, 1.182 - "not ignoring case"); 1.183 - UCX_TEST_ASSERT(sstrcasecmp(str, S("compare tool")) < 0, "< 0 failed"); 1.184 - UCX_TEST_ASSERT(sstrcasecmp(str, S("compare shit")) > 0, "> 0 failed"); 1.185 - UCX_TEST_ASSERT(sstrcasecmp(str, S("compare this not")) < 0, 1.186 - "len < 0 failed"); 1.187 - UCX_TEST_ASSERT(sstrcasecmp(str, S("compare")) > 0, "len > 0 failed"); 1.188 - UCX_TEST_END 1.189 -} 1.190 - 1.191 - 1.192 -UCX_TEST(test_sstrcat) { 1.193 - sstr_t s1 = S("12"); 1.194 - sstr_t s2 = S("34"); 1.195 - sstr_t s3 = S("56"); 1.196 - sstr_t sn = { NULL, 0 }; 1.197 - 1.198 - UCX_TEST_BEGIN 1.199 - 1.200 - sstr_t t1 = sstrcat(2, s1, s2); 1.201 - UCX_TEST_ASSERT(!sstrcmp(t1, S("1234")), "t1: wrong content"); 1.202 - free(t1.ptr); 1.203 - 1.204 - sstr_t t2 = sstrcat(3, s1, s2, s3); 1.205 - UCX_TEST_ASSERT(!sstrcmp(t2, S("123456")), "t2: wrong content"); 1.206 - free(t2.ptr); 1.207 - 1.208 - sstr_t t3 = sstrcat(6, s1, sn, s2, sn, s3, sn); 1.209 - UCX_TEST_ASSERT(!sstrcmp(t3, S("123456")), "t3: wrong content"); 1.210 - free(t3.ptr); 1.211 - 1.212 - sstr_t t4 = sstrcat(2, sn, sn); 1.213 - UCX_TEST_ASSERT(t4.ptr, "t4.ptr is NULL"); 1.214 - UCX_TEST_ASSERT(t4.length == 0, "t4 has wrong length"); 1.215 - free(t4.ptr); 1.216 - 1.217 - // overflow test 1.218 - sstr_t o0; 1.219 - o0.ptr = ""; 1.220 - o0.length = ((size_t)-1) - 50; 1.221 - sstr_t o1; 1.222 - o1.ptr = ""; 1.223 - o1.length = 100; 1.224 - sstr_t o2; 1.225 - o2.ptr = ""; 1.226 - o2.length = 10; 1.227 - 1.228 - sstr_t n = sstrcat(2, o0, o1); 1.229 - UCX_TEST_ASSERT(n.ptr == NULL && n.length == 0, "overflow not detected"); 1.230 - sstr_t n2 = sstrcat(3, o0, o2, o1); 1.231 - UCX_TEST_ASSERT(n2.ptr == NULL && n2.length == 0, "n2: overflow not detected"); 1.232 - 1.233 - UCX_TEST_END 1.234 - 1.235 -} 1.236 - 1.237 -UCX_TEST(test_sstrsplit) { 1.238 - 1.239 - const char *original = "this,is,a,csv,string"; 1.240 - sstr_t test = ST("this,is,a,csv,string"); /* use copy of original here */ 1.241 - ssize_t n; 1.242 - sstr_t *list; 1.243 - 1.244 - UCX_TEST_BEGIN 1.245 - 1.246 - /* Nullpointer check */ 1.247 - n = 0; 1.248 - UCX_TEST_ASSERT(sstrsplit(test, S(""), &n) == NULL, 1.249 - "empty delimiter must return NULL"); 1.250 - 1.251 - /* no delimiter occurence (ndo) */ 1.252 - n = 0; 1.253 - list = sstrsplit(test, S("z"), &n); 1.254 - UCX_TEST_ASSERT(n == 1, "ndo, list length must be 1"); 1.255 - UCX_TEST_ASSERT(strcmp(list[0].ptr, original) == 0, "ndo, " 1.256 - "original string shall be returned as single list element"); 1.257 - UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0, 1.258 - "ndo, original has been modified"); 1.259 - for(int i=0;i<n;i++) { 1.260 - free(list[i].ptr); 1.261 - } 1.262 - free(list); 1.263 - 1.264 - /* partially matching delimiter (pmd) */ 1.265 - n = 0; 1.266 - list = sstrsplit(test, S("stringbuilder"), &n); 1.267 - UCX_TEST_ASSERT(n == 1, "pmd, list length must be 1"); 1.268 - UCX_TEST_ASSERT(strcmp(list[0].ptr, original) == 0, "pmd, " 1.269 - "original string shall be returned as single list element"); 1.270 - UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0, 1.271 - "pmd, original has been modified"); 1.272 - for(int i=0;i<n;i++) { 1.273 - free(list[i].ptr); 1.274 - } 1.275 - free(list); 1.276 - 1.277 - /* matching single-char delimiter (mscd) */ 1.278 - n = 0; 1.279 - list = sstrsplit(test, S(","), &n); 1.280 - UCX_TEST_ASSERT(n == 5, "mscd, list length must be 5"); 1.281 - UCX_TEST_ASSERT(strcmp(list[0].ptr, "this") == 0, "mscd, item 0 mismatch"); 1.282 - UCX_TEST_ASSERT(strcmp(list[1].ptr, "is") == 0, "mscd, item 1 mismatch"); 1.283 - UCX_TEST_ASSERT(strcmp(list[2].ptr, "a") == 0, "mscd, item 2 mismatch"); 1.284 - UCX_TEST_ASSERT(strcmp(list[3].ptr, "csv") == 0, "mscd, item 3 mismatch"); 1.285 - UCX_TEST_ASSERT(strcmp(list[4].ptr, "string")==0, "mscd, item 4 mismatch"); 1.286 - UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0, 1.287 - "mscd, original has been modified"); 1.288 - for(int i=0;i<n;i++) { 1.289 - free(list[i].ptr); 1.290 - } 1.291 - free(list); 1.292 - 1.293 - /* matching multi-char delimiter (mmcd) */ 1.294 - n = 0; 1.295 - list = sstrsplit(test, S("is"), &n); 1.296 - UCX_TEST_ASSERT(n == 3, "mscd, list length must be 3"); 1.297 - UCX_TEST_ASSERT(strcmp(list[0].ptr, "th") == 0, "mmcd, item 0 mismatch"); 1.298 - UCX_TEST_ASSERT(strcmp(list[1].ptr, ",") == 0, "mmcd, item 1 mismatch"); 1.299 - UCX_TEST_ASSERT(strcmp(list[2].ptr, ",a,csv,string") == 0, 1.300 - "mmcd, item 2 mismatch"); 1.301 - UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0, 1.302 - "mmcd, original has been modified"); 1.303 - for(int i=0;i<n;i++) { 1.304 - free(list[i].ptr); 1.305 - } 1.306 - free(list); 1.307 - 1.308 - /* bounded list using single-char delimiter (blsc) */ 1.309 - n = 3; 1.310 - list = sstrsplit(test, S(","), &n); 1.311 - UCX_TEST_ASSERT(n == 3, "blsc, list length must be 3"); 1.312 - UCX_TEST_ASSERT(strcmp(list[0].ptr, "this") == 0, "blsc, item 0 mismatch"); 1.313 - UCX_TEST_ASSERT(strcmp(list[1].ptr, "is") == 0, "blsc, item 1 mismatch"); 1.314 - UCX_TEST_ASSERT(strcmp(list[2].ptr, "a,csv,string") == 0, 1.315 - "blsc, item 2 mismatch"); 1.316 - UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0, 1.317 - "blsc, original has been modified"); 1.318 - for(int i=0;i<n;i++) { 1.319 - free(list[i].ptr); 1.320 - } 1.321 - free(list); 1.322 - 1.323 - /* bounded list using multi-char delimiter (blmc) */ 1.324 - n = 2; 1.325 - list = sstrsplit(test, S("is"), &n); 1.326 - UCX_TEST_ASSERT(n == 2, "blmc, list length must be 2"); 1.327 - UCX_TEST_ASSERT(strcmp(list[0].ptr, "th") == 0, "blmc, item 0 mismatch"); 1.328 - UCX_TEST_ASSERT(strcmp(list[1].ptr, ",is,a,csv,string") == 0, 1.329 - "blmc, item 1 mismatch"); 1.330 - UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0, 1.331 - "blmc, original has been modified"); 1.332 - for(int i=0;i<n;i++) { 1.333 - free(list[i].ptr); 1.334 - } 1.335 - free(list); 1.336 - 1.337 - /* start with delimiter (swd) */ 1.338 - n = 0; 1.339 - list = sstrsplit(test, S("this"), &n); 1.340 - UCX_TEST_ASSERT(n == 2, "swd, list length must be 2"); 1.341 - UCX_TEST_ASSERT(list[0].length == 0, "swd, first item must be empty"); 1.342 - UCX_TEST_ASSERT(strcmp(list[1].ptr, ",is,a,csv,string") == 0, 1.343 - "swd, second item corrupt"); 1.344 - UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0, 1.345 - "swd, original has been modified"); 1.346 - for(int i=0;i<n;i++) { 1.347 - free(list[i].ptr); 1.348 - } 1.349 - free(list); 1.350 - 1.351 - /* end with delimiter (ewd) */ 1.352 - n = 0; 1.353 - list = sstrsplit(test, S("string"), &n); 1.354 - UCX_TEST_ASSERT(n == 2, "ewd, list length must be 2"); 1.355 - UCX_TEST_ASSERT(strcmp(list[0].ptr, "this,is,a,csv,") == 0, 1.356 - "ewd, first item corrupt"); 1.357 - UCX_TEST_ASSERT(list[1].length == 0, "ewd, second item must be empty"); 1.358 - UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0, 1.359 - "ewd, original has been modified"); 1.360 - for(int i=0;i<n;i++) { 1.361 - free(list[i].ptr); 1.362 - } 1.363 - free(list); 1.364 - 1.365 - /* end with delimiter exceed bound (ewdeb) */ 1.366 - n = 3; 1.367 - sstr_t ewdebtest = ST("a,b,c,"); 1.368 - list = sstrsplit(ewdebtest, S(","), &n); 1.369 - UCX_TEST_ASSERT(n == 3, "ewdeb, list length must be 3"); 1.370 - UCX_TEST_ASSERT(strcmp(list[0].ptr, "a") == 0, "ewdeb, fst item corrupt"); 1.371 - UCX_TEST_ASSERT(strcmp(list[1].ptr, "b") == 0, "ewdeb, snd item corrupt"); 1.372 - UCX_TEST_ASSERT(strcmp(list[2].ptr, "c,") == 0, "ewdeb, trd item corrupt"); 1.373 - for(int i=0;i<n;i++) { 1.374 - free(list[i].ptr); 1.375 - } 1.376 - free(list); 1.377 - 1.378 - /* exact match (exm) */ 1.379 - n = 0; 1.380 - list = sstrsplit(test, S("this,is,a,csv,string"), &n); 1.381 - UCX_TEST_ASSERT(n == 0, "exm, list length must be 0"); 1.382 - UCX_TEST_ASSERT(list == NULL, "exm, list must be NULL"); 1.383 - for(int i=0;i<n;i++) { 1.384 - free(list[i].ptr); 1.385 - } 1.386 - free(list); 1.387 - 1.388 - /* substring (subs) */ 1.389 - n = 0; 1.390 - list = sstrsplit(test, S("this,is,a,csv,string,with,extension"), &n); 1.391 - UCX_TEST_ASSERT(n == 1, "subs, list length must be 1"); 1.392 - UCX_TEST_ASSERT(strcmp(list[0].ptr, original) == 0, 1.393 - "subs, single item must be the original string"); 1.394 - UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0, 1.395 - "subs, original has been modified"); 1.396 - for(int i=0;i<n;i++) { 1.397 - free(list[i].ptr); 1.398 - } 1.399 - free(list); 1.400 - 1.401 - /* double encounter delimiter (ded) */ 1.402 - n = 0; 1.403 - list = sstrsplit(test, S("is,"), &n); 1.404 - UCX_TEST_ASSERT(n == 3, "ded, list length must be 3"); 1.405 - UCX_TEST_ASSERT(strcmp(list[0].ptr, "th") == 0, "ded, item 0 mismatch"); 1.406 - UCX_TEST_ASSERT(list[1].length == 0, "ded, item 1 not empty!"); 1.407 - UCX_TEST_ASSERT(strcmp(list[2].ptr, "a,csv,string") == 0, 1.408 - "ded, item 2 mismatch"); 1.409 - for(int i=0;i<n;i++) { 1.410 - free(list[i].ptr); 1.411 - } 1.412 - free(list); 1.413 - 1.414 - UCX_TEST_END 1.415 -} 1.416 - 1.417 -UCX_TEST(test_sstrtrim) { 1.418 - sstr_t t1 = sstrtrim(sstr((char*)" ein test ")); 1.419 - sstr_t t2 = sstrtrim(sstr((char*)"abc")); 1.420 - sstr_t t3 = sstrtrim(sstr((char*)" 123")); 1.421 - sstr_t t4 = sstrtrim(sstr((char*)"xyz ")); 1.422 - sstr_t t5 = sstrtrim(sstr((char*)" ")); 1.423 - sstr_t empty = sstrtrim(sstr((char*)"")); 1.424 - UCX_TEST_BEGIN 1.425 - UCX_TEST_ASSERT(strncmp(t1.ptr, "ein test", t1.length) == 0, "failed"); 1.426 - UCX_TEST_ASSERT(strncmp(t2.ptr, "abc", t2.length) == 0, "failed"); 1.427 - UCX_TEST_ASSERT(strncmp(t3.ptr, "123", t3.length) == 0, "failed"); 1.428 - UCX_TEST_ASSERT(strncmp(t4.ptr, "xyz", t4.length) == 0, "failed"); 1.429 - UCX_TEST_ASSERT(t5.length == 0, "string t5 not empty"); 1.430 - UCX_TEST_ASSERT(empty.length == 0, "empty string failed"); 1.431 - UCX_TEST_END 1.432 -} 1.433 - 1.434 -UCX_TEST(test_sstrprefixsuffix) { 1.435 - sstr_t str = ST("test my prefix and my suffix"); 1.436 - sstr_t empty = ST(""); 1.437 - 1.438 - UCX_TEST_BEGIN 1.439 - 1.440 - UCX_TEST_ASSERT(!sstrprefix(empty, S("pref")), "prefix empty string fails"); 1.441 - UCX_TEST_ASSERT(!sstrsuffix(empty, S("suf")), "suffix empty string fails"); 1.442 - 1.443 - UCX_TEST_ASSERT(sstrprefix(str, empty), "empty prefix fails"); 1.444 - UCX_TEST_ASSERT(sstrsuffix(str, empty), "empty suffix fails"); 1.445 - 1.446 - UCX_TEST_ASSERT(sstrprefix(empty, empty), "string and prefix empty fails"); 1.447 - UCX_TEST_ASSERT(sstrsuffix(empty, empty), "string and suffix empty fails"); 1.448 - 1.449 - UCX_TEST_ASSERT(sstrprefix(str, S("test ")), "prefix false negative"); 1.450 - UCX_TEST_ASSERT(!sstrprefix(str, S("8-) fsck ")), "prefix false positive"); 1.451 - 1.452 - UCX_TEST_ASSERT(sstrsuffix(str, S("fix")), "suffix false negative"); 1.453 - UCX_TEST_ASSERT(!sstrsuffix(str, S("fox")), "suffix false positive"); 1.454 - 1.455 - 1.456 - UCX_TEST_END 1.457 -} 1.458 - 1.459 -UCX_TEST(test_sstrcaseprefixsuffix) { 1.460 - sstr_t str = ST("test my prefix and my suffix"); 1.461 - sstr_t empty = ST(""); 1.462 - 1.463 - UCX_TEST_BEGIN 1.464 - 1.465 - UCX_TEST_ASSERT(!sstrcaseprefix(empty, S("pREf")), "prefix empty string fails"); 1.466 - UCX_TEST_ASSERT(!sstrcasesuffix(empty, S("sUf")), "suffix empty string fails"); 1.467 - 1.468 - UCX_TEST_ASSERT(sstrcaseprefix(str, empty), "empty prefix fails"); 1.469 - UCX_TEST_ASSERT(sstrcasesuffix(str, empty), "empty suffix fails"); 1.470 - 1.471 - UCX_TEST_ASSERT(sstrcaseprefix(empty, empty), "string and prefix empty fails"); 1.472 - UCX_TEST_ASSERT(sstrcasesuffix(empty, empty), "string and suffix empty fails"); 1.473 - 1.474 - UCX_TEST_ASSERT(sstrcaseprefix(str, S("TEST ")), "prefix false negative"); 1.475 - UCX_TEST_ASSERT(!sstrcaseprefix(str, S("8-) fsck ")), "prefix false positive"); 1.476 - 1.477 - UCX_TEST_ASSERT(sstrcasesuffix(str, S("FIX")), "suffix false negative"); 1.478 - UCX_TEST_ASSERT(!sstrcasesuffix(str, S("fox")), "suffix false positive"); 1.479 - 1.480 - UCX_TEST_END 1.481 -} 1.482 - 1.483 -UCX_TEST(test_sstrreplace) { 1.484 - 1.485 - sstr_t str = ST("test ababab string aba"); 1.486 - sstr_t longstr = ST("xyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacd"); 1.487 - sstr_t notrail = ST("test abab"); 1.488 - sstr_t empty = ST(""); 1.489 - sstr_t astr = ST("aaaaaaaaaa"); 1.490 - sstr_t csstr = ST("test AB ab TEST xyz"); 1.491 - 1.492 - sstr_t repl = sstrreplace(str, SC("abab"), SC("muchlonger")); 1.493 - sstr_t expected = ST("test muchlongerab string aba"); 1.494 - 1.495 - sstr_t repln = sstrreplacen(str, SC("ab"), SC("c"), 2); 1.496 - sstr_t expectedn = ST("test ccab string aba"); 1.497 - 1.498 - sstr_t longrepl = sstrreplace(longstr, SC("a"), SC("z")); 1.499 - sstr_t longexpect = ST("xyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzcd"); 1.500 - 1.501 - sstr_t replnotrail = sstrreplace(notrail, SC("ab"), SC("z")); 1.502 - sstr_t notrailexpect = ST("test zz"); 1.503 - 1.504 - sstr_t repleq = sstrreplace(str, str, SC("hello")); 1.505 - sstr_t eqexpect = ST("hello"); 1.506 - 1.507 - sstr_t replempty1 = sstrreplace(empty, SC("ab"), SC("c")); // expect: empty 1.508 - sstr_t replempty2 = sstrreplace(str, SC("abab"), empty); 1.509 - sstr_t emptyexpect2 = ST("test ab string aba"); 1.510 - 1.511 - sstr_t replpre = sstrreplace(str, SC("test "), SC("TEST ")); 1.512 - sstr_t preexpected = ST("TEST ababab string aba"); 1.513 - 1.514 - sstr_t replan1 = sstrreplacen(astr, SC("a"), SC("x"), 1); 1.515 - sstr_t an1expected = ST("xaaaaaaaaa"); 1.516 - 1.517 - sstr_t replan4 = sstrreplacen(astr, SC("a"), SC("x"), 4); 1.518 - sstr_t an4expected = ST("xxxxaaaaaa"); 1.519 - 1.520 - sstr_t replan9 = sstrreplacen(astr, SC("a"), SC("x"), 9); 1.521 - sstr_t an9expected = ST("xxxxxxxxxa"); 1.522 - 1.523 - sstr_t replan10 = sstrreplacen(astr, SC("a"), SC("x"), 10); 1.524 - sstr_t an10expected = ST("xxxxxxxxxx"); 1.525 - 1.526 - sstr_t replcs1 = sstrreplace(csstr, SC("AB"), SC("*")); 1.527 - sstr_t cs1expected = ST("test * ab TEST xyz"); 1.528 - 1.529 - sstr_t replcs2 = sstrreplace(csstr, SC("test"), SC("TEST")); 1.530 - sstr_t cs2expected = ST("TEST AB ab TEST xyz"); 1.531 - 1.532 - UCX_TEST_BEGIN 1.533 - 1.534 - UCX_TEST_ASSERT(repl.ptr != str.ptr, "result string is not fresh"); 1.535 - UCX_TEST_ASSERT(!sstrcmp(repl, expected), "incorrect replacement"); 1.536 - 1.537 - UCX_TEST_ASSERT(repln.ptr != str.ptr, "result string is not fresh"); 1.538 - UCX_TEST_ASSERT(!sstrcmp(repln, expectedn), "incorrect replacement"); 1.539 - 1.540 - UCX_TEST_ASSERT(!sstrcmp(longrepl, longexpect), 1.541 - "incorrect handling of long strings"); 1.542 - 1.543 - UCX_TEST_ASSERT(!sstrcmp(replnotrail, notrailexpect), 1.544 - "no trail replacement fails"); 1.545 - 1.546 - UCX_TEST_ASSERT(!sstrcmp(repleq, eqexpect), 1.547 - "equal replacement fails"); 1.548 - 1.549 - UCX_TEST_ASSERT(!sstrcmp(replempty1, empty), 1.550 - "replacement in empty string fails"); 1.551 - 1.552 - UCX_TEST_ASSERT(!sstrcmp(replempty2, emptyexpect2), 1.553 - "empty replacement fails"); 1.554 - 1.555 - UCX_TEST_ASSERT(!sstrcmp(replpre, preexpected), 1.556 - "prefix replacement fails"); 1.557 - 1.558 - UCX_TEST_ASSERT(!sstrcmp(replan1, an1expected), 1.559 - "a1 replacement fails"); 1.560 - 1.561 - UCX_TEST_ASSERT(!sstrcmp(replan4, an4expected), 1.562 - "a4 replacement fails"); 1.563 - 1.564 - UCX_TEST_ASSERT(!sstrcmp(replan9, an9expected), 1.565 - "a9 replacement fails"); 1.566 - 1.567 - UCX_TEST_ASSERT(!sstrcmp(replan10, an10expected), 1.568 - "a10 replacement fails"); 1.569 - 1.570 - UCX_TEST_ASSERT(!sstrcmp(replcs1, cs1expected), 1.571 - "case sensitivity test1 fails"); 1.572 - 1.573 - UCX_TEST_ASSERT(!sstrcmp(replcs2, cs2expected), 1.574 - "case sensitivity test2 fails"); 1.575 - 1.576 - UCX_TEST_END 1.577 - 1.578 - free(repl.ptr); 1.579 - free(repln.ptr); 1.580 - free(longrepl.ptr); 1.581 - free(replnotrail.ptr); 1.582 - free(repleq.ptr); 1.583 - if(replempty1.ptr) free(replempty1.ptr); 1.584 - free(replempty2.ptr); 1.585 - free(replpre.ptr); 1.586 - free(replan1.ptr); 1.587 - free(replan4.ptr); 1.588 - free(replan9.ptr); 1.589 - free(replan10.ptr); 1.590 - free(replcs1.ptr); 1.591 - free(replcs2.ptr); 1.592 -}