/ tests / lib / vec.c
vec.c
  1  /*-
  2   * Copyright(c) 2024 Baptiste Daroussin <bapt@FreeBSD.org>
  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  }