Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/pkg
Path: blob/main/tests/lib/vec.c
2065 views
1
/*-
2
* Copyright(c) 2024 Baptiste Daroussin <[email protected]>
3
*
4
* SPDX-License-Identifier: BSD-2-Clause
5
*/
6
7
#include <atf-c.h>
8
#include <private/utils.h>
9
#include <xmalloc.h>
10
#include <pkg/vec.h>
11
12
ATF_TC_WITHOUT_HEAD(c_charv_t);
13
ATF_TC_WITHOUT_HEAD(c_charv_contains);
14
ATF_TC_WITHOUT_HEAD(charv_t);
15
ATF_TC_WITHOUT_HEAD(vec_remove_and_free);
16
ATF_TC_WITHOUT_HEAD(charv_search);
17
ATF_TC_WITHOUT_HEAD(charv_insert_sorted);
18
19
ATF_TC_BODY(c_charv_t, tc)
20
{
21
c_charv_t list = vec_init();
22
23
ATF_REQUIRE_EQ_MSG(list.d, NULL, "vec_init failed");
24
ATF_REQUIRE_EQ_MSG(list.cap, 0, "vec_init failed");
25
ATF_REQUIRE_EQ_MSG(list.len, 0, "vec_init failed");
26
27
vec_push(&list, "test1");
28
ATF_REQUIRE_MSG(list.d != NULL, "vec_push failed");
29
ATF_REQUIRE_EQ_MSG(list.cap, 1, "vec_push failed");
30
ATF_REQUIRE_EQ_MSG(list.len, 1, "vec_push failed");
31
32
vec_push(&list, "test2");
33
ATF_REQUIRE_MSG(list.d != NULL, "vec_push2 failed");
34
ATF_REQUIRE_EQ_MSG(list.cap, 2, "vec_push2 failed");
35
ATF_REQUIRE_EQ_MSG(list.len, 2, "vec_push2 failed");
36
37
vec_push(&list, "test3");
38
ATF_REQUIRE_MSG(list.d != NULL, "vec_push3 failed");
39
ATF_REQUIRE_EQ_MSG(list.cap, 4, "vec_push3 failed");
40
ATF_REQUIRE_EQ_MSG(list.len, 3, "vec_push3 failed");
41
42
ATF_REQUIRE_STREQ_MSG(vec_first(&list), "test1", "vec_first failed");
43
ATF_REQUIRE_STREQ_MSG(vec_last(&list), "test3", "vec_last failed");
44
45
vec_clear(&list);
46
ATF_REQUIRE_MSG(list.d != NULL, "vec_clear failed");
47
ATF_REQUIRE_EQ_MSG(list.cap, 4, "vec_clear failed");
48
ATF_REQUIRE_EQ_MSG(list.len, 0, "vec_clear failed");
49
50
vec_free(&list);
51
ATF_REQUIRE_EQ_MSG(list.d, NULL, "vec_free failed");
52
ATF_REQUIRE_EQ_MSG(list.cap, 0, "vec_free failed");
53
ATF_REQUIRE_EQ_MSG(list.len, 0, "vec_free failed");
54
}
55
56
ATF_TC_BODY(charv_t, tc)
57
{
58
charv_t list = vec_init();
59
60
ATF_REQUIRE_EQ_MSG(list.d, NULL, "vec_init failed");
61
ATF_REQUIRE_EQ_MSG(list.cap, 0, "vec_init failed");
62
ATF_REQUIRE_EQ_MSG(list.len, 0, "vec_init failed");
63
64
vec_push(&list, xstrdup("test1"));
65
ATF_REQUIRE_MSG(list.d != NULL, "vec_push failed");
66
ATF_REQUIRE_EQ_MSG(list.cap, 1, "vec_push failed");
67
ATF_REQUIRE_EQ_MSG(list.len, 1, "vec_push failed");
68
69
vec_push(&list, xstrdup("test2"));
70
ATF_REQUIRE_MSG(list.d != NULL, "vec_push2 failed");
71
ATF_REQUIRE_EQ_MSG(list.cap, 2, "vec_push2 failed");
72
ATF_REQUIRE_EQ_MSG(list.len, 2, "vec_push2 failed");
73
74
vec_push(&list, xstrdup("test3"));
75
ATF_REQUIRE_MSG(list.d != NULL, "vec_push3 failed");
76
ATF_REQUIRE_EQ_MSG(list.cap, 4, "vec_push3 failed");
77
ATF_REQUIRE_EQ_MSG(list.len, 3, "vec_push3 failed");
78
79
ATF_REQUIRE_STREQ_MSG(vec_first(&list), "test1", "vec_first failed");
80
ATF_REQUIRE_STREQ_MSG(vec_last(&list), "test3", "vec_last failed");
81
82
vec_clear_and_free(&list, free);
83
ATF_REQUIRE_MSG(list.d != NULL, "vec_clear failed");
84
ATF_REQUIRE_EQ_MSG(list.cap, 4, "vec_clear failed");
85
ATF_REQUIRE_EQ_MSG(list.len, 0, "vec_clear failed");
86
87
vec_free_and_free(&list, free);
88
ATF_REQUIRE_EQ_MSG(list.d, NULL, "vec_free failed");
89
ATF_REQUIRE_EQ_MSG(list.cap, 0, "vec_free failed");
90
ATF_REQUIRE_EQ_MSG(list.len, 0, "vec_free failed");
91
}
92
93
ATF_TC_BODY(c_charv_contains, tc)
94
{
95
c_charv_t list = vec_init();
96
97
ATF_REQUIRE_EQ_MSG(list.d, NULL, "vec_init failed");
98
ATF_REQUIRE_EQ_MSG(list.cap, 0, "vec_init failed");
99
ATF_REQUIRE_EQ_MSG(list.len, 0, "vec_init failed");
100
101
vec_push(&list, "test1");
102
ATF_REQUIRE_MSG(list.d != NULL, "vec_push failed");
103
ATF_REQUIRE_EQ_MSG(list.cap, 1, "vec_push failed");
104
ATF_REQUIRE_EQ_MSG(list.len, 1, "vec_push failed");
105
106
vec_push(&list, "test2");
107
ATF_REQUIRE_MSG(list.d != NULL, "vec_push2 failed");
108
ATF_REQUIRE_EQ_MSG(list.cap, 2, "vec_push2 failed");
109
ATF_REQUIRE_EQ_MSG(list.len, 2, "vec_push2 failed");
110
111
vec_push(&list, "test3");
112
ATF_REQUIRE_MSG(list.d != NULL, "vec_push3 failed");
113
ATF_REQUIRE_EQ_MSG(list.cap, 4, "vec_push3 failed");
114
ATF_REQUIRE_EQ_MSG(list.len, 3, "vec_push3 failed");
115
116
ATF_REQUIRE_EQ_MSG(c_charv_contains(&list, "Test3", true), false, "c_charv_contains not case sensitive");
117
ATF_REQUIRE_EQ_MSG(c_charv_contains(&list, "Test3", false), true, "c_charv_contains not case insensitive");
118
ATF_REQUIRE_EQ_MSG(c_charv_contains(&list, "aest3", false), false, "c_charv_contains should not find anything");
119
120
vec_free(&list);
121
}
122
123
ATF_TC_BODY(vec_remove_and_free, tc)
124
{
125
charv_t list = vec_init();
126
127
vec_push(&list, xstrdup("test1"));
128
ATF_REQUIRE_EQ(list.len, 1);
129
vec_remove_and_free(&list, 0, free);
130
ATF_REQUIRE_EQ(list.len, 0);
131
vec_push(&list, xstrdup("test2"));
132
vec_push(&list, xstrdup("test3"));
133
vec_push(&list, xstrdup("test4"));
134
ATF_REQUIRE_EQ(list.len, 3);
135
vec_foreach(list, i) {
136
if (strcmp(list.d[i], "test3") == 0) {
137
vec_remove_and_free(&list, i, free);
138
}
139
}
140
ATF_REQUIRE_EQ(list.len, 2);
141
ATF_REQUIRE_STREQ(list.d[0], "test2");
142
ATF_REQUIRE_STREQ(list.d[1], "test4");
143
}
144
145
ATF_TC_BODY(charv_search, tc)
146
{
147
charv_t list = vec_init();
148
149
ATF_REQUIRE(charv_search(&list, "key") == NULL);
150
vec_push(&list, xstrdup("bla"));
151
ATF_REQUIRE(charv_search(&list, "key") == NULL);
152
ATF_REQUIRE_STREQ(charv_search(&list, "bla"), "bla");
153
vec_free_and_free(&list, free);
154
}
155
156
ATF_TC_BODY(charv_insert_sorted, tc)
157
{
158
charv_t list = vec_init();
159
160
char *p = xstrdup("bla");
161
ATF_REQUIRE_EQ(charv_insert_sorted(&list, p), NULL);
162
ATF_REQUIRE_EQ(list.len, 1);
163
ATF_REQUIRE_STREQ(list.d[0], "bla");
164
165
ATF_REQUIRE(charv_insert_sorted(&list, p) != NULL);
166
ATF_REQUIRE_EQ(list.len, 1);
167
ATF_REQUIRE_STREQ(list.d[0], "bla");
168
169
p = xstrdup("a");
170
ATF_REQUIRE_EQ(charv_insert_sorted(&list, p), NULL);
171
ATF_REQUIRE_EQ(list.len, 2);
172
ATF_REQUIRE_STREQ(list.d[0], "a");
173
ATF_REQUIRE_STREQ(list.d[1], "bla");
174
}
175
176
ATF_TP_ADD_TCS(tp)
177
{
178
ATF_TP_ADD_TC(tp, c_charv_t);
179
ATF_TP_ADD_TC(tp, charv_t);
180
ATF_TP_ADD_TC(tp, c_charv_contains);
181
ATF_TP_ADD_TC(tp, vec_remove_and_free);
182
ATF_TP_ADD_TC(tp, charv_search);
183
ATF_TP_ADD_TC(tp, charv_insert_sorted);
184
185
return (atf_no_error());
186
}
187
188