qml: make TabButtonExt text bold
[vlc.git] / src / test / vector.c
blobd65f129c31d21375e9abae6a184cd55db8de8032
1 /*****************************************************************************
2 * vector.c : Test for vlc_vector macros
3 *****************************************************************************
4 * Copyright (C) 2018 VLC authors and VideoLAN
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License as published by
8 * the Free Software Foundation; either version 2.1 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
19 *****************************************************************************/
21 #ifdef HAVE_CONFIG_H
22 # include "config.h"
23 #endif
25 #undef NDEBUG
27 #include <assert.h>
29 #include <vlc_common.h>
30 #include <vlc_vector.h>
32 static void test_vector_insert_remove(void)
34 struct VLC_VECTOR(int) vec = VLC_VECTOR_INITIALIZER;
36 bool ok;
38 ok = vlc_vector_push(&vec, 42);
39 assert(ok);
40 assert(vec.data[0] == 42);
41 assert(vec.size == 1);
43 ok = vlc_vector_push(&vec, 37);
44 assert(ok);
45 assert(vec.size == 2);
46 assert(vec.data[0] == 42);
47 assert(vec.data[1] == 37);
49 ok = vlc_vector_insert(&vec, 1, 100);
50 assert(ok);
51 assert(vec.size == 3);
52 assert(vec.data[0] == 42);
53 assert(vec.data[1] == 100);
54 assert(vec.data[2] == 37);
56 ok = vlc_vector_push(&vec, 77);
57 assert(ok);
58 assert(vec.size == 4);
59 assert(vec.data[0] == 42);
60 assert(vec.data[1] == 100);
61 assert(vec.data[2] == 37);
62 assert(vec.data[3] == 77);
64 vlc_vector_remove(&vec, 1);
65 assert(vec.size == 3);
66 assert(vec.data[0] == 42);
67 assert(vec.data[1] == 37);
68 assert(vec.data[2] == 77);
70 vlc_vector_clear(&vec);
71 assert(vec.size == 0);
73 vlc_vector_destroy(&vec);
76 static void test_vector_push_array(void)
78 struct VLC_VECTOR(int) vec = VLC_VECTOR_INITIALIZER;
79 bool ok;
81 ok = vlc_vector_push(&vec, 3); assert(ok);
82 ok = vlc_vector_push(&vec, 14); assert(ok);
83 ok = vlc_vector_push(&vec, 15); assert(ok);
84 ok = vlc_vector_push(&vec, 92); assert(ok);
85 ok = vlc_vector_push(&vec, 65); assert(ok);
86 assert(vec.size == 5);
88 int items[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
89 ok = vlc_vector_push_all(&vec, items, 8);
91 assert(ok);
92 assert(vec.size == 13);
93 assert(vec.data[0] == 3);
94 assert(vec.data[1] == 14);
95 assert(vec.data[2] == 15);
96 assert(vec.data[3] == 92);
97 assert(vec.data[4] == 65);
98 assert(vec.data[5] == 1);
99 assert(vec.data[6] == 2);
100 assert(vec.data[7] == 3);
101 assert(vec.data[8] == 4);
102 assert(vec.data[9] == 5);
103 assert(vec.data[10] == 6);
104 assert(vec.data[11] == 7);
105 assert(vec.data[12] == 8);
107 vlc_vector_destroy(&vec);
110 static void test_vector_insert_array(void)
112 struct VLC_VECTOR(int) vec = VLC_VECTOR_INITIALIZER;
113 bool ok;
115 ok = vlc_vector_push(&vec, 3); assert(ok);
116 ok = vlc_vector_push(&vec, 14); assert(ok);
117 ok = vlc_vector_push(&vec, 15); assert(ok);
118 ok = vlc_vector_push(&vec, 92); assert(ok);
119 ok = vlc_vector_push(&vec, 65); assert(ok);
120 assert(vec.size == 5);
122 int items[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
123 ok = vlc_vector_insert_all(&vec, 3, items, 8);
124 assert(ok);
125 assert(vec.size == 13);
126 assert(vec.data[0] == 3);
127 assert(vec.data[1] == 14);
128 assert(vec.data[2] == 15);
129 assert(vec.data[3] == 1);
130 assert(vec.data[4] == 2);
131 assert(vec.data[5] == 3);
132 assert(vec.data[6] == 4);
133 assert(vec.data[7] == 5);
134 assert(vec.data[8] == 6);
135 assert(vec.data[9] == 7);
136 assert(vec.data[10] == 8);
137 assert(vec.data[11] == 92);
138 assert(vec.data[12] == 65);
140 vlc_vector_destroy(&vec);
143 static void test_vector_remove_slice(void)
145 struct VLC_VECTOR(int) vec = VLC_VECTOR_INITIALIZER;
147 bool ok;
149 for (int i = 0; i < 100; ++i)
151 ok = vlc_vector_push(&vec, i);
152 assert(ok);
155 assert(vec.size == 100);
157 vlc_vector_remove_slice(&vec, 32, 60);
158 assert(vec.size == 40);
159 assert(vec.data[31] == 31);
160 assert(vec.data[32] == 92);
162 vlc_vector_destroy(&vec);
165 static void test_vector_swap_remove(void)
167 struct VLC_VECTOR(int) vec = VLC_VECTOR_INITIALIZER;
169 bool ok;
171 ok = vlc_vector_push(&vec, 3); assert(ok);
172 ok = vlc_vector_push(&vec, 14); assert(ok);
173 ok = vlc_vector_push(&vec, 15); assert(ok);
174 ok = vlc_vector_push(&vec, 92); assert(ok);
175 ok = vlc_vector_push(&vec, 65); assert(ok);
176 assert(vec.size == 5);
178 vlc_vector_swap_remove(&vec, 1);
179 assert(vec.size == 4);
180 assert(vec.data[0] == 3);
181 assert(vec.data[1] == 65);
182 assert(vec.data[2] == 15);
183 assert(vec.data[3] == 92);
185 vlc_vector_destroy(&vec);
188 static void test_vector_index_of(void)
190 struct VLC_VECTOR(int) vec;
191 vlc_vector_init(&vec);
193 bool ok;
195 for (int i = 0; i < 10; ++i)
197 ok = vlc_vector_push(&vec, i);
198 assert(ok);
201 ssize_t idx;
203 vlc_vector_index_of(&vec, 0, &idx);
204 assert(idx == 0);
206 vlc_vector_index_of(&vec, 1, &idx);
207 assert(idx == 1);
209 vlc_vector_index_of(&vec, 4, &idx);
210 assert(idx == 4);
212 vlc_vector_index_of(&vec, 9, &idx);
213 assert(idx == 9);
215 vlc_vector_index_of(&vec, 12, &idx);
216 assert(idx == -1);
218 vlc_vector_destroy(&vec);
221 static void test_vector_foreach(void)
223 struct VLC_VECTOR(int) vec = VLC_VECTOR_INITIALIZER;
225 bool ok;
227 for (int i = 0; i < 10; ++i)
229 ok = vlc_vector_push(&vec, i);
230 assert(ok);
233 int count = 0;
234 int item;
235 vlc_vector_foreach(item, &vec)
237 assert(item == count);
238 count++;
240 assert(count == 10);
242 vlc_vector_destroy(&vec);
245 static void test_vector_grow()
247 struct VLC_VECTOR(int) vec = VLC_VECTOR_INITIALIZER;
249 bool ok;
251 for (int i = 0; i < 50; ++i)
253 ok = vlc_vector_push(&vec, i); /* append */
254 assert(ok);
257 assert(vec.cap >= 50);
258 assert(vec.size == 50);
260 for (int i = 0; i < 25; ++i)
262 ok = vlc_vector_insert(&vec, 20, i); /* insert in the middle */
263 assert(ok);
266 assert(vec.cap >= 75);
267 assert(vec.size == 75);
269 for (int i = 0; i < 25; ++i)
271 ok = vlc_vector_insert(&vec, 0, i); /* prepend */
272 assert(ok);
275 assert(vec.cap >= 100);
276 assert(vec.size == 100);
278 for (int i = 0; i < 50; ++i)
279 vlc_vector_remove(&vec, 20); /* remove from the middle */
281 assert(vec.cap >= 50);
282 assert(vec.size == 50);
284 for (int i = 0; i < 25; ++i)
285 vlc_vector_remove(&vec, 0); /* remove from the head */
287 assert(vec.cap >= 25);
288 assert(vec.size == 25);
290 for (int i = 24; i >=0; --i)
291 vlc_vector_remove(&vec, i); /* remove from the tail */
293 assert(vec.size == 0);
295 vlc_vector_destroy(&vec);
298 static void test_vector_exp_growth(void)
300 struct VLC_VECTOR(int) vec = VLC_VECTOR_INITIALIZER;
302 size_t oldcap = vec.cap;
303 int realloc_count = 0;
304 bool ok;
305 for (int i = 0; i < 10000; ++i)
307 ok = vlc_vector_push(&vec, i);
308 assert(ok);
309 if (vec.cap != oldcap)
311 realloc_count++;
312 oldcap = vec.cap;
316 /* Test speciically for an expected growth factor of 1.5. In practice, the
317 * result is even lower (19) due to the first alloc of size 10 */
318 assert(realloc_count <= 23); /* ln(10000) / ln(1.5) ~= 23 */
320 realloc_count = 0;
321 for (int i = 9999; i >= 0; --i)
323 vlc_vector_remove(&vec, i);
324 if (vec.cap != oldcap)
326 realloc_count++;
327 oldcap = vec.cap;
331 assert(realloc_count <= 23); /* same expectations for removals */
332 assert(realloc_count > 0); /* vlc_vector_remove() must autoshrink */
334 vlc_vector_destroy(&vec);
337 static void test_vector_reserve(void)
339 struct VLC_VECTOR(int) vec = VLC_VECTOR_INITIALIZER;
341 bool ok;
343 ok = vlc_vector_reserve(&vec, 800);
344 assert(ok);
345 assert(vec.cap >= 800);
346 assert(vec.size == 0);
348 size_t initial_cap = vec.cap;
350 for (int i = 0; i < 800; ++i)
352 ok = vlc_vector_push(&vec, i);
353 assert(ok);
354 assert(vec.cap == initial_cap); /* no realloc */
357 vlc_vector_destroy(&vec);
360 static void test_vector_shrink_to_fit(void)
362 struct VLC_VECTOR(int) vec = VLC_VECTOR_INITIALIZER;
364 bool ok;
366 ok = vlc_vector_reserve(&vec, 800);
367 assert(ok);
368 for (int i = 0; i < 250; ++i)
370 ok = vlc_vector_push(&vec, i);
371 assert(ok);
374 assert(vec.cap >= 800);
375 assert(vec.size == 250);
377 vlc_vector_shrink_to_fit(&vec);
378 assert(vec.cap == 250);
379 assert(vec.size == 250);
381 vlc_vector_destroy(&vec);
384 static void test_vector_move(void)
386 struct VLC_VECTOR(int) vec = VLC_VECTOR_INITIALIZER;
388 for (int i = 0; i < 7; ++i)
390 bool ok = vlc_vector_push(&vec, i);
391 assert(ok);
394 /* move item at 1 so that its new position is 4 */
395 vlc_vector_move(&vec, 1, 4);
397 assert(vec.size == 7);
398 assert(vec.data[0] == 0);
399 assert(vec.data[1] == 2);
400 assert(vec.data[2] == 3);
401 assert(vec.data[3] == 4);
402 assert(vec.data[4] == 1);
403 assert(vec.data[5] == 5);
404 assert(vec.data[6] == 6);
406 vlc_vector_destroy(&vec);
409 static void test_vector_move_slice_forward(void)
411 struct VLC_VECTOR(int) vec = VLC_VECTOR_INITIALIZER;
413 for (int i = 0; i < 10; ++i)
415 bool ok = vlc_vector_push(&vec, i);
416 assert(ok);
419 /* move slice {2, 3, 4, 5} so that its new position is 5 */
420 vlc_vector_move_slice(&vec, 2, 4, 5);
422 assert(vec.size == 10);
423 assert(vec.data[0] == 0);
424 assert(vec.data[1] == 1);
425 assert(vec.data[2] == 6);
426 assert(vec.data[3] == 7);
427 assert(vec.data[4] == 8);
428 assert(vec.data[5] == 2);
429 assert(vec.data[6] == 3);
430 assert(vec.data[7] == 4);
431 assert(vec.data[8] == 5);
432 assert(vec.data[9] == 9);
434 vlc_vector_destroy(&vec);
437 static void test_vector_move_slice_backward(void)
439 struct VLC_VECTOR(int) vec = VLC_VECTOR_INITIALIZER;
441 for (int i = 0; i < 10; ++i)
443 bool ok = vlc_vector_push(&vec, i);
444 assert(ok);
447 /* move slice {5, 6, 7} so that its new position is 2 */
448 vlc_vector_move_slice(&vec, 5, 3, 2);
450 assert(vec.size == 10);
451 assert(vec.data[0] == 0);
452 assert(vec.data[1] == 1);
453 assert(vec.data[2] == 5);
454 assert(vec.data[3] == 6);
455 assert(vec.data[4] == 7);
456 assert(vec.data[5] == 2);
457 assert(vec.data[6] == 3);
458 assert(vec.data[7] == 4);
459 assert(vec.data[8] == 8);
460 assert(vec.data[9] == 9);
462 vlc_vector_destroy(&vec);
465 int main(void) {
466 test_vector_insert_remove();
467 test_vector_push_array();
468 test_vector_insert_array();
469 test_vector_remove_slice();
470 test_vector_swap_remove();
471 test_vector_move();
472 test_vector_move_slice_forward();
473 test_vector_move_slice_backward();
474 test_vector_index_of();
475 test_vector_foreach();
476 test_vector_grow();
477 test_vector_exp_growth();
478 test_vector_reserve();
479 test_vector_shrink_to_fit();
480 return 0;