test/test_string.cpp

Tue, 20 Sep 2022 10:30:54 +0200

author
Mike Becker <universe@uap-core.de>
date
Tue, 20 Sep 2022 10:30:54 +0200
changeset 586
aa51aaa907b9
parent 585
038f5e99e00f
child 587
3dd55e246d2d
permissions
-rw-r--r--

add tests for strupper and strlower

     1 /*
     2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
     3  *
     4  * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
     5  *
     6  * Redistribution and use in source and binary forms, with or without
     7  * modification, are permitted provided that the following conditions are met:
     8  *
     9  *   1. Redistributions of source code must retain the above copyright
    10  *      notice, this list of conditions and the following disclaimer.
    11  *
    12  *   2. Redistributions in binary form must reproduce the above copyright
    13  *      notice, this list of conditions and the following disclaimer in the
    14  *      documentation and/or other materials provided with the distribution.
    15  *
    16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    19  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
    20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    26  * POSSIBILITY OF SUCH DAMAGE.
    27  */
    29 #include "cx/string.h"
    30 #include "util_allocator.h"
    32 #include <gtest/gtest.h>
    34 TEST(String, construct) {
    35     cxstring s1 = cx_str("1234");
    36     cxstring s2 = cx_strn("abcd", 2);
    37     cxmutstr s3 = cx_mutstr((char *) "1234");
    38     cxmutstr s4 = cx_mutstrn((char *) "abcd", 2);
    40     EXPECT_EQ(s1.length, 4);
    41     EXPECT_EQ(s2.length, 2);
    42     EXPECT_EQ(s3.length, 4);
    43     EXPECT_EQ(s4.length, 2);
    44 }
    46 TEST(String, strfree) {
    47     CxTestingAllocator alloc;
    48     auto test = (char *) cxMalloc(&alloc, 16);
    49     cxmutstr str = cx_mutstrn(test, 16);
    50     ASSERT_EQ(str.ptr, test);
    51     EXPECT_EQ(str.length, 16);
    52     cx_strfree_a(&alloc, &str);
    53     EXPECT_EQ(str.ptr, nullptr);
    54     EXPECT_EQ(str.length, 0);
    55     EXPECT_TRUE(alloc.verify());
    56 }
    58 TEST(String, strlen) {
    59     cxstring s1 = CX_STR("1234");
    60     cxstring s2 = CX_STR(".:.:.");
    61     cxstring s3 = CX_STR("X");
    63     size_t len0 = cx_strlen(0);
    64     size_t len1 = cx_strlen(1, s1);
    65     size_t len2 = cx_strlen(2, s1, s2);
    66     size_t len3 = cx_strlen(3, s1, s2, s3);
    68     EXPECT_EQ(len0, 0);
    69     EXPECT_EQ(len1, 4);
    70     EXPECT_EQ(len2, 9);
    71     EXPECT_EQ(len3, 10);
    72 }
    74 TEST(String, strsubs) {
    75     cxstring str = CX_STR("A test string");
    77     cxstring sub = cx_strsubs(str, 0);
    78     EXPECT_EQ(cx_strcmp(sub, str), 0);
    80     sub = cx_strsubs(str, 2);
    81     EXPECT_EQ(cx_strcmp(sub, cx_str("test string")), 0);
    83     sub = cx_strsubs(str, 7);
    84     EXPECT_EQ(cx_strcmp(sub, cx_str("string")), 0);
    86     sub = cx_strsubs(str, 15);
    87     EXPECT_EQ(cx_strcmp(sub, cx_str("")), 0);
    89     sub = cx_strsubsl(str, 2, 4);
    90     EXPECT_EQ(cx_strcmp(sub, cx_str("test")), 0);
    92     sub = cx_strsubsl(str, 7, 3);
    93     EXPECT_EQ(cx_strcmp(sub, cx_str("str")), 0);
    95     sub = cx_strsubsl(str, 7, 20);
    96     EXPECT_EQ(cx_strcmp(sub, cx_str("string")), 0);
    98     // just for coverage, call the _m variant
    99     auto m = cx_strsubs_m(cx_mutstrn(nullptr, 0), 0);
   100     EXPECT_EQ(cx_strcmp(cx_strcast(m), cx_str("")), 0);
   101 }
   103 TEST(String, strchr) {
   104     cxstring str = CX_STR("I will find you - and I will kill you");
   106     cxstring notfound = cx_strchr(str, 'x');
   107     EXPECT_EQ(notfound.length, 0);
   109     cxstring result = cx_strchr(str, 'w');
   110     EXPECT_EQ(result.length, 35);
   111     EXPECT_EQ(strcmp("will find you - and I will kill you", result.ptr), 0);
   113     // just for coverage, call the _m variant
   114     auto m = cx_strchr_m(cx_mutstrn(nullptr, 0), 'a');
   115     EXPECT_EQ(cx_strcmp(cx_strcast(m), cx_str("")), 0);
   116 }
   118 TEST(String, strrchr) {
   119     cxstring str = CX_STR("I will find you - and I will kill you");
   121     cxstring notfound = cx_strrchr(str, 'x');
   122     EXPECT_EQ(notfound.length, 0);
   124     cxstring result = cx_strrchr(str, 'w');
   125     EXPECT_EQ(result.length, 13);
   126     EXPECT_EQ(strcmp("will kill you", result.ptr), 0);
   128     // just for coverage, call the _m variant
   129     auto m = cx_strrchr_m(cx_mutstrn(nullptr, 0), 'a');
   130     EXPECT_EQ(cx_strcmp(cx_strcast(m), cx_str("")), 0);
   131 }
   133 TEST(String, strstr) {
   134     cxstring str = CX_STR("find the match in this string");
   135     cxstring longstr = CX_STR(
   136             "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl"
   137             "mnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwx"
   138             "yzabcdeababababnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghij"
   139             "klmnopqrstuvwxyzaababababababababrstuvwxyzabcdefghijklmnopqrstuv"
   140             "abababababababababababababababababababababababababababababababab"
   141             "abababababababababababababababababababababababababababababababab"
   142             "abababababababababababababababababababababababababababababababab"
   143             "abababababababababababababababababababababababababababababababab"
   144             "abababababababababababababababababababababababababababababababab"
   145             "abababababababababababababababababababababababababababababababab"
   146             "wxyz1234567890");
   147     cxstring longstrpattern = CX_STR(
   148             "abababababababababababababababababababababababababababababababab"
   149             "abababababababababababababababababababababababababababababababab"
   150             "abababababababababababababababababababababababababababababababab"
   151             "abababababababababababababababababababababababababababababababab"
   152             "abababababababababababababababababababababababababababababababab"
   153     );
   154     cxstring longstrresult = CX_STR(
   155             "abababababababababababababababababababababababababababababababab"
   156             "abababababababababababababababababababababababababababababababab"
   157             "abababababababababababababababababababababababababababababababab"
   158             "abababababababababababababababababababababababababababababababab"
   159             "abababababababababababababababababababababababababababababababab"
   160             "abababababababababababababababababababababababababababababababab"
   161             "wxyz1234567890"
   162     );
   164     cxstring notfound = cx_strstr(str, cx_str("no match"));
   165     EXPECT_EQ(notfound.length, 0);
   167     cxstring result = cx_strstr(str, cx_str("match"));
   168     EXPECT_EQ(result.length, 20);
   169     EXPECT_EQ(strcmp("match in this string", result.ptr), 0);
   171     result = cx_strstr(str, cx_str(""));
   172     EXPECT_EQ(result.length, str.length);
   173     EXPECT_EQ(strcmp(str.ptr, result.ptr), 0);
   175     result = cx_strstr(longstr, longstrpattern);
   176     EXPECT_EQ(result.length, longstrresult.length);
   177     EXPECT_EQ(strcmp(result.ptr, longstrresult.ptr), 0);
   179     // just for coverage, call the _m variant
   180     auto mstr = cx_strdup(longstr);
   181     auto m = cx_strstr_m(mstr, longstrpattern);
   182     EXPECT_EQ(m.length, longstrresult.length);
   183     EXPECT_EQ(strcmp(m.ptr, longstrresult.ptr), 0);
   184     cx_strfree(&mstr);
   185 }
   187 TEST(String, strcmp) {
   188     cxstring str = CX_STR("compare this");
   190     EXPECT_EQ(cx_strcmp(CX_STR(""), CX_STR("")), 0);
   191     EXPECT_GT(cx_strcmp(str, CX_STR("")), 0);
   192     EXPECT_EQ(cx_strcmp(str, CX_STR("compare this")), 0);
   193     EXPECT_NE(cx_strcmp(str, CX_STR("Compare This")), 0);
   194     EXPECT_LT(cx_strcmp(str, CX_STR("compare tool")), 0);
   195     EXPECT_GT(cx_strcmp(str, CX_STR("compare shit")), 0);
   196     EXPECT_LT(cx_strcmp(str, CX_STR("compare this not")), 0);
   197     EXPECT_GT(cx_strcmp(str, CX_STR("compare")), 0);
   198 }
   200 TEST(String, strcasecmp) {
   201     cxstring str = CX_STR("compare this");
   203     EXPECT_EQ(cx_strcasecmp(CX_STR(""), CX_STR("")), 0);
   204     EXPECT_GT(cx_strcasecmp(str, CX_STR("")), 0);
   205     EXPECT_EQ(cx_strcasecmp(str, CX_STR("compare this")), 0);
   206     EXPECT_EQ(cx_strcasecmp(str, CX_STR("Compare This")), 0);
   207     EXPECT_LT(cx_strcasecmp(str, CX_STR("compare tool")), 0);
   208     EXPECT_GT(cx_strcasecmp(str, CX_STR("compare shit")), 0);
   209     EXPECT_LT(cx_strcasecmp(str, CX_STR("compare this not")), 0);
   210     EXPECT_GT(cx_strcasecmp(str, CX_STR("compare")), 0);
   211 }
   214 TEST(String, strcat) {
   215     cxstring s1 = CX_STR("12");
   216     cxstring s2 = CX_STR("34");
   217     cxstring s3 = CX_STR("56");
   218     cxstring sn = {nullptr, 0};
   220     CxTestingAllocator alloc;
   222     cxmutstr t1 = cx_strcat_a(&alloc, 2, s1, s2);
   223     EXPECT_EQ(cx_strcmp(cx_strcast(t1), CX_STR("1234")), 0);
   224     cx_strfree_a(&alloc, &t1);
   226     cxmutstr t2 = cx_strcat_a(&alloc, 3, s1, s2, s3);
   227     EXPECT_EQ(cx_strcmp(cx_strcast(t2), CX_STR("123456")), 0);
   228     cx_strfree_a(&alloc, &t2);
   230     cxmutstr t3 = cx_strcat_a(&alloc, 6, s1, sn, s2, sn, s3, sn);
   231     EXPECT_EQ(cx_strcmp(cx_strcast(t3), CX_STR("123456")), 0);
   232     cx_strfree_a(&alloc, &t3);
   234     cxmutstr t4 = cx_strcat_a(&alloc, 2, sn, sn);
   235     EXPECT_EQ(cx_strcmp(cx_strcast(t4), CX_STR("")), 0);
   236     cx_strfree_a(&alloc, &t4);
   238     EXPECT_TRUE(alloc.verify());
   239 }
   241 TEST(String, strsplit) {
   243     cxstring test = cx_str("this,is,a,csv,string");
   244     size_t capa = 8;
   245     cxstring list[8];
   246     size_t n;
   248     /* special case: empty string */
   249     n = cx_strsplit(test, cx_str(""), capa, list);
   250     ASSERT_EQ(n, 1);
   251     EXPECT_EQ(cx_strcmp(list[0], test), 0);
   253     /* no delimiter occurrence */
   254     n = cx_strsplit(test, cx_str("z"), capa, list);
   255     ASSERT_EQ(n, 1);
   256     EXPECT_EQ(cx_strcmp(list[0], test), 0);
   258     /* partially matching delimiter */
   259     n = cx_strsplit(test, cx_str("is,not"), capa, list);
   260     ASSERT_EQ(n, 1);
   261     EXPECT_EQ(cx_strcmp(list[0], test), 0);
   263     /* matching single-char delimiter */
   264     n = cx_strsplit(test, cx_str(","), capa, list);
   265     ASSERT_EQ(n, 5);
   266     EXPECT_EQ(cx_strcmp(list[0], cx_str("this")), 0);
   267     EXPECT_EQ(cx_strcmp(list[1], cx_str("is")), 0);
   268     EXPECT_EQ(cx_strcmp(list[2], cx_str("a")), 0);
   269     EXPECT_EQ(cx_strcmp(list[3], cx_str("csv")), 0);
   270     EXPECT_EQ(cx_strcmp(list[4], cx_str("string")), 0);
   272     /* matching multi-char delimiter */
   273     n = cx_strsplit(test, cx_str("is"), capa, list);
   274     ASSERT_EQ(n, 3);
   275     EXPECT_EQ(cx_strcmp(list[0], cx_str("th")), 0);
   276     EXPECT_EQ(cx_strcmp(list[1], cx_str(",")), 0);
   277     EXPECT_EQ(cx_strcmp(list[2], cx_str(",a,csv,string")), 0);
   279     /* bounded list using single-char delimiter */
   280     n = cx_strsplit(test, cx_str(","), 3, list);
   281     ASSERT_EQ(n, 3);
   282     EXPECT_EQ(cx_strcmp(list[0], cx_str("this")), 0);
   283     EXPECT_EQ(cx_strcmp(list[1], cx_str("is")), 0);
   284     EXPECT_EQ(cx_strcmp(list[2], cx_str("a,csv,string")), 0);
   286     /* bounded list using multi-char delimiter */
   287     n = cx_strsplit(test, cx_str("is"), 2, list);
   288     ASSERT_EQ(n, 2);
   289     EXPECT_EQ(cx_strcmp(list[0], cx_str("th")), 0);
   290     EXPECT_EQ(cx_strcmp(list[1], cx_str(",is,a,csv,string")), 0);
   292     /* start with delimiter */
   293     n = cx_strsplit(test, cx_str("this"), capa, list);
   294     ASSERT_EQ(n, 2);
   295     EXPECT_EQ(cx_strcmp(list[0], cx_str("")), 0);
   296     EXPECT_EQ(cx_strcmp(list[1], cx_str(",is,a,csv,string")), 0);
   298     /* end with delimiter */
   299     n = cx_strsplit(test, cx_str("string"), capa, list);
   300     ASSERT_EQ(n, 2);
   301     EXPECT_EQ(cx_strcmp(list[0], cx_str("this,is,a,csv,")), 0);
   302     EXPECT_EQ(cx_strcmp(list[1], cx_str("")), 0);
   305     /* end with delimiter exceed bound */
   306     n = cx_strsplit(cx_str("a,b,c,"), cx_str(","), 3, list);
   307     ASSERT_EQ(n, 3);
   308     EXPECT_EQ(cx_strcmp(list[0], cx_str("a")), 0);
   309     EXPECT_EQ(cx_strcmp(list[1], cx_str("b")), 0);
   310     EXPECT_EQ(cx_strcmp(list[2], cx_str("c,")), 0);
   312     /* exact match */
   313     n = cx_strsplit(test, cx_str("this,is,a,csv,string"), capa, list);
   314     ASSERT_EQ(n, 2);
   315     EXPECT_EQ(cx_strcmp(list[0], cx_str("")), 0);
   316     EXPECT_EQ(cx_strcmp(list[1], cx_str("")), 0);
   318     /* string to be split is only substring */
   319     n = cx_strsplit(test, cx_str("this,is,a,csv,string,with,extension"), capa, list);
   320     ASSERT_EQ(n, 1);
   321     EXPECT_EQ(cx_strcmp(list[0], test), 0);
   323     /* subsequent encounter of delimiter (the string between is empty) */
   324     n = cx_strsplit(test, cx_str("is,"), capa, list);
   325     ASSERT_EQ(n, 3);
   326     EXPECT_EQ(cx_strcmp(list[0], cx_str("th")), 0);
   327     EXPECT_EQ(cx_strcmp(list[1], cx_str("")), 0);
   328     EXPECT_EQ(cx_strcmp(list[2], cx_str("a,csv,string")), 0);
   330     /* call the _m variant just for coverage */
   331     auto mtest = cx_strdup(test);
   332     cxmutstr mlist[4];
   333     n = cx_strsplit_m(mtest, cx_str("is,"), 4, mlist);
   334     ASSERT_EQ(n, 3);
   335     EXPECT_EQ(cx_strcmp(cx_strcast(mlist[0]), cx_str("th")), 0);
   336     EXPECT_EQ(cx_strcmp(cx_strcast(mlist[1]), cx_str("")), 0);
   337     EXPECT_EQ(cx_strcmp(cx_strcast(mlist[2]), cx_str("a,csv,string")), 0);
   338     cx_strfree(&mtest);
   339 }
   341 TEST(String, strsplit_a) {
   342     CxTestingAllocator alloc;
   344     cxstring test = cx_str("this,is,a,csv,string");
   345     size_t capa = 8;
   346     cxstring *list;
   347     size_t n;
   349     /* special case: empty string */
   350     n = cx_strsplit_a(&alloc, test, cx_str(""), capa, &list);
   351     ASSERT_EQ(n, 1);
   352     EXPECT_EQ(cx_strcmp(list[0], test), 0);
   353     cxFree(&alloc, list);
   355     /* no delimiter occurrence */
   356     n = cx_strsplit_a(&alloc, test, cx_str("z"), capa, &list);
   357     ASSERT_EQ(n, 1);
   358     EXPECT_EQ(cx_strcmp(list[0], test), 0);
   359     cxFree(&alloc, list);
   361     /* partially matching delimiter */
   362     n = cx_strsplit_a(&alloc, test, cx_str("is,not"), capa, &list);
   363     ASSERT_EQ(n, 1);
   364     EXPECT_EQ(cx_strcmp(list[0], test), 0);
   365     cxFree(&alloc, list);
   367     /* matching single-char delimiter */
   368     n = cx_strsplit_a(&alloc, test, cx_str(","), capa, &list);
   369     ASSERT_EQ(n, 5);
   370     EXPECT_EQ(cx_strcmp(list[0], cx_str("this")), 0);
   371     EXPECT_EQ(cx_strcmp(list[1], cx_str("is")), 0);
   372     EXPECT_EQ(cx_strcmp(list[2], cx_str("a")), 0);
   373     EXPECT_EQ(cx_strcmp(list[3], cx_str("csv")), 0);
   374     EXPECT_EQ(cx_strcmp(list[4], cx_str("string")), 0);
   375     cxFree(&alloc, list);
   377     /* matching multi-char delimiter */
   378     n = cx_strsplit_a(&alloc, test, cx_str("is"), capa, &list);
   379     ASSERT_EQ(n, 3);
   380     EXPECT_EQ(cx_strcmp(list[0], cx_str("th")), 0);
   381     EXPECT_EQ(cx_strcmp(list[1], cx_str(",")), 0);
   382     EXPECT_EQ(cx_strcmp(list[2], cx_str(",a,csv,string")), 0);
   383     cxFree(&alloc, list);
   385     /* bounded list using single-char delimiter */
   386     n = cx_strsplit_a(&alloc, test, cx_str(","), 3, &list);
   387     ASSERT_EQ(n, 3);
   388     EXPECT_EQ(cx_strcmp(list[0], cx_str("this")), 0);
   389     EXPECT_EQ(cx_strcmp(list[1], cx_str("is")), 0);
   390     EXPECT_EQ(cx_strcmp(list[2], cx_str("a,csv,string")), 0);
   391     cxFree(&alloc, list);
   393     /* bounded list using multi-char delimiter */
   394     n = cx_strsplit_a(&alloc, test, cx_str("is"), 2, &list);
   395     ASSERT_EQ(n, 2);
   396     EXPECT_EQ(cx_strcmp(list[0], cx_str("th")), 0);
   397     EXPECT_EQ(cx_strcmp(list[1], cx_str(",is,a,csv,string")), 0);
   398     cxFree(&alloc, list);
   400     /* start with delimiter */
   401     n = cx_strsplit_a(&alloc, test, cx_str("this"), capa, &list);
   402     ASSERT_EQ(n, 2);
   403     EXPECT_EQ(cx_strcmp(list[0], cx_str("")), 0);
   404     EXPECT_EQ(cx_strcmp(list[1], cx_str(",is,a,csv,string")), 0);
   405     cxFree(&alloc, list);
   407     /* end with delimiter */
   408     n = cx_strsplit_a(&alloc, test, cx_str("string"), capa, &list);
   409     ASSERT_EQ(n, 2);
   410     EXPECT_EQ(cx_strcmp(list[0], cx_str("this,is,a,csv,")), 0);
   411     EXPECT_EQ(cx_strcmp(list[1], cx_str("")), 0);
   412     cxFree(&alloc, list);
   414     /* end with delimiter exceed bound */
   415     n = cx_strsplit_a(&alloc, cx_str("a,b,c,"), cx_str(","), 3, &list);
   416     ASSERT_EQ(n, 3);
   417     EXPECT_EQ(cx_strcmp(list[0], cx_str("a")), 0);
   418     EXPECT_EQ(cx_strcmp(list[1], cx_str("b")), 0);
   419     EXPECT_EQ(cx_strcmp(list[2], cx_str("c,")), 0);
   420     cxFree(&alloc, list);
   422     /* exact match */
   423     n = cx_strsplit_a(&alloc, test, cx_str("this,is,a,csv,string"), capa, &list);
   424     ASSERT_EQ(n, 2);
   425     EXPECT_EQ(cx_strcmp(list[0], cx_str("")), 0);
   426     EXPECT_EQ(cx_strcmp(list[1], cx_str("")), 0);
   427     cxFree(&alloc, list);
   429     /* string to be split is only substring */
   430     n = cx_strsplit_a(&alloc, test, cx_str("this,is,a,csv,string,with,extension"), capa, &list);
   431     ASSERT_EQ(n, 1);
   432     EXPECT_EQ(cx_strcmp(list[0], test), 0);
   433     cxFree(&alloc, list);
   435     /* subsequent encounter of delimiter (the string between is empty) */
   436     n = cx_strsplit_a(&alloc, test, cx_str("is,"), capa, &list);
   437     ASSERT_EQ(n, 3);
   438     EXPECT_EQ(cx_strcmp(list[0], cx_str("th")), 0);
   439     EXPECT_EQ(cx_strcmp(list[1], cx_str("")), 0);
   440     EXPECT_EQ(cx_strcmp(list[2], cx_str("a,csv,string")), 0);
   441     cxFree(&alloc, list);
   443     /* call the _m variant just for coverage */
   444     auto mtest = cx_strdup(test);
   445     cxmutstr *mlist;
   446     n = cx_strsplit_ma(&alloc, mtest, cx_str("is,"), 4, &mlist);
   447     ASSERT_EQ(n, 3);
   448     EXPECT_EQ(cx_strcmp(cx_strcast(mlist[0]), cx_str("th")), 0);
   449     EXPECT_EQ(cx_strcmp(cx_strcast(mlist[1]), cx_str("")), 0);
   450     EXPECT_EQ(cx_strcmp(cx_strcast(mlist[2]), cx_str("a,csv,string")), 0);
   451     cxFree(&alloc, mlist);
   452     cx_strfree(&mtest);
   454     EXPECT_TRUE(alloc.verify());
   455 }
   457 TEST(String, strtrim) {
   458     cxstring t1 = cx_strtrim(cx_str("  ein test  \t "));
   459     cxstring t2 = cx_strtrim(cx_str("abc"));
   460     cxstring t3 = cx_strtrim(cx_str(" 123"));
   461     cxstring t4 = cx_strtrim(cx_str("xyz "));
   462     cxstring t5 = cx_strtrim(cx_str("   "));
   463     cxstring empty = cx_strtrim(cx_str(""));
   465     EXPECT_EQ(cx_strcmp(t1, cx_str("ein test")), 0);
   466     EXPECT_EQ(cx_strcmp(t2, cx_str("abc")), 0);
   467     EXPECT_EQ(cx_strcmp(t3, cx_str("123")), 0);
   468     EXPECT_EQ(cx_strcmp(t4, cx_str("xyz")), 0);
   469     EXPECT_EQ(cx_strcmp(t5, cx_str("")), 0);
   470     EXPECT_EQ(cx_strcmp(empty, cx_str("")), 0);
   472     /* call the _m variant just for coverage */
   473     cxmutstr m1 = cx_strtrim_m(cx_mutstr((char *) "  ein test  \t "));
   474     EXPECT_EQ(cx_strcmp(cx_strcast(m1), cx_str("ein test")), 0);
   475 }
   477 TEST(String, strprefix) {
   478     cxstring str = CX_STR("test my prefix and my suffix");
   479     cxstring empty = CX_STR("");
   480     EXPECT_FALSE(cx_strprefix(empty, cx_str("pref")));
   481     EXPECT_TRUE(cx_strprefix(str, empty));
   482     EXPECT_TRUE(cx_strprefix(empty, empty));
   483     EXPECT_TRUE(cx_strprefix(str, cx_str("test ")));
   484     EXPECT_FALSE(cx_strprefix(str, cx_str("8-) fsck ")));
   485 }
   487 TEST(String, strsuffix) {
   488     cxstring str = CX_STR("test my prefix and my suffix");
   489     cxstring empty = CX_STR("");
   490     EXPECT_FALSE(cx_strsuffix(empty, cx_str("suf")));
   491     EXPECT_TRUE(cx_strsuffix(str, empty));
   492     EXPECT_TRUE(cx_strsuffix(empty, empty));
   493     EXPECT_TRUE(cx_strsuffix(str, cx_str("fix")));
   494     EXPECT_FALSE(cx_strsuffix(str, cx_str("fox")));
   495 }
   497 TEST(String, strcaseprefix) {
   498     cxstring str = CX_STR("test my prefix and my suffix");
   499     cxstring empty = CX_STR("");
   500     EXPECT_FALSE(cx_strcaseprefix(empty, cx_str("pREf")));
   501     EXPECT_TRUE(cx_strcaseprefix(str, empty));
   502     EXPECT_TRUE(cx_strcaseprefix(empty, empty));
   503     EXPECT_TRUE(cx_strcaseprefix(str, cx_str("TEST ")));
   504     EXPECT_FALSE(cx_strcaseprefix(str, cx_str("8-) fsck ")));
   505 }
   507 TEST(String, strcasesuffix) {
   508     cxstring str = CX_STR("test my prefix and my suffix");
   509     cxstring empty = CX_STR("");
   510     EXPECT_FALSE(cx_strcasesuffix(empty, cx_str("sUf")));
   511     EXPECT_TRUE(cx_strcasesuffix(str, empty));
   512     EXPECT_TRUE(cx_strcasesuffix(empty, empty));
   513     EXPECT_TRUE(cx_strcasesuffix(str, cx_str("FIX")));
   514     EXPECT_FALSE(cx_strcasesuffix(str, cx_str("fox")));
   515 }
   517 TEST(String, strreplace) {
   518     cxstring str = CX_STR("test ababab string aba");
   519     cxstring longstr = CX_STR(
   520             "xyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacd");
   521     cxstring notrail = CX_STR("test abab");
   522     cxstring empty = CX_STR("");
   523     cxstring astr = CX_STR("aaaaaaaaaa");
   524     cxstring csstr = CX_STR("test AB ab TEST xyz");
   526     cxmutstr repl = cx_strreplace(str, cx_str("abab"), cx_str("muchlonger"));
   527     cxstring expected = CX_STR("test muchlongerab string aba");
   529     cxmutstr repln = cx_strreplacen(str, cx_str("ab"), cx_str("c"), 2);
   530     cxstring expectedn = CX_STR("test ccab string aba");
   532     cxmutstr longrepl = cx_strreplace(longstr, cx_str("a"), cx_str("z"));
   533     cxstring longexpect = CX_STR(
   534             "xyzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzcd");
   536     cxmutstr replnotrail = cx_strreplace(notrail, cx_str("ab"), cx_str("z"));
   537     cxstring notrailexpect = CX_STR("test zz");
   539     cxmutstr repleq = cx_strreplace(str, str, cx_str("hello"));
   540     cxstring eqexpect = CX_STR("hello");
   542     cxmutstr replempty1 = cx_strreplace(empty, cx_str("ab"), cx_str("c")); // expect: empty
   543     cxmutstr replempty2 = cx_strreplace(str, cx_str("abab"), empty);
   544     cxstring emptyexpect2 = CX_STR("test ab string aba");
   546     cxmutstr replpre = cx_strreplace(str, cx_str("test "), cx_str("TEST "));
   547     cxstring preexpected = CX_STR("TEST ababab string aba");
   549     cxmutstr replan1 = cx_strreplacen(astr, cx_str("a"), cx_str("x"), 1);
   550     cxstring an1expected = CX_STR("xaaaaaaaaa");
   552     cxmutstr replan4 = cx_strreplacen(astr, cx_str("a"), cx_str("x"), 4);
   553     cxstring an4expected = CX_STR("xxxxaaaaaa");
   555     cxmutstr replan9 = cx_strreplacen(astr, cx_str("a"), cx_str("x"), 9);
   556     cxstring an9expected = CX_STR("xxxxxxxxxa");
   558     cxmutstr replan10 = cx_strreplacen(astr, cx_str("a"), cx_str("x"), 10);
   559     cxstring an10expected = CX_STR("xxxxxxxxxx");
   561     cxmutstr replcs1 = cx_strreplace(csstr, cx_str("AB"), cx_str("*"));
   562     cxstring cs1expected = CX_STR("test * ab TEST xyz");
   564     cxmutstr replcs2 = cx_strreplace(csstr, cx_str("test"), cx_str("TEST"));
   565     cxstring cs2expected = CX_STR("TEST AB ab TEST xyz");
   568     EXPECT_NE(repl.ptr, str.ptr);
   569     EXPECT_EQ(cx_strcmp(cx_strcast(repl), expected), 0);
   570     EXPECT_NE(repln.ptr, str.ptr);
   571     EXPECT_EQ(cx_strcmp(cx_strcast(repln), expectedn), 0);
   572     EXPECT_EQ(cx_strcmp(cx_strcast(longrepl), longexpect), 0);
   573     EXPECT_EQ(cx_strcmp(cx_strcast(replnotrail), notrailexpect), 0);
   574     EXPECT_EQ(cx_strcmp(cx_strcast(repleq), eqexpect), 0);
   575     EXPECT_EQ(cx_strcmp(cx_strcast(replempty1), empty), 0);
   576     EXPECT_EQ(cx_strcmp(cx_strcast(replempty2), emptyexpect2), 0);
   577     EXPECT_EQ(cx_strcmp(cx_strcast(replpre), preexpected), 0);
   578     EXPECT_EQ(cx_strcmp(cx_strcast(replan1), an1expected), 0);
   579     EXPECT_EQ(cx_strcmp(cx_strcast(replan4), an4expected), 0);
   580     EXPECT_EQ(cx_strcmp(cx_strcast(replan9), an9expected), 0);
   581     EXPECT_EQ(cx_strcmp(cx_strcast(replan10), an10expected), 0);
   582     EXPECT_EQ(cx_strcmp(cx_strcast(replcs1), cs1expected), 0);
   583     EXPECT_EQ(cx_strcmp(cx_strcast(replcs2), cs2expected), 0);
   585     cx_strfree(&repl);
   586     cx_strfree(&repln);
   587     cx_strfree(&longrepl);
   588     cx_strfree(&replnotrail);
   589     cx_strfree(&repleq);
   590     cx_strfree(&replempty1);
   591     cx_strfree(&replempty2);
   592     cx_strfree(&replpre);
   593     cx_strfree(&replan1);
   594     cx_strfree(&replan4);
   595     cx_strfree(&replan9);
   596     cx_strfree(&replan10);
   597     cx_strfree(&replcs1);
   598     cx_strfree(&replcs2);
   599 }
   601 TEST(String, strupper) {
   602     cxmutstr str = cx_strdup(cx_str("thIs 1s @ Te$t"));
   603     cx_strupper(str);
   604     EXPECT_STREQ(str.ptr, "THIS 1S @ TE$T");
   605     cx_strfree(&str);
   606 }
   608 TEST(String, strlower) {
   609     cxmutstr str = cx_strdup(cx_str("thIs 1s @ Te$t"));
   610     cx_strlower(str);
   611     EXPECT_STREQ(str.ptr, "this 1s @ te$t");
   612     cx_strfree(&str);
   613 }

mercurial