universe@39: /* universe@103: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. universe@39: * universe@259: * Copyright 2017 Mike Becker, Olaf Wintermann All rights reserved. universe@103: * universe@103: * Redistribution and use in source and binary forms, with or without universe@103: * modification, are permitted provided that the following conditions are met: universe@103: * universe@103: * 1. Redistributions of source code must retain the above copyright universe@103: * notice, this list of conditions and the following disclaimer. universe@103: * universe@103: * 2. Redistributions in binary form must reproduce the above copyright universe@103: * notice, this list of conditions and the following disclaimer in the universe@103: * documentation and/or other materials provided with the distribution. universe@103: * universe@103: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" universe@103: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE universe@103: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE universe@103: * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE universe@103: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR universe@103: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF universe@103: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS universe@103: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN universe@103: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) universe@103: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE universe@103: * POSSIBILITY OF SUCH DAMAGE. universe@39: */ universe@39: universe@39: #include "string_tests.h" universe@39: universe@134: UCX_TEST(test_sstr) { universe@74: sstr_t s1 = sstr((char*)"1234"); universe@74: sstr_t s2 = sstrn((char*)"ab", 2); olaf@198: olaf@47: UCX_TEST_BEGIN olaf@47: olaf@47: UCX_TEST_ASSERT(s1.length == 4, "s1 length must be 4"); olaf@47: UCX_TEST_ASSERT(s2.length == 2, "s2 length must be 2"); olaf@47: olaf@47: UCX_TEST_END olaf@47: } olaf@47: universe@179: UCX_TEST(test_sstr_len) { universe@116: sstr_t s1 = ST("1234"); universe@116: sstr_t s2 = ST(".:.:."); universe@116: sstr_t s3 = ST("X"); olaf@47: olaf@184: size_t len1 = sstrnlen(1, s1); olaf@184: size_t len2 = sstrnlen(2, s1, s2); olaf@184: size_t len3 = sstrnlen(3, s1, s2, s3); olaf@47: olaf@47: UCX_TEST_BEGIN olaf@47: olaf@184: UCX_TEST_ASSERT(len1 == 4, "sstrnlen returned wrong size"); olaf@184: UCX_TEST_ASSERT(len2 == 9, "sstrnlen returned wrong size"); olaf@184: UCX_TEST_ASSERT(len3 == 10, "sstrnlen returned wrong size"); universe@179: olaf@47: UCX_TEST_END olaf@47: } olaf@47: olaf@180: universe@149: UCX_TEST(test_sstrchr_sstrrchr) { universe@148: sstr_t str = ST("I will find you - and I will kill you"); universe@148: UCX_TEST_BEGIN universe@148: olaf@184: sstr_t notfound = sstrchr(str, 'x'); olaf@184: UCX_TEST_ASSERT(notfound.length == 0, "string length not 0"); olaf@184: universe@148: sstr_t result = sstrchr(str, 'w'); universe@148: UCX_TEST_ASSERT(result.length == 35, "sstrchr returned wrong length"); universe@148: UCX_TEST_ASSERT(strcmp("will find you - and I will kill you", result.ptr) universe@148: == 0, "sstrchr did not return the expected string"); universe@148: universe@148: result = sstrrchr(str, 'w'); universe@148: UCX_TEST_ASSERT(result.length == 13, "sstrrchr returned wrong length"); universe@148: UCX_TEST_ASSERT(strcmp("will kill you", result.ptr) universe@148: == 0, "sstrrchr did not return the expected string"); universe@148: universe@148: UCX_TEST_END universe@148: } universe@148: universe@214: UCX_TEST(test_sstrstr) { universe@214: sstr_t str = ST("find the match in this string"); universe@236: sstr_t longstr = ST( universe@236: "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl" universe@236: "mnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwx" universe@236: "yzabcdeababababnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghij" universe@236: "klmnopqrstuvwxyzaababababababababrstuvwxyzabcdefghijklmnopqrstuv" universe@236: "abababababababababababababababababababababababababababababababab" universe@236: "abababababababababababababababababababababababababababababababab" universe@236: "abababababababababababababababababababababababababababababababab" universe@236: "abababababababababababababababababababababababababababababababab" universe@236: "abababababababababababababababababababababababababababababababab" universe@236: "abababababababababababababababababababababababababababababababab" universe@236: "wxyz1234567890"); universe@236: sstr_t longstrpattern = ST( universe@236: "abababababababababababababababababababababababababababababababab" universe@236: "abababababababababababababababababababababababababababababababab" universe@236: "abababababababababababababababababababababababababababababababab" universe@236: "abababababababababababababababababababababababababababababababab" universe@236: "abababababababababababababababababababababababababababababababab" universe@236: ); universe@236: sstr_t longstrresult = ST( universe@236: "abababababababababababababababababababababababababababababababab" universe@236: "abababababababababababababababababababababababababababababababab" universe@236: "abababababababababababababababababababababababababababababababab" universe@236: "abababababababababababababababababababababababababababababababab" universe@236: "abababababababababababababababababababababababababababababababab" universe@236: "abababababababababababababababababababababababababababababababab" universe@236: "wxyz1234567890" universe@236: ); universe@214: UCX_TEST_BEGIN universe@214: universe@214: sstr_t notfound = sstrstr(str, S("no match")); universe@214: UCX_TEST_ASSERT(notfound.length == 0, "no match must return empty string"); universe@214: universe@214: sstr_t result = sstrstr(str, S("match")); universe@214: UCX_TEST_ASSERT(result.length == 20, "sstrstr returned wrong length"); universe@214: UCX_TEST_ASSERT(!strcmp("match in this string", result.ptr), universe@214: "sstrstr did not return the expected string"); universe@214: universe@214: result = sstrstr(str, S("")); universe@214: UCX_TEST_ASSERT(result.length == str.length, universe@214: "sstrstr with empty match string returned wrong length"); universe@214: UCX_TEST_ASSERT(!strcmp(str.ptr, result.ptr), universe@214: "sstrstr with empty match string did not return the original string"); universe@214: universe@236: result = sstrstr(longstr, longstrpattern); universe@236: UCX_TEST_ASSERT(result.length == longstrresult.length, universe@236: "long string result length incorrect"); universe@236: UCX_TEST_ASSERT(!strcmp(result.ptr, longstrresult.ptr), universe@236: "long string result content incorrect"); universe@236: universe@214: UCX_TEST_END universe@214: } universe@214: universe@149: UCX_TEST(test_sstrcmp) { universe@149: sstr_t str = ST("compare this"); universe@149: universe@149: UCX_TEST_BEGIN olaf@184: UCX_TEST_ASSERT(sstrcmp(str, S("")) == 1, "empty cmp failed"); olaf@184: UCX_TEST_ASSERT(sstrcmp(S(""), S("")) == 0, "empty cmp false negative"); universe@149: UCX_TEST_ASSERT(sstrcmp(str, S("compare this")) == 0, "false negative"); universe@149: UCX_TEST_ASSERT(sstrcmp(str, S("Compare This")) != 0, "false positive"); universe@149: UCX_TEST_ASSERT(sstrcmp(str, S("compare tool")) < 0, "memcmp < 0 failed"); universe@149: UCX_TEST_ASSERT(sstrcmp(str, S("compare shit")) > 0, "memcmp > 0 failed"); universe@149: UCX_TEST_ASSERT(sstrcmp(str, S("compare this not")) < 0, "len < 0 failed"); universe@149: UCX_TEST_ASSERT(sstrcmp(str, S("compare")) > 0, "len > 0 failed"); universe@149: UCX_TEST_END universe@149: } universe@149: universe@149: UCX_TEST(test_sstrcasecmp) { universe@149: universe@149: sstr_t str = ST("compare this"); universe@149: universe@149: UCX_TEST_BEGIN olaf@184: UCX_TEST_ASSERT(sstrcasecmp(str, S("")) == 1, "empty cmp failed"); olaf@184: UCX_TEST_ASSERT(sstrcasecmp(S(""), S("")) == 0, "empty cmp false negative"); universe@149: UCX_TEST_ASSERT(sstrcasecmp(str, S("compare this")) == 0, "false negative"); universe@149: UCX_TEST_ASSERT(sstrcasecmp(str, S("Compare This")) == 0, universe@149: "not ignoring case"); universe@149: UCX_TEST_ASSERT(sstrcasecmp(str, S("compare tool")) < 0, "< 0 failed"); universe@149: UCX_TEST_ASSERT(sstrcasecmp(str, S("compare shit")) > 0, "> 0 failed"); universe@149: UCX_TEST_ASSERT(sstrcasecmp(str, S("compare this not")) < 0, universe@149: "len < 0 failed"); universe@149: UCX_TEST_ASSERT(sstrcasecmp(str, S("compare")) > 0, "len > 0 failed"); universe@149: UCX_TEST_END universe@149: } universe@149: olaf@180: olaf@180: UCX_TEST(test_sstrcat) { olaf@180: sstr_t s1 = S("12"); olaf@180: sstr_t s2 = S("34"); olaf@180: sstr_t s3 = S("56"); olaf@180: sstr_t sn = { NULL, 0 }; olaf@180: olaf@180: UCX_TEST_BEGIN olaf@180: olaf@180: sstr_t t1 = sstrcat(2, s1, s2); olaf@180: UCX_TEST_ASSERT(!sstrcmp(t1, S("1234")), "t1: wrong content"); olaf@180: free(t1.ptr); olaf@180: olaf@180: sstr_t t2 = sstrcat(3, s1, s2, s3); olaf@180: UCX_TEST_ASSERT(!sstrcmp(t2, S("123456")), "t2: wrong content"); olaf@180: free(t2.ptr); olaf@180: olaf@180: sstr_t t3 = sstrcat(6, s1, sn, s2, sn, s3, sn); olaf@180: UCX_TEST_ASSERT(!sstrcmp(t3, S("123456")), "t3: wrong content"); olaf@180: free(t3.ptr); olaf@180: olaf@180: sstr_t t4 = sstrcat(2, sn, sn); olaf@180: UCX_TEST_ASSERT(t4.ptr, "t4.ptr is NULL"); olaf@180: UCX_TEST_ASSERT(t4.length == 0, "t4 has wrong length"); olaf@180: free(t4.ptr); olaf@180: olaf@272: // overflow test olaf@272: sstr_t o0; olaf@272: o0.ptr = ""; olaf@272: o0.length = ((size_t)-1) - 50; olaf@272: sstr_t o1; olaf@272: o1.ptr = ""; olaf@272: o1.length = 100; olaf@272: sstr_t o2; olaf@272: o2.ptr = ""; olaf@272: o2.length = 10; olaf@272: olaf@272: sstr_t n = sstrcat(2, o0, o1); olaf@272: UCX_TEST_ASSERT(n.ptr == NULL && n.length == 0, "overflow not detected"); olaf@272: sstr_t n2 = sstrcat(3, o0, o2, o1); olaf@272: UCX_TEST_ASSERT(n2.ptr == NULL && n2.length == 0, "n2: overflow not detected"); olaf@180: olaf@180: UCX_TEST_END olaf@180: olaf@180: } olaf@180: universe@134: UCX_TEST(test_sstrsplit) { universe@39: universe@39: const char *original = "this,is,a,csv,string"; universe@116: sstr_t test = ST("this,is,a,csv,string"); /* use copy of original here */ universe@173: ssize_t n; universe@39: sstr_t *list; universe@39: universe@39: UCX_TEST_BEGIN universe@39: universe@39: /* Nullpointer check */ universe@39: n = 0; universe@116: UCX_TEST_ASSERT(sstrsplit(test, S(""), &n) == NULL, universe@39: "empty delimiter must return NULL"); universe@39: universe@39: /* no delimiter occurence (ndo) */ universe@39: n = 0; universe@116: list = sstrsplit(test, S("z"), &n); universe@39: UCX_TEST_ASSERT(n == 1, "ndo, list length must be 1"); universe@39: UCX_TEST_ASSERT(strcmp(list[0].ptr, original) == 0, "ndo, " universe@39: "original string shall be returned as single list element"); universe@39: UCX_TEST_ASSERT(strcmp(test.ptr, original) == 0, universe@39: "ndo, original has been modified"); olaf@147: for(int i=0;i