16 static int values
[] = { 2, 3, 5, 7, 11 };
17 static const size_t len
= LENGTH(values
);
19 static bool item_compare(Item
*a
, Item
*b
) {
20 return strcmp(a
->key
, b
->key
) == 0 && a
->value
== b
->value
;
23 static void test_small_objects(void) {
25 array_init_sized(&arr
, sizeof(int));
26 ok(array_length(&arr
) == 0, "Initialization");
27 ok(!array_set(&arr
, 0, NULL
) && errno
== EINVAL
, "Set with invalid index");
28 ok(array_get(&arr
, 0) == NULL
&& errno
== EINVAL
, "Get with invalid index");
29 ok(array_peek(&arr
) == NULL
&& array_length(&arr
) == 0, "Peek empty array");
30 ok(array_pop(&arr
) == NULL
&& array_length(&arr
) == 0, "Pop empty array");
32 for (size_t i
= 0; i
< len
; i
++) {
34 ok(array_add(&arr
, &values
[i
]) && array_length(&arr
) == i
+1,
35 "Add integer: %zu = %d", i
, values
[i
]);
36 ok((v
= array_get(&arr
, i
)) && *v
== values
[i
],
37 "Get integer: %zu = %d", i
, *v
);
40 for (size_t i
= 0; i
< len
; i
++) {
41 ok(array_set(&arr
, i
, &values
[len
-i
-1]) && array_length(&arr
) == len
,
42 "Set array element: %zu = %d", i
, values
[len
-i
-1]);
45 for (size_t i
= 0; i
< len
; i
++) {
47 ok((v
= array_get(&arr
, i
)) && *v
== values
[len
-i
-1],
48 "Get array element: %zu = %d", i
, *v
);
52 ok((v
= array_peek(&arr
)) && *v
== values
[0] && array_length(&arr
) == len
, "Peek populated array");
53 ok((v
= array_pop(&arr
)) && *v
== values
[0] && array_length(&arr
) == len
-1, "Pop populated array");
54 ok((v
= array_peek(&arr
)) && *v
== values
[1] && array_length(&arr
) == len
-1, "Peek after pop");
57 ok(array_length(&arr
) == 0 && array_get(&arr
, 0) == NULL
&& errno
== EINVAL
, "Clear");
59 for (size_t i
= 0; i
< len
; i
++) {
60 ok(array_add(&arr
, &values
[i
]) && array_length(&arr
) == i
+1,
61 "Re-add integer: %zu = %d", i
, values
[i
]);
65 ok((tmp
= array_get(&arr
, 0)) && (old
= *tmp
) && array_set(&arr
, 0, NULL
) &&
66 array_get(&arr
, 0) == tmp
&& *tmp
== 0 && array_set(&arr
, 0, &old
) &&
67 array_get(&arr
, 0) == tmp
&& *tmp
== old
, "Set array element NULL");
68 ok(!array_set(&arr
, array_length(&arr
), &values
[0]) && errno
== EINVAL
, "Get past end of array");
69 ok(!array_get(&arr
, array_length(&arr
)) && errno
== EINVAL
, "Get past end of array");
71 ok(!array_remove(&arr
, array_length(&arr
)) && errno
== EINVAL
, "Remove past end of array");
73 size_t len_before
= array_length(&arr
);
74 ok(array_remove(&arr
, 2) && array_length(&arr
) == len_before
-1 &&
75 (v
= array_get(&arr
, 0)) && *v
== values
[0] &&
76 (v
= array_get(&arr
, 1)) && *v
== values
[1] &&
77 (v
= array_get(&arr
, 2)) && *v
== values
[3] &&
78 (v
= array_get(&arr
, 3)) && *v
== values
[4],
81 len_before
= array_length(&arr
);
82 ok(array_remove(&arr
, 0) && array_length(&arr
) == len_before
-1 &&
83 (v
= array_get(&arr
, 0)) && *v
== values
[1] &&
84 (v
= array_get(&arr
, 1)) && *v
== values
[3] &&
85 (v
= array_get(&arr
, 2)) && *v
== values
[4],
86 "Remove first element");
88 len_before
= array_length(&arr
);
89 ok(array_remove(&arr
, len_before
-1) && array_length(&arr
) == len_before
-1 &&
90 (v
= array_get(&arr
, 0)) && *v
== values
[1] &&
91 (v
= array_get(&arr
, 1)) && *v
== values
[3],
92 "Remove last element");
97 static void test_large_objects(void) {
99 array_init_sized(&arr
, sizeof(Item
));
100 ok(array_length(&arr
) == 0 && array_get(&arr
, 0) == NULL
&& errno
== EINVAL
,
105 for (size_t i
= 0; i
< len
; i
++) {
106 snprintf(items
[i
].key
, sizeof items
[i
].key
, "key: %zu", i
);
107 items
[i
].value
= values
[i
];
109 ok(array_add(&arr
, &items
[i
]) && array_length(&arr
) == i
+1,
110 "Add item: %zu = { '%s' = %d }", i
, items
[i
].key
, items
[i
].value
);
111 ok((item
= array_get(&arr
, i
)) && item
!= &items
[i
] && item_compare(item
, &items
[i
]),
112 "Get item: %zu = { '%s' = %d }", i
, item
->key
, item
->value
);
115 for (size_t i
= 0; i
< len
; i
++) {
116 Item
*item
= &items
[len
-i
-1];
117 ok(array_set(&arr
, i
, item
) && array_length(&arr
) == len
,
118 "Set array element: %zu = { '%s' = %d }", i
, item
->key
, item
->value
);
121 for (size_t i
= 0; i
< len
; i
++) {
123 ok((item
= array_get(&arr
, i
)) && item
!= &items
[len
-i
-1] && item_compare(item
, &items
[len
-i
-1]),
124 "Get item: %zu = { '%s' = %d }", i
, item
->key
, item
->value
);
127 ok(!array_add_ptr(&arr
, &items
[0]) && errno
== ENOTSUP
&& array_length(&arr
) == len
,
128 "Adding pointer to non pointer array");
129 ok(!array_set_ptr(&arr
, 0, &items
[0]) && errno
== ENOTSUP
&& item_compare(array_get(&arr
, 0), &items
[len
-1]),
130 "Setting pointer in non pointer array");
133 ok(array_length(&arr
) == 0 && array_get(&arr
, 0) == NULL
&& errno
== EINVAL
, "Clear");
138 static void test_pointers(void) {
142 array_init_sized(&arr
, 1);
143 ok(array_length(&arr
) == 0 && array_get_ptr(&arr
, 0) == NULL
&& errno
== ENOTSUP
,
144 "Initialization with size 1");
146 ok(!array_add_ptr(&arr
, &arr
) && errno
== ENOTSUP
&& array_get_ptr(&arr
, 0) == NULL
,
147 "Add pointer to non-pointer array");
150 char byte
= '_', *ptr
;
151 ok(array_add(&arr
, &byte
) && (ptr
= array_get(&arr
, 0)) && *ptr
== byte
,
153 ok(!array_get_ptr(&arr
, 0) && errno
== ENOTSUP
, "Get pointer from non-pointer array");
157 ok(array_length(&arr
) == 0 && array_get_ptr(&arr
, 0) == NULL
&& errno
== EINVAL
,
162 for (size_t i
= 0; i
< len
; i
++) {
163 items
[i
] = malloc(sizeof(Item
));
164 snprintf(items
[i
]->key
, sizeof(items
[i
]->key
), "key: %zu", i
);
165 items
[i
]->value
= values
[i
];
168 for (size_t i
= 0; i
< len
; i
++) {
170 ok(array_add_ptr(&arr
, items
[i
]) && array_length(&arr
) == i
+1,
171 "Add item: %zu = %p", i
, (void*)items
[i
]);
172 ok((item
= array_get_ptr(&arr
, i
)) && item
== items
[i
],
173 "Get item: %zu = %p", i
, (void*)item
);
176 for (size_t i
= 0; i
< len
; i
++) {
177 Item
*item
= items
[len
-i
-1];
178 ok(array_set_ptr(&arr
, i
, item
) && array_length(&arr
) == len
,
179 "Set item: %zu = %p", i
, (void*)item
);
182 for (size_t i
= 0; i
< len
; i
++) {
184 ok((item
= array_get_ptr(&arr
, i
)) && item
== items
[len
-i
-1],
185 "Get item: %zu = %p", i
, (void*)item
);
189 ok((tmp
= array_get_ptr(&arr
, 0)) && array_set_ptr(&arr
, 0, NULL
) &&
190 array_get_ptr(&arr
, 0) == NULL
&& array_set_ptr(&arr
, 0, tmp
) &&
191 array_get_ptr(&arr
, 0) == tmp
, "Set pointer NULL");
192 ok(!array_set_ptr(&arr
, array_length(&arr
), items
[0]) && errno
== EINVAL
, "Set pointer past end of array");
193 ok(!array_get_ptr(&arr
, array_length(&arr
)) && errno
== EINVAL
, "Get pointer past end of array");
196 ok(array_length(&arr
) == 0 && array_get_ptr(&arr
, 0) == NULL
&& errno
== EINVAL
, "Clear");
198 for (size_t i
= 0; i
< len
; i
++) {
199 ok(array_add_ptr(&arr
, items
[i
]) && array_length(&arr
) == i
+1,
200 "Re-add item: %zu = %p", i
, (void*)items
[i
]);
202 array_release_full(&arr
);
205 int main(int argc
, char *argv
[]) {
208 test_small_objects();
209 test_large_objects();
212 return exit_status();