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 }