Tue, 20 Sep 2022 10:36:04 +0200
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 | } |