libamxc  1.10.3
C Generic Data Containers
test_amxc_llist.c
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** SPDX-License-Identifier: BSD-2-Clause-Patent
4 **
5 ** SPDX-FileCopyrightText: Copyright (c) 2023 SoftAtHome
6 **
7 ** Redistribution and use in source and binary forms, with or without modification,
8 ** are permitted provided that the following conditions are met:
9 **
10 ** 1. Redistributions of source code must retain the above copyright notice,
11 ** this list of conditions and the following disclaimer.
12 **
13 ** 2. Redistributions in binary form must reproduce the above copyright notice,
14 ** this list of conditions and the following disclaimer in the documentation
15 ** and/or other materials provided with the distribution.
16 **
17 ** Subject to the terms and conditions of this license, each copyright holder
18 ** and contributor hereby grants to those receiving rights under this license
19 ** a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable
20 ** (except for failure to satisfy the conditions of this license) patent license
21 ** to make, have made, use, offer to sell, sell, import, and otherwise transfer
22 ** this software, where such license applies only to those patent claims, already
23 ** acquired or hereafter acquired, licensable by such copyright holder or contributor
24 ** that are necessarily infringed by:
25 **
26 ** (a) their Contribution(s) (the licensed copyrights of copyright holders and
27 ** non-copyrightable additions of contributors, in source or binary form) alone;
28 ** or
29 **
30 ** (b) combination of their Contribution(s) with the work of authorship to which
31 ** such Contribution(s) was added by such copyright holder or contributor, if,
32 ** at the time the Contribution is added, such addition causes such combination
33 ** to be necessarily infringed. The patent license shall not apply to any other
34 ** combinations which include the Contribution.
35 **
36 ** Except as expressly stated above, no rights or licenses from any copyright
37 ** holder or contributor is granted under this license, whether expressly, by
38 ** implication, estoppel or otherwise.
39 **
40 ** DISCLAIMER
41 **
42 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
43 ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44 ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
45 ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
46 ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47 ** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
48 ** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
49 ** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
50 ** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
51 ** USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
52 **
53 ****************************************************************************/
54 
55 #include <stdio.h>
56 #include <stdarg.h>
57 #include <stddef.h>
58 #include <stdlib.h>
59 #include <setjmp.h>
60 #include <cmocka.h>
61 
62 #include <amxc/amxc_llist.h>
63 
64 #include "test_amxc_llist.h"
65 
66 #include <amxc/amxc_macros.h>
68  // passing NULL pointers should not lead to segfault
69  assert_int_equal(amxc_llist_new(NULL), -1);
70  amxc_llist_delete(NULL, NULL);
71 }
72 
73 void amxc_llist_new_delete_check(UNUSED void** state) {
74  amxc_llist_t* llist = NULL;
75  assert_int_not_equal(amxc_llist_new(&llist), -1);
76  assert_ptr_not_equal(llist, NULL);
77  assert_ptr_equal(llist->head, NULL);
78  assert_ptr_equal(llist->tail, NULL);
79  amxc_llist_delete(&llist, NULL);
80  assert_ptr_equal(llist, NULL);
81 }
82 
84  // passing NULL pointers should not lead to segfault
85  assert_int_equal(amxc_llist_init(NULL), -1);
86  amxc_llist_clean(NULL, NULL);
87 }
88 
89 void amxc_llist_init_clean_check(UNUSED void** state) {
91 
92  assert_int_equal(amxc_llist_init(&llist), 0);
93  assert_ptr_equal(llist.head, NULL);
94  assert_ptr_equal(llist.tail, NULL);
95  amxc_llist_clean(&llist, NULL);
96 }
97 
99 
101  assert_ptr_equal(it, &s_it_func_check);
102 }
103 
105  amxc_llist_t* llist = NULL;
106 
107  // create list
108  assert_int_not_equal(amxc_llist_new(&llist), -1);
109  assert_int_equal(amxc_llist_it_init(&s_it_func_check), 0);
110  assert_int_equal(amxc_llist_append(llist, &s_it_func_check), 0);
111 
113 }
114 
116  amxc_llist_t* llist = NULL;
117 
118  // create list
119  assert_int_not_equal(amxc_llist_new(&llist), -1);
120  assert_int_equal(amxc_llist_it_init(&s_it_func_check), 0);
121  assert_int_equal(amxc_llist_append(llist, &s_it_func_check), 0);
122 
124 
126 }
127 
128 void amxc_llist_delete_cb_check(UNUSED void** state) {
129  amxc_llist_t* llist = NULL;
130 
131  // create list
132  assert_int_not_equal(amxc_llist_new(&llist), -1);
133  assert_int_equal(amxc_llist_it_init(&s_it_func_check), 0);
134  assert_int_equal(amxc_llist_append(llist, &s_it_func_check), 0);
135  amxc_llist_delete(&llist, NULL);
136  assert_ptr_equal(s_it_func_check.next, NULL);
137  assert_ptr_equal(s_it_func_check.prev, NULL);
138  assert_ptr_equal(s_it_func_check.llist, NULL);
139 }
140 
141 void amxc_llist_clean_cb_check(UNUSED void** state) {
142  amxc_llist_t* llist = NULL;
143 
144  // create list
145  assert_int_not_equal(amxc_llist_new(&llist), -1);
146  assert_int_equal(amxc_llist_it_init(&s_it_func_check), 0);
147  assert_int_equal(amxc_llist_append(llist, &s_it_func_check), 0);
148  amxc_llist_clean(llist, NULL);
149  assert_ptr_equal(s_it_func_check.next, NULL);
150  assert_ptr_equal(s_it_func_check.prev, NULL);
151  assert_ptr_equal(s_it_func_check.llist, NULL);
152  amxc_llist_delete(&llist, NULL);
153 }
154 
156  amxc_llist_t* llist = NULL;
158 
159  assert_int_equal(amxc_llist_new(&llist), 0);
160  assert_int_equal(amxc_llist_it_init(&it1), 0);
161 
162  // passing NULL pointers should not lead to segfault
163  assert_int_not_equal(amxc_llist_append(NULL, NULL), 0);
164  assert_int_not_equal(amxc_llist_append(llist, NULL), 0);
165  assert_int_not_equal(amxc_llist_append(NULL, &it1), 0);
166 
167  amxc_llist_delete(&llist, NULL);
168 }
169 
170 void amxc_llist_append_check(UNUSED void** state) {
171  amxc_llist_t* llist = NULL;
174 
175  assert_int_equal(amxc_llist_new(&llist), 0);
176  assert_int_equal(amxc_llist_it_init(&it1), 0);
177  assert_int_equal(amxc_llist_it_init(&it2), 0);
178 
179  // append iterator 1
180  assert_int_equal(amxc_llist_append(llist, &it1), 0);
181  assert_ptr_equal(llist->head, &it1);
182  assert_ptr_equal(llist->tail, &it1);
183  assert_ptr_equal(it1.next, NULL);
184  assert_ptr_equal(it1.prev, NULL);
185  assert_ptr_equal(it1.llist, llist);
186 
187  // append iterator 2
188  assert_int_equal(amxc_llist_append(llist, &it2), 0);
189  assert_ptr_equal(llist->head, &it1);
190  assert_ptr_equal(llist->tail, &it2);
191  assert_ptr_equal(it1.next, &it2);
192  assert_ptr_equal(it2.prev, &it1);
193  assert_ptr_equal(it1.prev, NULL);
194  assert_ptr_equal(it2.next, NULL);
195  assert_ptr_equal(it2.llist, llist);
196 
197  amxc_llist_delete(&llist, NULL);
198 }
199 
201  amxc_llist_t* llist = NULL;
203 
204  assert_int_equal(amxc_llist_new(&llist), 0);
205  assert_int_equal(amxc_llist_it_init(&it1), 0);
206 
207  // passing NULL pointers should not lead to segfault
208  assert_int_not_equal(amxc_llist_prepend(NULL, NULL), 0);
209  assert_int_not_equal(amxc_llist_prepend(llist, NULL), 0);
210  assert_int_not_equal(amxc_llist_prepend(NULL, &it1), 0);
211 
212  amxc_llist_delete(&llist, NULL);
213 }
214 
215 void amxc_llist_prepend_check(UNUSED void** state) {
216  amxc_llist_t* llist = NULL;
219 
220  assert_int_equal(amxc_llist_new(&llist), 0);
221  assert_int_equal(amxc_llist_it_init(&it1), 0);
222  assert_int_equal(amxc_llist_it_init(&it2), 0);
223 
224  // prepend iterator 1
225  assert_int_equal(amxc_llist_prepend(llist, &it1), 0);
226  assert_ptr_equal(llist->head, &it1);
227  assert_ptr_equal(llist->tail, &it1);
228  assert_ptr_equal(it1.next, NULL);
229  assert_ptr_equal(it1.prev, NULL);
230  assert_ptr_equal(it1.llist, llist);
231 
232  // append iterator 2
233  assert_int_equal(amxc_llist_prepend(llist, &it2), 0);
234  assert_ptr_equal(llist->head, &it2);
235  assert_ptr_equal(llist->tail, &it1);
236  assert_ptr_equal(it2.next, &it1);
237  assert_ptr_equal(it1.prev, &it2);
238  assert_ptr_equal(it2.prev, NULL);
239  assert_ptr_equal(it1.next, NULL);
240  assert_ptr_equal(it2.llist, llist);
241 
242  amxc_llist_delete(&llist, NULL);
243 }
244 
245 static amxc_llist_t* llist = NULL;
246 static amxc_llist_t* llist1 = NULL;
247 static amxc_llist_t* llist2 = NULL;
252 
253 static void amxc_llist_setup(void) {
254  assert_int_equal(amxc_llist_new(&llist1), 0);
255  assert_int_equal(amxc_llist_new(&llist2), 0);
256  assert_int_equal(amxc_llist_it_init(&it1), 0);
257  assert_int_equal(amxc_llist_it_init(&it2), 0);
258  assert_int_equal(amxc_llist_it_init(&it3), 0);
259  assert_int_equal(amxc_llist_it_init(&it4), 0);
260  assert_int_equal(amxc_llist_append(llist1, &it1), 0);
261  assert_int_equal(amxc_llist_append(llist1, &it2), 0);
262  assert_int_equal(amxc_llist_append(llist1, &it3), 0);
263 }
264 
265 static void amxc_llist_teardown(void) {
266  amxc_llist_delete(&llist1, NULL);
267  amxc_llist_delete(&llist2, NULL);
268 }
269 
272  // move iterator 1 from head to tail in llist1
273  assert_int_equal(amxc_llist_append(llist1, &it1), 0);
274  assert_ptr_equal(llist1->head, &it2);
275  assert_ptr_equal(llist1->tail, &it1);
276  assert_ptr_equal(it1.next, NULL);
277  assert_ptr_equal(it1.prev, &it3);
278  assert_ptr_equal(it2.next, &it3);
279  assert_ptr_equal(it2.prev, NULL);
280  assert_ptr_equal(it3.next, &it1);
281  assert_ptr_equal(it3.prev, &it2);
282  assert_ptr_equal(it1.llist, llist1);
283 
284  // move iterator 3 to tail in llist1
285  assert_int_equal(amxc_llist_append(llist1, &it3), 0);
286  assert_ptr_equal(llist1->head, &it2);
287  assert_ptr_equal(llist1->tail, &it3);
288  assert_ptr_equal(it1.prev, &it2);
289  assert_ptr_equal(it1.next, &it3);
290  assert_ptr_equal(it2.next, &it1);
291  assert_ptr_equal(it2.prev, NULL);
292  assert_ptr_equal(it3.next, NULL);
293  assert_ptr_equal(it3.prev, &it1);
294  assert_ptr_equal(it3.llist, llist1);
296 }
297 
300  // move iterator 3 from tail to head in llist1
301  assert_int_equal(amxc_llist_prepend(llist1, &it3), 0);
302  assert_ptr_equal(llist1->head, &it3);
303  assert_ptr_equal(llist1->tail, &it2);
304  assert_ptr_equal(it1.next, &it2);
305  assert_ptr_equal(it1.prev, &it3);
306  assert_ptr_equal(it2.next, NULL);
307  assert_ptr_equal(it2.prev, &it1);
308  assert_ptr_equal(it3.next, &it1);
309  assert_ptr_equal(it3.prev, NULL);
310  assert_ptr_equal(it3.llist, llist1);
311 
312  // move iterator 2 to tail in llist1
313  assert_int_equal(amxc_llist_prepend(llist1, &it2), 0);
314  assert_ptr_equal(llist1->head, &it2);
315  assert_ptr_equal(llist1->tail, &it1);
316  assert_ptr_equal(it1.prev, &it3);
317  assert_ptr_equal(it1.next, NULL);
318  assert_ptr_equal(it2.next, &it3);
319  assert_ptr_equal(it2.prev, NULL);
320  assert_ptr_equal(it3.next, &it1);
321  assert_ptr_equal(it3.prev, &it2);
322  assert_ptr_equal(it2.llist, llist1);
324 }
325 
327  // passing NULL pointers should not lead to segfault
328  assert_int_equal(amxc_llist_is_empty(NULL), true);
329 }
330 
331 void amxc_llist_is_empty_check(UNUSED void** state) {
332  amxc_llist_t* llist = NULL;
334 
335  assert_int_equal(amxc_llist_new(&llist), 0);
336  assert_int_equal(amxc_llist_it_init(&it1), 0);
337 
338  assert_int_equal(amxc_llist_is_empty(llist), true);
339  assert_int_equal(amxc_llist_append(llist, &it1), 0);
340  assert_int_equal(amxc_llist_is_empty(llist), false);
341 
342  amxc_llist_delete(&llist, NULL);
343 }
344 
345 void amxc_llist_size_null_check(UNUSED void** state) {
346  // passing NULL pointers should not lead to segfault
347  assert_int_equal(amxc_llist_size(NULL), 0);
348 }
349 
350 void amxc_llist_size_check(UNUSED void** state) {
351  amxc_llist_t* llist = NULL;
354 
355  assert_int_equal(amxc_llist_new(&llist), 0);
356  assert_int_equal(amxc_llist_it_init(&it1), 0);
357  assert_int_equal(amxc_llist_it_init(&it2), 0);
358 
359  assert_int_equal(amxc_llist_size(llist), 0);
360  assert_int_equal(amxc_llist_append(llist, &it1), 0);
361  assert_int_equal(amxc_llist_size(llist), 1);
362  assert_int_equal(amxc_llist_append(llist, &it2), 0);
363  assert_int_equal(amxc_llist_size(llist), 2);
364 
365  amxc_llist_clean(llist, NULL);
366  assert_int_equal(amxc_llist_size(llist), 0);
367 
368  amxc_llist_delete(&llist, NULL);
369 }
370 
371 void amxc_llist_get_at_check(UNUSED void** state) {
373  assert_ptr_equal(amxc_llist_get_at(NULL, 10), NULL);
374  assert_ptr_equal(amxc_llist_get_at(llist1, 0), &it1);
375  assert_ptr_equal(amxc_llist_get_at(llist1, 1), &it2);
376  assert_ptr_equal(amxc_llist_get_at(llist1, 2), &it3);
377  assert_ptr_equal(amxc_llist_get_at(llist1, 3), NULL);
379 }
380 
381 void amxc_llist_set_at_check(UNUSED void** state) {
384  assert_int_equal(amxc_llist_set_at(NULL, 10, &it1), -1);
385 
386  assert_int_equal(amxc_llist_it_init(&it), 0);
387 
388  assert_int_equal(amxc_llist_set_at(llist1, 0, &it), 0);
389  assert_ptr_equal(it.next, &it1);
390  assert_ptr_equal(it.prev, NULL);
392 
393  assert_int_equal(amxc_llist_set_at(llist1, 1, &it), 0);
394  assert_ptr_equal(it.next, &it2);
395  assert_ptr_equal(it.prev, &it1);
397 
398  assert_int_equal(amxc_llist_set_at(llist1, 2, &it), 0);
399  assert_ptr_equal(it.next, &it3);
400  assert_ptr_equal(it.prev, &it2);
402 
403  assert_int_equal(amxc_llist_set_at(llist1, 3, &it), 0);
404  assert_ptr_equal(it.next, NULL);
405  assert_ptr_equal(it.prev, &it3);
407 
408  assert_int_equal(amxc_llist_set_at(llist1, 10, &it), -1);
409  assert_ptr_equal(it.next, NULL);
410  assert_ptr_equal(it.prev, NULL);
413 }
414 
415 void amxc_llist_get_first_check(UNUSED void** state) {
416  assert_ptr_equal(amxc_llist_get_first(NULL), NULL);
417 }
418 
419 void amxc_llist_get_last_check(UNUSED void** state) {
420  assert_ptr_equal(amxc_llist_get_last(NULL), NULL);
421 }
422 
424  // passing NULL pointers should not lead to segfault
425  assert_int_equal(amxc_llist_it_init(NULL), -1);
426 }
427 
428 void amxc_llist_it_init_check(UNUSED void** state) {
430 
431  assert_int_equal(amxc_llist_it_init(&it), 0);
432  assert_ptr_equal(it.next, NULL);
433  assert_ptr_equal(it.prev, NULL);
434  assert_ptr_equal(it.llist, NULL);
435 }
436 
439 
440  assert_int_equal(amxc_llist_it_init(&it), 0);
441 
442  // passing NULL pointers should not lead to segfault
444  amxc_llist_it_clean(&it, NULL);
445 }
446 
447 void amxc_llist_it_clean_check(UNUSED void** state) {
449 
450  assert_int_equal(amxc_llist_it_init(&it), 0);
451  amxc_llist_it_clean(&it, NULL);
452 }
453 
455  assert_int_equal(amxc_llist_it_init(&s_it_func_check), 0);
457 }
458 
459 static void amxc_llist_it_setup(void) {
460  assert_int_equal(amxc_llist_new(&llist), 0);
461  assert_int_equal(amxc_llist_it_init(&it1), 0);
462  assert_int_equal(amxc_llist_it_init(&it2), 0);
463  assert_int_equal(amxc_llist_it_init(&it3), 0);
464  assert_int_equal(amxc_llist_append(llist, &it1), 0);
465  assert_int_equal(amxc_llist_append(llist, &it2), 0);
466  assert_int_equal(amxc_llist_append(llist, &it3), 0);
467 
468  assert_int_equal(amxc_llist_it_init(&s_it_func_check), 0);
469 }
470 
471 static void amxc_llist_it_teardown(void) {
472  amxc_llist_delete(&llist, NULL);
473 }
474 
476  amxc_llist_it_take(NULL);
477 }
478 
479 void amxc_llist_it_take_check(UNUSED void** state) {
482  assert_ptr_equal(llist->head, &it1);
483  assert_ptr_equal(llist->tail, &it3);
484  assert_ptr_equal(it1.next, &it3);
485  assert_ptr_equal(it1.prev, NULL);
486  assert_ptr_equal(it2.next, NULL);
487  assert_ptr_equal(it2.prev, NULL);
488  assert_ptr_equal(it3.next, NULL);
489  assert_ptr_equal(it3.prev, &it1);
490  assert_ptr_equal(it2.llist, NULL);
492 }
493 
497  // remove the iterator again should not lead to segfault
500 }
501 
504  assert_int_equal(amxc_llist_it_insert_before(NULL, NULL), -1);
505  assert_int_equal(amxc_llist_it_insert_before(&it1, NULL), -1);
506  assert_ptr_equal(it1.next, &it2);
507  assert_ptr_equal(it1.prev, NULL);
508  assert_ptr_equal(it1.llist, llist);
509  assert_int_equal(amxc_llist_it_insert_before(NULL, &it1), -1);
510  assert_ptr_equal(it1.next, &it2);
511  assert_ptr_equal(it1.prev, NULL);
512  assert_ptr_equal(it1.llist, llist);
514 }
515 
518  assert_int_equal(amxc_llist_it_insert_before(&it2, &s_it_func_check), 0);
519  assert_ptr_equal(it1.next, &s_it_func_check);
520  assert_ptr_equal(it1.prev, NULL);
521  assert_ptr_equal(it2.next, &it3);
522  assert_ptr_equal(it2.prev, &s_it_func_check);
523  assert_ptr_equal(s_it_func_check.next, &it2);
524  assert_ptr_equal(s_it_func_check.prev, &it1);
525  assert_ptr_equal(s_it_func_check.llist, llist);
527 }
528 
531  assert_int_equal(amxc_llist_it_insert_before(&it1, &s_it_func_check), 0);
532  assert_ptr_equal(it1.next, &it2);
533  assert_ptr_equal(it1.prev, &s_it_func_check);
534  assert_ptr_equal(s_it_func_check.next, &it1);
535  assert_ptr_equal(s_it_func_check.prev, NULL);
536  assert_ptr_equal(s_it_func_check.llist, llist);
538 }
539 
543 
544  assert_int_equal(amxc_llist_it_insert_before(&it2, &s_it_func_check), -1);
545  assert_ptr_equal(it2.next, NULL);
546  assert_ptr_equal(it2.prev, NULL);
547  assert_ptr_equal(s_it_func_check.next, NULL);
548  assert_ptr_equal(s_it_func_check.prev, NULL);
549  assert_ptr_equal(s_it_func_check.llist, NULL);
551 }
552 
555  assert_int_equal(amxc_llist_it_insert_after(NULL, NULL), -1);
556  assert_int_equal(amxc_llist_it_insert_after(&it1, NULL), -1);
557  assert_ptr_equal(it1.next, &it2);
558  assert_ptr_equal(it1.prev, NULL);
559  assert_ptr_equal(it1.llist, llist);
560  assert_int_equal(amxc_llist_it_insert_after(NULL, &it1), -1);
561  assert_ptr_equal(it1.next, &it2);
562  assert_ptr_equal(it1.prev, NULL);
563  assert_ptr_equal(it1.llist, llist);
565 }
566 
569  assert_int_equal(amxc_llist_it_insert_after(&it2, &s_it_func_check), 0);
570  assert_ptr_equal(it3.next, NULL);
571  assert_ptr_equal(it3.prev, &s_it_func_check);
572  assert_ptr_equal(it2.next, &s_it_func_check);
573  assert_ptr_equal(it2.prev, &it1);
574  assert_ptr_equal(s_it_func_check.next, &it3);
575  assert_ptr_equal(s_it_func_check.prev, &it2);
576  assert_ptr_equal(s_it_func_check.llist, llist);
578 }
579 
582  assert_int_equal(amxc_llist_it_insert_after(&it3, &s_it_func_check), 0);
583  assert_ptr_equal(it3.next, &s_it_func_check);
584  assert_ptr_equal(it3.prev, &it2);
585  assert_ptr_equal(s_it_func_check.next, NULL);
586  assert_ptr_equal(s_it_func_check.prev, &it3);
587  assert_ptr_equal(s_it_func_check.llist, llist);
589 }
590 
594 
595  assert_int_equal(amxc_llist_it_insert_after(&it2, &s_it_func_check), -1);
596  assert_ptr_equal(it2.next, NULL);
597  assert_ptr_equal(it2.prev, NULL);
598  assert_ptr_equal(s_it_func_check.next, NULL);
599  assert_ptr_equal(s_it_func_check.prev, NULL);
600  assert_ptr_equal(s_it_func_check.llist, NULL);
602 }
603 
607 
608  assert_int_equal(amxc_llist_it_init(&it), 0);
609  assert_int_equal(amxc_llist_it_index_of(NULL), AMXC_LLIST_RANGE);
610  assert_int_equal(amxc_llist_it_index_of(&it1), 0);
611  assert_int_equal(amxc_llist_it_index_of(&it2), 1);
612  assert_int_equal(amxc_llist_it_index_of(&it3), 2);
613  assert_int_equal(amxc_llist_it_index_of(&it), AMXC_LLIST_RANGE);
615 }
616 
619 
620  assert_ptr_equal(amxc_llist_it_get_next(NULL), NULL);
621  assert_ptr_equal(amxc_llist_it_get_previous(NULL), NULL);
622 
623  assert_ptr_equal(amxc_llist_it_get_next(&it1), &it2);
624  assert_ptr_equal(amxc_llist_it_get_previous(&it2), &it1);
625  assert_ptr_equal(amxc_llist_it_get_previous(&it1), NULL);
626  assert_ptr_equal(amxc_llist_it_get_next(&it3), NULL);
627 
629 }
630 
634 
635  assert_int_equal(amxc_llist_it_init(&it), 0);
636 
637  assert_false(amxc_llist_it_is_in_list(NULL));
638  assert_false(amxc_llist_it_is_in_list(&it));
639  assert_true(amxc_llist_it_is_in_list(&it1));
640  assert_true(amxc_llist_it_is_in_list(&it2));
641  assert_true(amxc_llist_it_is_in_list(&it3));
642 
644 }
645 
646 void amxc_llist_take_at_check(UNUSED void** state) {
648 
649  assert_ptr_equal(amxc_llist_take_at(NULL, 0), NULL);
650  assert_ptr_equal(amxc_llist_take_at(NULL, 1), NULL);
651 
652  assert_ptr_equal(amxc_llist_take_at(llist, 2), &it3);
653  assert_ptr_equal(amxc_llist_take_at(llist, 0), &it1);
654  assert_ptr_equal(amxc_llist_take_at(llist, 0), &it2);
655 
657 }
658 
661 
662  assert_ptr_equal(amxc_llist_get_first(llist1), &it1);
663  assert_int_equal(amxc_llist_it_swap(&it1, &it2), 0);
664  assert_ptr_equal(amxc_llist_get_first(llist1), &it2);
665  assert_ptr_equal(amxc_llist_it_get_next(&it1), &it3);
666  assert_ptr_equal(amxc_llist_it_get_previous(&it1), &it2);
667  assert_ptr_equal(amxc_llist_it_get_previous(&it2), NULL);
668  assert_ptr_equal(amxc_llist_it_get_next(&it2), &it1);
669 
670  assert_int_equal(amxc_llist_it_swap(&it3, &it2), 0);
671  assert_ptr_equal(amxc_llist_get_first(llist1), &it3);
672  assert_ptr_equal(amxc_llist_it_get_next(&it1), &it2);
673  assert_ptr_equal(amxc_llist_it_get_previous(&it1), &it3);
674  assert_ptr_equal(amxc_llist_it_get_previous(&it3), NULL);
675  assert_ptr_equal(amxc_llist_it_get_next(&it3), &it1);
676  assert_ptr_equal(amxc_llist_get_last(llist1), &it2);
677 
678  assert_int_equal(amxc_llist_it_swap(&it1, &it3), 0);
679  assert_int_equal(amxc_llist_it_swap(&it2, &it3), 0);
680  assert_ptr_equal(amxc_llist_get_first(llist1), &it1);
681  assert_ptr_equal(amxc_llist_it_get_next(&it1), &it2);
682  assert_ptr_equal(amxc_llist_it_get_next(&it2), &it3);
683  assert_ptr_equal(amxc_llist_it_get_next(&it3), NULL);
684  assert_ptr_equal(amxc_llist_get_last(llist1), &it3);
685  assert_ptr_equal(amxc_llist_it_get_previous(&it3), &it2);
686  assert_ptr_equal(amxc_llist_it_get_previous(&it2), &it1);
687  assert_ptr_equal(amxc_llist_it_get_previous(&it1), NULL);
688 
689  assert_int_equal(amxc_llist_it_swap(&it1, &it1), 0);
690  assert_int_not_equal(amxc_llist_it_swap(&it1, NULL), 0);
691  assert_int_not_equal(amxc_llist_it_swap(NULL, &it1), 0);
692 
694 }
695 
698 
699  assert_int_equal(amxc_llist_append(llist2, &it4), 0);
700  assert_int_equal(amxc_llist_it_swap(&it4, &it1), 0);
701  assert_ptr_equal(it4.llist, llist1);
702  assert_ptr_equal(it1.llist, llist2);
703 
704  assert_ptr_equal(amxc_llist_it_get_next(&it1), NULL);
705  assert_ptr_equal(amxc_llist_it_get_previous(&it1), NULL);
706 
707  assert_ptr_equal(amxc_llist_it_get_next(&it4), &it2);
708  assert_ptr_equal(amxc_llist_it_get_previous(&it4), NULL);
709 
711  assert_ptr_equal(it3.llist, NULL);
712  assert_int_equal(amxc_llist_it_swap(&it4, &it3), 0);
713 
715 }
716 
717 typedef struct {
719  char data;
720 } test_data_t;
721 
725 
726  if(d1->data < d2->data) {
727  return -1;
728  } else if(d1->data > d2->data) {
729  return 1;
730  }
731 
732  return 0;
733 }
734 
737  free(d);
738 }
739 
740 void test_amxc_llist_sort(UNUSED void** state) {
742  const char data[16] = "KRATELEPUIMQCXOS";
743  const char sorted[16] = "ACEEIKLMOPQRSTUX";
744 
746  for(int i = 0; i < 16; i++) {
747  test_data_t* item = calloc(1, sizeof(test_data_t));
748  item->data = data[i];
749  amxc_llist_append(&llist, &item->it);
750  }
751 
752  assert_int_equal(amxc_llist_sort(&llist, test_cmp), 0);
754  for(unsigned int index = 0; index < 16; index++) {
756  printf("%c\n", d->data);
757  assert_int_equal(d->data, sorted[index]);
759  }
761 
763  assert_int_equal(amxc_llist_sort(&llist, test_cmp), 0);
765 
766  assert_int_not_equal(amxc_llist_sort(&llist, NULL), 0);
767  assert_int_not_equal(amxc_llist_sort(NULL, test_cmp), 0);
768 }
769 
770 
771 void test_amxc_llist_move(UNUSED void** state) {
772  amxc_llist_t src;
773  amxc_llist_t dst;
774  const char data[16] = "KRATELEPUIMQCXOS";
775 
776  amxc_llist_init(&src);
777  amxc_llist_init(&dst);
778  for(int i = 0; i < 16; i++) {
779  test_data_t* item = calloc(1, sizeof(test_data_t));
780  item->data = data[i];
781  amxc_llist_append(&src, &item->it);
782  }
783  assert_int_equal(amxc_llist_size(&src), 16);
784  assert_int_equal(amxc_llist_size(&dst), 0);
785 
786  assert_int_equal(amxc_llist_move(&dst, &src), 0);
787  assert_int_equal(amxc_llist_size(&src), 0);
788  assert_int_equal(amxc_llist_size(&dst), 16);
789 
790  for(int i = 0; i < 16; i++) {
791  test_data_t* item = calloc(1, sizeof(test_data_t));
792  item->data = data[i];
793  amxc_llist_append(&src, &item->it);
794  }
795 
796  assert_int_equal(amxc_llist_size(&src), 16);
797  assert_int_equal(amxc_llist_size(&dst), 16);
798 
799  assert_int_equal(amxc_llist_move(&dst, &src), 0);
800  assert_int_equal(amxc_llist_size(&src), 0);
801  assert_int_equal(amxc_llist_size(&dst), 32);
802 
803  assert_int_not_equal(amxc_llist_move(&dst, NULL), 0);
804  assert_int_not_equal(amxc_llist_move(NULL, &src), 0);
805 
808 }
Ambiorix linked list API header file.
#define AMXC_LLIST_RANGE
Definition: amxc_llist.h:69
#define UNUSED
Definition: amxc_macros.h:70
int amxc_llist_it_init(amxc_llist_it_t *const it)
Initializes a linked list iterator.
Definition: amxc_llist_it.c:89
AMXC_INLINE bool amxc_llist_it_is_in_list(const amxc_llist_it_t *const it)
Checks that an iterator is in a list.
Definition: amxc_llist.h:857
AMXC_INLINE amxc_llist_it_t * amxc_llist_it_get_previous(const amxc_llist_it_t *const reference)
Gets the previous iterator in the list.
Definition: amxc_llist.h:842
int amxc_llist_it_insert_after(amxc_llist_it_t *const reference, amxc_llist_it_t *const it)
Inserts an iterator after another reference interator in the list.
int amxc_llist_it_insert_before(amxc_llist_it_t *const reference, amxc_llist_it_t *const it)
Inserts an iterator before a reference interator in the list.
AMXC_INLINE amxc_llist_it_t * amxc_llist_it_get_next(const amxc_llist_it_t *const reference)
Gets the next iterator in the list.
Definition: amxc_llist.h:824
void amxc_llist_it_clean(amxc_llist_it_t *const it, amxc_llist_it_delete_t func)
Removes the iterator from the list and frees allocated memory.
void amxc_llist_it_take(amxc_llist_it_t *const it)
Removes the iterator from the list.
#define amxc_llist_it_get_data(it, type, member)
Gets the data pointer from a linked list iterator.
Definition: amxc_llist.h:238
unsigned int amxc_llist_it_index_of(const amxc_llist_it_t *const it)
Gets the index of an iterator in the list.
int amxc_llist_it_swap(amxc_llist_it_t *it1, amxc_llist_it_t *it2)
Swaps two linked list iterators.
int amxc_llist_move(amxc_llist_t *const dest, amxc_llist_t *const src)
Moves all items from one linked list to another linked list.
Definition: amxc_llist.c:135
void amxc_llist_delete(amxc_llist_t **llist, amxc_llist_it_delete_t func)
Frees the previously allocated linked list.
Definition: amxc_llist.c:101
AMXC_INLINE amxc_llist_it_t * amxc_llist_take_at(const amxc_llist_t *llist, const unsigned int index)
Removes an item at a certain position of the linked list.
Definition: amxc_llist.h:803
size_t amxc_llist_size(const amxc_llist_t *const llist)
Calculates the size of the linked list.
Definition: amxc_llist.c:151
int amxc_llist_new(amxc_llist_t **llist)
Allocates a linked list.
Definition: amxc_llist.c:88
int amxc_llist_append(amxc_llist_t *const llist, amxc_llist_it_t *const it)
Adds an item to the end of the linked list.
Definition: amxc_llist.c:169
int amxc_llist_init(amxc_llist_t *const llist)
Initializes a linked list.
Definition: amxc_llist.c:111
int amxc_llist_sort(amxc_llist_t *const llist, amxc_llist_it_cmp_t cmp)
Sorts a linked list.
Definition: amxc_llist.c:262
bool amxc_llist_is_empty(const amxc_llist_t *const llist)
Checks that the linked list is empty.
Definition: amxc_llist.c:165
amxc_llist_it_t * amxc_llist_get_at(const amxc_llist_t *const llist, const unsigned int index)
Gets an item at a certain position of the linked list.
Definition: amxc_llist.c:222
void amxc_llist_clean(amxc_llist_t *const llist, amxc_llist_it_delete_t func)
Removes all items from the linked list.
Definition: amxc_llist.c:124
int amxc_llist_set_at(amxc_llist_t *llist, const unsigned int index, amxc_llist_it_t *const it)
Inserts an item at a certain position.
Definition: amxc_llist.c:237
AMXC_INLINE amxc_llist_it_t * amxc_llist_get_last(const amxc_llist_t *const llist)
Gets the last item of the linked list.
Definition: amxc_llist.h:732
int amxc_llist_prepend(amxc_llist_t *const llist, amxc_llist_it_t *const it)
Adds an item to the beginning of the linked list.
Definition: amxc_llist.c:196
AMXC_INLINE amxc_llist_it_t * amxc_llist_get_first(const amxc_llist_t *const llist)
Gets the first item of the linked list.
Definition: amxc_llist.h:713
amxc_htable_it_t * next
Definition: amxc_htable.h:141
The linked list iterator structure.
Definition: amxc_llist.h:215
struct _amxc_llist_it * next
Definition: amxc_llist.h:216
struct _amxc_llist * llist
Definition: amxc_llist.h:220
struct _amxc_llist_it * prev
Definition: amxc_llist.h:218
The linked list structure.
Definition: amxc_llist.h:228
amxc_llist_it_t * head
Definition: amxc_llist.h:229
amxc_llist_it_t * tail
Definition: amxc_llist.h:230
amxc_llist_it_t it
char data[]
static amxc_htable_it_t it[2000]
void amxc_llist_new_delete_null_check(UNUSED void **state)
void amxc_llist_it_take_double_check(UNUSED void **state)
void amxc_llist_append_move_same_list_check(UNUSED void **state)
void amxc_llist_it_take_check(UNUSED void **state)
void amxc_llist_size_null_check(UNUSED void **state)
void test_amxc_llist_move(UNUSED void **state)
static amxc_llist_t * llist1
void amxc_llist_init_clean_null_check(UNUSED void **state)
void amxc_llist_swap_in_same_llist_check(UNUSED void **state)
void amxc_llist_init_clean_check(UNUSED void **state)
void amxc_llist_it_clean_check(UNUSED void **state)
void amxc_llist_prepend_check(UNUSED void **state)
void amxc_llist_it_clean_cb_check(UNUSED void **state)
static void amxc_llist_setup(void)
void amxc_llist_get_last_check(UNUSED void **state)
void amxc_llist_new_delete_check(UNUSED void **state)
void amxc_llist_prepend_move_same_list_check(UNUSED void **state)
void test_amxc_llist_sort(UNUSED void **state)
static void check_it_delete_func(amxc_llist_it_t *it)
void amxc_llist_it_init_null_check(UNUSED void **state)
static amxc_llist_it_t it3
void amxc_llist_it_insert_after_invalid_it_check(UNUSED void **state)
static amxc_llist_it_t s_it_func_check
void amxc_llist_is_empty_check(UNUSED void **state)
void amxc_llist_swap_in_different_llist_check(UNUSED void **state)
static amxc_llist_t * llist
void amxc_llist_prepend_null_check(UNUSED void **state)
void amxc_llist_get_at_check(UNUSED void **state)
static void amxc_llist_it_setup(void)
void amxc_llist_it_insert_after_tail_check(UNUSED void **state)
void amxc_llist_take_at_check(UNUSED void **state)
static amxc_llist_it_t it4
void amxc_llist_it_index_of_check(UNUSED void **state)
static int test_cmp(amxc_llist_it_t *it1, amxc_llist_it_t *it2)
void amxc_llist_append_null_check(UNUSED void **state)
void amxc_llist_it_insert_before_null_check(UNUSED void **state)
void amxc_llist_delete_func_check(UNUSED void **state)
void amxc_llist_it_insert_after_null_check(UNUSED void **state)
void amxc_llist_it_next_prev_check(UNUSED void **state)
void amxc_llist_size_check(UNUSED void **state)
void amxc_llist_set_at_check(UNUSED void **state)
static void amxc_llist_it_teardown(void)
void amxc_llist_it_clean_null_check(UNUSED void **state)
void amxc_llist_it_insert_before_invalid_it_check(UNUSED void **state)
void amxc_llist_it_is_in_list_check(UNUSED void **state)
void amxc_llist_it_take_null_check(UNUSED void **state)
void amxc_llist_it_insert_after_check(UNUSED void **state)
void amxc_llist_it_init_check(UNUSED void **state)
static amxc_llist_it_t it2
void amxc_llist_clean_func_check(UNUSED void **state)
void amxc_llist_it_insert_before_head_check(UNUSED void **state)
static amxc_llist_t * llist2
static void test_del_data(amxc_llist_it_t *it)
static amxc_llist_it_t it1
void amxc_llist_clean_cb_check(UNUSED void **state)
void amxc_llist_is_empty_null_check(UNUSED void **state)
void amxc_llist_it_insert_before_check(UNUSED void **state)
void amxc_llist_get_first_check(UNUSED void **state)
static void amxc_llist_teardown(void)
void amxc_llist_delete_cb_check(UNUSED void **state)
void amxc_llist_append_check(UNUSED void **state)