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