From f515e8fed965f2e2024ad1260f08a6757800d94d Mon Sep 17 00:00:00 2001 From: Mosder Date: Fri, 21 Aug 2026 16:39:57 +0200 Subject: feat: added some (but not all yet) string.h tests --- tests/string_tests.c | 99 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 93 insertions(+), 6 deletions(-) (limited to 'tests/string_tests.c') diff --git a/tests/string_tests.c b/tests/string_tests.c index d77cabf..7247b05 100644 --- a/tests/string_tests.c +++ b/tests/string_tests.c @@ -1,24 +1,101 @@ #include "string_tests.h" #include "moslib/string.h" +#include +#include + +#include "moslib/ds/array.h" + +#define HELLO_WORLD_LIT "Hello, World!" + Test creating() { - test_assert(0, "TODO"); + char *str = HELLO_WORLD_LIT; + size_t str_len = strlen(str); + + StringSlice ss1 = ss_from_str(str); + test_assert(ss1.data == str && ss1.len == str_len, "ss_from_str created wrong slice"); + + char *arr = NULL; + arr_append_n(arr, str, 13); + StringSlice ss2 = ss_from_arr(arr); + test_assert(ss2.data == str && ss2.len == str_len, "ss_from_arr created wrong slice"); + + StringSlice ss3 = ss_from_vars(str, 13); + test_assert(ss3.data == str && ss3.len == str_len, "ss_from_vars created wrong slice"); + + StringSlice ss4 = SS_LIT(HELLO_WORLD_LIT); + test_assert(ss4.data == str && ss4.len == sizeof(HELLO_WORLD_LIT) - 1, "SS_LIT created wrong slice"); + + StringSlice ss5 = ss_copy(ss1); + test_assert(ss5.data == ss1.data && ss5.len == ss1.len, "ss_from_arr created wrong slice"); +} + +Test ss_print_helper() { + StringSlice ss = ss_from_str("test"); + ss_print(ss); } Test printing() { - test_assert(0, "TODO"); + test_assert_out(ss_print_helper, stdout, "test"); + + StringSlice ss = ss_from_str("slice"); + char buf[16]; + sprintf(buf, "out: " SS_FMT " :)", SS_ARGS(ss)); + test_assert(strcmp(buf, "out: slice :)") == 0, "SS_FMT + SS_ARGS printed wrong output"); } Test comparing() { - test_assert(0, "TODO"); + StringSlice ss = ss_from_str("hello world"); + test_assert(ss_eq(ss, ss), "slice is not equal to itself"); + + char *hw = strdup("hello world"); + StringSlice ss2 = ss_from_str(hw); + test_assert(ss_eq(ss, ss2), "slice is not equal to an equal slice"); + free(hw); + + StringSlice ss3 = ss_from_vars(ss.data, ss.len - 1); + test_assert(ss_eq(ss, ss3) == 0, "slice is equal when the pointer is the same but length differs"); + + StringSlice ss4 = ss_from_str("hello"); + StringSlice ss5 = ss_from_str("world"); + test_assert(ss_eq(ss4, ss5) == 0, "slice is equal when the length is the same but pointer differs"); } Test trimming() { - test_assert(0, "TODO"); + StringSlice ss = ss_from_str(" Hi :) "); + StringSlice t = ss_trim(ss); + test_assert(ss_eq(t, ss_from_str("Hi :)")), "ss_trim didn't trim properly"); + test_assert(ss_eq(t, ss_trim(t)), "trimming slice twice changes output"); + + StringSlice tl = ss_trim_left(ss); + test_assert(ss_eq(tl, ss_from_str("Hi :) ")), "ss_trim_left didn't trim properly"); + + StringSlice tr = ss_trim_right(ss); + test_assert(ss_eq(tr, ss_from_str(" Hi :)")), "ss_trim_right didn't trim properly"); + + ss = ss_from_str(" "); + t = ss_trim(ss); + test_assert(ss_eq(t, ss_from_str("")), "trimming breaks for all whitespace slice"); } Test prefix_suffix() { - test_assert(0, "TODO"); + StringSlice ss = ss_from_str("pre mid suf"); + + test_assert(ss_starts_with(ss, ss_from_str("pre")), "slice doesn't start with its prefix"); + test_assert(ss_starts_with(ss, ss_from_str("suf")) == 0, "slice starts with not prefix"); + + test_assert(ss_ends_with(ss, ss_from_str("suf")), "slice doesn't end with its suffix"); + test_assert(ss_ends_with(ss, ss_from_str("pre")) == 0, "slice ends with not suffix"); + + test_assert(ss_starts_with_str(ss, "pre mid"), "slice doesn't start with its prefix"); + test_assert(ss_starts_with_str(ss, "suf") == 0, "slice starts with not prefix"); + + test_assert(ss_ends_with_str(ss, "mid suf"), "slice doesn't end with its suffix"); + test_assert(ss_ends_with_str(ss, "pre") == 0, "slice ends with not suffix"); + + StringSlice ss2 = ss_from_str(""); + test_assert(ss_starts_with(ss2, ss_from_str("")), "starts_with breaks for empty slice and prefix"); + test_assert(ss_ends_with(ss2, ss_from_str("")), "ends_with breaks for empty slice and suffix"); } Test deleting() { @@ -34,7 +111,17 @@ Test finding() { } Test utf8_len_test() { - test_assert(0, "TODO"); + StringSlice ss = ss_from_str("1 byte chars"); + test_assert(ss_utf8_len(ss) == ss.len, "utf8_len differs from len for all 1 byte characters"); + + ss = ss_from_str("żółw"); + test_assert(ss_utf8_len(ss) == 4, "utf8_len doesn't work for 2 byte characters"); + + ss = ss_from_str("ッにプ"); + test_assert(ss_utf8_len(ss) == 3, "utf8_len doesn't work for 3 byte characters"); + + ss = ss_from_str("𒀀𓀂"); + test_assert(ss_utf8_len(ss) == 2, "utf8_len doesn't work for 4 byte characters"); } void string_tests(Tester *tester) { -- cgit v1.2.3