aboutsummaryrefslogtreecommitdiff
path: root/tests/string_tests.c
blob: 7247b0537288b9f51a41a81ceb0c124a1804e2e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include "string_tests.h"
#include "moslib/string.h"

#include <stdlib.h>
#include <string.h>

#include "moslib/ds/array.h"

#define HELLO_WORLD_LIT "Hello, World!"

Test creating() {
    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_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() {
    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() {
    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() {
    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() {
    test_assert(0, "TODO");
}

Test splitting() {
    test_assert(0, "TODO");
}

Test finding() {
    test_assert(0, "TODO");
}

Test utf8_len_test() {
    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) {
    TestGroup *group = add_test_group(tester, "moslib/string.h");
    add_test(group, creating);
    add_test(group, printing);
    add_test(group, comparing);
    add_test(group, trimming);
    add_test(group, prefix_suffix);
    add_test(group, deleting);
    add_test(group, splitting);
    add_test(group, finding);
    add_test(group, utf8_len_test);
}