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