27
#include "eina_suite.h"
34
_filter(const void *it EINA_UNUSED, void *data, void *fdata)
36
struct Number *numb = data;
38
ck_assert_ptr_eq(fdata, (void*)1);
39
return numb->number % 2;
42
EFL_START_TEST(eina_iterator_filter_simple)
44
Eina_Iterator *it, *filtered;
47
ea = eina_array_new(11);
50
for(int i = 0; i <= 10; i++)
52
struct Number *number;
54
number = calloc(1, sizeof(struct Number));
57
eina_array_push(ea, number);
60
it = eina_array_iterator_new(ea);
61
filtered = eina_iterator_filter_new(it, _filter, NULL, (void*)1);
62
for(int i = 1; i <= 10; i+=2)
67
ret = eina_iterator_next(filtered, (void**)&numb);
70
ck_assert_int_eq(numb->number, i);
77
ret = eina_iterator_next(filtered, (void**)&numb);
82
eina_iterator_free(it);
94
_filter_free(const void *it EINA_UNUSED, void *data EINA_UNUSED, void *fdata EINA_UNUSED)
102
struct Free_test *test = data;
103
test->got_freed = EINA_TRUE;
106
EFL_START_TEST(eina_iterator_filter_free)
108
Eina_Iterator *it, *filtered;
110
struct Free_test *data;
112
data = calloc(1, sizeof(struct Free_test));
113
ea = eina_array_new(11);
116
it = eina_array_iterator_new(ea);
117
filtered = eina_iterator_filter_new(it, _filter_free, _free, data);
118
eina_iterator_free(filtered);
122
ck_assert_int_ne(data->got_freed, 0);
129
eina_iterator_array_check(EINA_UNUSED const Eina_Array *array,
130
int *data, int *fdata)
132
fail_if(*fdata > *data);
138
EFL_START_TEST(eina_iterator_array_simple)
145
ea = eina_array_new(11);
148
for (i = 0; i < 200; ++i)
150
tmp = malloc(sizeof(int));
154
eina_array_push(ea, tmp);
157
it = eina_array_iterator_new(ea);
161
eina_iterator_foreach(it, EINA_EACH_CB(eina_iterator_array_check), &i);
164
fail_if(eina_iterator_container_get(it) != ea);
165
fail_if(eina_iterator_next(it, (void **)&tmp) != EINA_FALSE);
167
eina_iterator_free(it);
175
eina_iterator_hash_key_check(const Eina_Hash *hash,
177
EINA_UNUSED void *fdata)
179
fail_if(eina_hash_find(hash, key) == NULL);
184
eina_iterator_hash_data_check(const Eina_Hash *hash,
186
EINA_UNUSED void *fdata)
190
snprintf(tmp, 10, "%i", *data);
191
fail_if(eina_hash_find(hash, tmp) != data);
196
eina_iterator_hash_tuple_check(EINA_UNUSED const Eina_Hash *hash,
197
Eina_Hash_Tuple *tuple,
198
EINA_UNUSED void *fdata)
200
fail_if(atoi((char *)tuple->key) != *((int *)tuple->data));
205
EFL_START_TEST(eina_iterator_hash_simple)
209
int array[] = { 1, 42, 7, 8, 6 };
212
hash = eina_hash_string_superfast_new(NULL);
213
fail_if(hash == NULL);
215
fail_if(eina_hash_add(hash, "1", &array[0]) != EINA_TRUE);
216
fail_if(eina_hash_add(hash, "42", &array[1]) != EINA_TRUE);
217
fail_if(eina_hash_add(hash, "7", &array[2]) != EINA_TRUE);
218
fail_if(eina_hash_add(hash, "8", &array[3]) != EINA_TRUE);
219
fail_if(eina_hash_add(hash, "6", &array[4]) != EINA_TRUE);
221
it = eina_hash_iterator_key_new(hash);
222
eina_iterator_foreach(it, EINA_EACH_CB(eina_iterator_hash_key_check), NULL);
223
eina_iterator_free(it);
225
it = eina_hash_iterator_data_new(hash);
226
eina_iterator_foreach(it, EINA_EACH_CB(eina_iterator_hash_data_check), NULL);
227
eina_iterator_free(it);
229
it = eina_hash_iterator_tuple_new(hash);
230
eina_iterator_foreach(it, EINA_EACH_CB(eina_iterator_hash_tuple_check), NULL);
231
eina_iterator_free(it);
233
eina_hash_free(hash);
238
typedef struct _Eina_Test_Inlist Eina_Test_Inlist;
239
struct _Eina_Test_Inlist
245
static Eina_Test_Inlist *
246
_eina_test_inlist_build(int i)
248
Eina_Test_Inlist *tmp;
250
tmp = malloc(sizeof(Eina_Test_Inlist));
258
eina_iterator_inlist_data_check(EINA_UNUSED const Eina_Inlist *in_list,
259
Eina_Test_Inlist *data,
264
case 0: fail_if(data->i != 27); break;
266
case 1: fail_if(data->i != 42); break;
268
case 2: fail_if(data->i != 3227); break;
270
case 3: fail_if(data->i != 1664); break;
272
case 4: fail_if(data->i != 81); break;
280
EFL_START_TEST(eina_iterator_inlist_simple)
282
Eina_Inlist *lst = NULL;
283
Eina_Test_Inlist *tmp;
284
Eina_Test_Inlist *prev;
288
tmp = _eina_test_inlist_build(42);
289
lst = eina_inlist_append(lst, EINA_INLIST_GET(tmp));
292
tmp = _eina_test_inlist_build(1664);
293
lst = eina_inlist_append_relative(lst, EINA_INLIST_GET(tmp), lst);
295
fail_if(((Eina_Test_Inlist *)lst)->i != 42);
298
tmp = _eina_test_inlist_build(3227);
299
lst = eina_inlist_prepend_relative(lst, EINA_INLIST_GET(
300
tmp), EINA_INLIST_GET(prev));
302
fail_if(((Eina_Test_Inlist *)lst)->i != 42);
304
tmp = _eina_test_inlist_build(27);
305
lst = eina_inlist_prepend_relative(lst, EINA_INLIST_GET(tmp), NULL);
307
tmp = _eina_test_inlist_build(81);
308
lst = eina_inlist_append_relative(lst, EINA_INLIST_GET(tmp), NULL);
310
it = eina_inlist_iterator_new(lst);
313
eina_iterator_foreach(it, EINA_EACH_CB(eina_iterator_inlist_data_check), &i);
314
eina_iterator_free(it);
321
eina_iterator_list_data_check(EINA_UNUSED const Eina_List *list,
327
case 0: fail_if(*data != 81); break;
329
case 1: fail_if(*data != 7); break;
331
case 2: fail_if(*data != 9); break;
333
case 3: fail_if(*data != 6); break;
335
case 4: fail_if(*data != 42); break;
337
case 5: fail_if(*data != 1); break;
339
case 6: fail_if(*data != 1337); break;
347
EFL_START_TEST(eina_iterator_list_simple)
349
Eina_List *list = NULL;
351
int data[] = { 6, 9, 42, 1, 7, 1337, 81, 1664 };
355
list = eina_list_append(list, &data[0]);
356
fail_if(list == NULL);
358
list = eina_list_prepend(list, &data[1]);
359
fail_if(list == NULL);
361
list = eina_list_append(list, &data[2]);
362
fail_if(list == NULL);
364
list = eina_list_append(list, &data[3]);
365
fail_if(list == NULL);
367
list = eina_list_prepend(list, &data[4]);
368
fail_if(list == NULL);
370
list = eina_list_append(list, &data[5]);
371
fail_if(list == NULL);
373
list = eina_list_prepend(list, &data[6]);
374
fail_if(list == NULL);
376
it = eina_list_iterator_new(list);
379
eina_iterator_foreach(it, EINA_EACH_CB(eina_iterator_list_data_check), &i);
380
eina_iterator_free(it);
385
eina_reverse_iterator_list_data_check(EINA_UNUSED const Eina_List *list,
391
case 0: fail_if(*data != 1337); break;
393
case 1: fail_if(*data != 1); break;
395
case 2: fail_if(*data != 42); break;
397
case 3: fail_if(*data != 6); break;
399
case 4: fail_if(*data != 9); break;
401
case 5: fail_if(*data != 7); break;
403
case 6: fail_if(*data != 81); break;
411
EFL_START_TEST(eina_reverse_iterator_list_simple)
413
Eina_List *list = NULL;
415
int data[] = { 6, 9, 42, 1, 7, 1337, 81, 1664 };
419
list = eina_list_append(list, &data[0]);
420
fail_if(list == NULL);
422
list = eina_list_prepend(list, &data[1]);
423
fail_if(list == NULL);
425
list = eina_list_append(list, &data[2]);
426
fail_if(list == NULL);
428
list = eina_list_append(list, &data[3]);
429
fail_if(list == NULL);
431
list = eina_list_prepend(list, &data[4]);
432
fail_if(list == NULL);
434
list = eina_list_append(list, &data[5]);
435
fail_if(list == NULL);
437
list = eina_list_prepend(list, &data[6]);
438
fail_if(list == NULL);
440
it = eina_list_iterator_reversed_new(list);
443
eina_iterator_foreach(it, EINA_EACH_CB(eina_reverse_iterator_list_data_check), &i);
444
eina_iterator_free(it);
448
typedef struct _Eina_Rbtree_Int Eina_Rbtree_Int;
449
struct _Eina_Rbtree_Int
455
static Eina_Rbtree_Direction
456
eina_rbtree_int_cmp(const Eina_Rbtree_Int *left, const Eina_Rbtree_Int *right, void *data EINA_UNUSED)
461
if (left->value < right->value)
462
return EINA_RBTREE_LEFT;
464
return EINA_RBTREE_RIGHT;
468
_eina_rbtree_int_new(int value)
472
it = malloc(sizeof (Eina_Rbtree_Int));
481
eina_iterator_rbtree_data_check_sorted(EINA_UNUSED const Eina_List *list,
482
Eina_Rbtree_Int *data,
487
case 0: fail_if(data->value != 10); break;
489
case 1: fail_if(data->value != 27); break;
491
case 2: fail_if(data->value != 42); break;
493
case 3: fail_if(data->value != 69); break;
495
case 4: fail_if(data->value != 1337); break;
504
eina_iterator_rbtree_data_check_prefix(EINA_UNUSED const Eina_List *list,
505
Eina_Rbtree_Int *data,
510
case 0: fail_if(data->value != 27); break;
512
case 1: fail_if(data->value != 10); break;
514
case 2: fail_if(data->value != 69); break;
516
case 3: fail_if(data->value != 42); break;
518
case 4: fail_if(data->value != 1337); break;
527
eina_iterator_rbtree_data_check_postfix(EINA_UNUSED const Eina_List *list,
528
Eina_Rbtree_Int *data,
533
case 0: fail_if(data->value != 10); break;
535
case 1: fail_if(data->value != 42); break;
537
case 2: fail_if(data->value != 1337); break;
539
case 3: fail_if(data->value != 69); break;
541
case 4: fail_if(data->value != 27); break;
549
EFL_START_TEST(eina_iterator_rbtree_simple)
551
Eina_Rbtree *root = NULL;
555
root = eina_rbtree_inline_insert(NULL,
556
_eina_rbtree_int_new(10),
557
EINA_RBTREE_CMP_NODE_CB(eina_rbtree_int_cmp),
561
root = eina_rbtree_inline_insert(root,
562
_eina_rbtree_int_new(1337),
563
EINA_RBTREE_CMP_NODE_CB(eina_rbtree_int_cmp),
567
root = eina_rbtree_inline_insert(root,
568
_eina_rbtree_int_new(27),
569
EINA_RBTREE_CMP_NODE_CB(eina_rbtree_int_cmp),
573
root = eina_rbtree_inline_insert(root,
574
_eina_rbtree_int_new(69),
575
EINA_RBTREE_CMP_NODE_CB(eina_rbtree_int_cmp),
579
root = eina_rbtree_inline_insert(root,
580
_eina_rbtree_int_new(42),
581
EINA_RBTREE_CMP_NODE_CB(eina_rbtree_int_cmp),
586
it = eina_rbtree_iterator_prefix(root);
589
eina_iterator_foreach(it,
590
EINA_EACH_CB(eina_iterator_rbtree_data_check_prefix),
592
eina_iterator_free(it);
596
it = eina_rbtree_iterator_infix(root);
599
eina_iterator_foreach(it,
600
EINA_EACH_CB(eina_iterator_rbtree_data_check_sorted),
602
eina_iterator_free(it);
605
it = eina_rbtree_iterator_postfix(root);
608
eina_iterator_foreach(it,
609
EINA_EACH_CB(eina_iterator_rbtree_data_check_postfix),
611
eina_iterator_free(it);
615
EFL_START_TEST(eina_iterator_carray_length)
617
unsigned int array[] = { 1, 4, 9, 16 };
622
it = EINA_C_ARRAY_ITERATOR_NEW(array);
623
EINA_ITERATOR_FOREACH(it, i)
628
fail_if(j < EINA_C_ARRAY_LENGTH(array));
629
eina_iterator_free(it);
633
EFL_START_TEST(eina_iterator_multi)
635
unsigned int array1[] = { 1, 4, 9, 16 };
636
unsigned int array2[] = { 25, 36, 49, 64 };
637
unsigned int array3[] = { 81, 100, 121, 144 };
642
it = eina_multi_iterator_new(EINA_C_ARRAY_ITERATOR_NEW(array1),
643
EINA_C_ARRAY_ITERATOR_NEW(array2),
644
EINA_C_ARRAY_ITERATOR_NEW(array3));
645
EINA_ITERATOR_FOREACH(it, i)
650
fail_if(j < EINA_C_ARRAY_LENGTH(array1)
651
+ EINA_C_ARRAY_LENGTH(array2)
652
+ EINA_C_ARRAY_LENGTH(array3));
653
eina_iterator_free(it);
658
_return_x(const void *container EINA_UNUSED, void *data, void *fdata)
660
Eina_Rectangle *rect = data;
661
ck_assert_int_eq(*((int*)fdata), 1337);
669
int *free_data = data;
674
EFL_START_TEST(eina_iterator_process)
676
Eina_Inarray *rects = eina_inarray_new(sizeof(Eina_Rectangle), 5);
677
Eina_Rectangle rect_arr[] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}, {12, 13, 14, 15}, {16, 17, 18, 19}};
682
eina_inarray_push(rects, &rect_arr[0]);
683
eina_inarray_push(rects, &rect_arr[1]);
684
eina_inarray_push(rects, &rect_arr[2]);
685
eina_inarray_push(rects, &rect_arr[3]);
686
eina_inarray_push(rects, &rect_arr[4]);
688
it = eina_iterator_processed_new(eina_inarray_iterator_new(rects), _return_x, _free_cb, &free);
689
EINA_ITERATOR_FOREACH(it, a)
691
ck_assert_int_eq(*a, i*4);
694
ck_assert_int_eq(i, 5);
695
eina_iterator_free(it);
696
ck_assert_int_eq(free, 0);
701
eina_test_iterator(TCase *tc)
703
tcase_add_test(tc, eina_iterator_array_simple);
704
tcase_add_test(tc, eina_iterator_hash_simple);
705
tcase_add_test(tc, eina_iterator_inlist_simple);
706
tcase_add_test(tc, eina_iterator_list_simple);
707
tcase_add_test(tc, eina_reverse_iterator_list_simple);
708
tcase_add_test(tc, eina_iterator_rbtree_simple);
709
tcase_add_test(tc, eina_iterator_filter_simple);
710
tcase_add_test(tc, eina_iterator_filter_free);
711
tcase_add_test(tc, eina_iterator_carray_length);
712
tcase_add_test(tc, eina_iterator_multi);
713
tcase_add_test(tc, eina_iterator_process);