EFL 1.7 svn doobies
[profile/ivi/eina.git] / src / tests / eina_test_list.c
1 /* EINA - EFL data type library
2  * Copyright (C) 2008 Cedric Bail
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library;
16  * if not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #ifdef HAVE_CONFIG_H
20 # include "config.h"
21 #endif
22
23 #include <stdio.h>
24
25 #include "eina_suite.h"
26 #include "Eina.h"
27
28 static Eina_Bool eina_list_sorted_check(const Eina_List *list)
29 {
30    const Eina_List *n;
31    void *d;
32    int last = *(int *)list->data;
33
34    EINA_LIST_FOREACH(list->next, n, d)
35    {
36       int current = *(int *)d;
37       if (last > current)
38         {
39            fprintf(stderr, "list is not sorted: last=%d, current=%d\n",
40                    last, current);
41            return 0;
42         }
43
44       last = current;
45    }
46
47    return 1;
48 }
49
50 static int eina_int_cmp(const void *a, const void *b)
51 {
52    const int *ia = a;
53    const int *ib = b;
54
55    return *ia - *ib;
56 }
57
58 START_TEST(eina_test_simple)
59 {
60    Eina_List *list = NULL;
61    Eina_List *tmp;
62    int *test1;
63    int *test2;
64    int *test3;
65    int data[] = { 6, 9, 42, 1, 7, 9, 81, 1664, 1337 };
66    int result[] = { 81, 9, 9, 7, 1 };
67    int i;
68
69    eina_init();
70
71    list = eina_list_append(list, &data[0]);
72         fail_if(list == NULL);
73
74    list = eina_list_prepend(list, &data[1]);
75         fail_if(list == NULL);
76
77    list = eina_list_append(list, &data[2]);
78         fail_if(list == NULL);
79
80    list = eina_list_remove(list, &data[0]);
81         fail_if(list == NULL);
82
83    list = eina_list_remove(list, &data[0]);
84         fail_if(list == NULL);
85
86    tmp = eina_list_data_find_list(list, &data[2]);
87         fail_if(tmp == NULL);
88
89    list = eina_list_append_relative_list(list, &data[3], tmp);
90         fail_if(list == NULL);
91
92    list = eina_list_prepend_relative_list(list, &data[4], tmp);
93         fail_if(list == NULL);
94
95    list = eina_list_promote_list(list, tmp);
96         fail_if(list == NULL);
97
98    list = eina_list_append_relative(list, &data[5], &data[2]);
99         fail_if(list == NULL);
100
101    list = eina_list_prepend_relative(list, &data[6], &data[2]);
102         fail_if(list == NULL);
103
104    list = eina_list_remove_list(list, tmp);
105         fail_if(list == NULL);
106
107         fail_if(eina_list_data_find_list(list, &data[2]) != NULL);
108         fail_if(eina_list_data_find(list, &data[2]) != NULL);
109         fail_if(eina_list_data_find(list, &data[5]) != &data[5]);
110
111         fail_if(eina_list_count(list) != 5);
112         fail_if(eina_list_nth(list, 4) != &data[3]);
113         fail_if(eina_list_nth(list, 10) != NULL);
114         fail_if(eina_list_nth_list(list, 10) != NULL);
115
116    for (tmp = list, i = 0; tmp != NULL; tmp = eina_list_next(tmp), ++i)
117      {
118         int *d = eina_list_data_get(tmp);
119         fail_if(d == NULL);
120         fail_if(*d != result[i]);
121      }
122
123    list = eina_list_reverse(list);
124
125    for (tmp = list; tmp != NULL; tmp = eina_list_next(tmp), --i)
126      {
127         int *d = eina_list_data_get(tmp);
128         fail_if(d == NULL);
129         fail_if(*d != result[i - 1]);
130      }
131
132    list = eina_list_append_relative(list, &data[7], &data[7]);
133         fail_if(list == NULL);
134
135    list = eina_list_prepend_relative(list, &data[8], &data[8]);
136         fail_if(list == NULL);
137
138    list = eina_list_sort(list, 2, eina_int_cmp);
139
140    list = eina_list_sort(list, 2, eina_int_cmp);
141
142    test1 = eina_list_nth(list, 0);
143    test2 = eina_list_nth(list, 1);
144    test3 = eina_list_nth(list, 2);
145
146         fail_if(test1 == NULL || test2 == NULL || test3 == NULL);
147         fail_if(*test1 > *test2);
148         fail_if(*test3 == *test2);
149
150    list = eina_list_sort(list, 5, eina_int_cmp);
151
152    test1 = eina_list_nth(list, 3);
153    test2 = eina_list_nth(list, 4);
154    test3 = eina_list_nth(list, 5);
155
156         fail_if(test1 == NULL || test2 == NULL || test3 == NULL);
157         fail_if(*test1 > *test2);
158         fail_if(*test3 > *test2);
159
160    list = eina_list_append(list, &data[8]);
161         fail_if(list == NULL);
162
163    list = eina_list_append(list, &data[7]);
164         fail_if(list == NULL);
165
166    list = eina_list_sort(list, -1, eina_int_cmp);
167
168    test1 = eina_list_nth(list, 0);
169    for (tmp = list; tmp != NULL; tmp = eina_list_next(tmp))
170      {
171         int *d = eina_list_data_get(tmp);
172         fail_if(*test1 > *d);
173
174         test1 = d;
175      }
176
177    test3 = eina_list_nth(list, 5);
178         fail_if(test3 == NULL);
179
180    list = eina_list_promote_list(list, list);
181         fail_if(list == NULL);
182
183    list = eina_list_promote_list(list, eina_list_last(list));
184         fail_if(list == NULL);
185
186    test1 = eina_list_nth(list, 0);
187    test2 = eina_list_nth(list, 1);
188
189    list = eina_list_promote_list(eina_list_next(list), list);
190         fail_if(list == NULL);
191         fail_if(eina_list_data_get(list) != test1);
192         fail_if(eina_list_data_get(eina_list_next(list)) != test2);
193
194    list = eina_list_remove_list(list, list);
195         fail_if(list == NULL);
196
197    list = eina_list_remove_list(list, eina_list_last(list));
198         fail_if(list == NULL);
199
200    list = eina_list_free(list);
201         fail_if(list != NULL);
202
203         eina_shutdown();
204 }
205 END_TEST
206
207 START_TEST(eina_test_merge)
208 {
209    Eina_List *l1;
210    Eina_List *l2;
211    Eina_List *l3;
212    Eina_List *l4;
213    Eina_List *l5;
214    int data[] = { 6, 9, 42, 1, 7, 9, 81, 1664, 1337, 3, 21, 10, 0, 5, 2008 };
215    int i;
216
217    eina_init();
218
219    l1 = eina_list_append(NULL, &data[0]);
220    l1 = eina_list_append(l1, &data[1]);
221    l1 = eina_list_append(l1, &data[2]);
222    l1 = eina_list_append(l1, &data[3]);
223       fail_if(l1 == NULL);
224
225    l2 = eina_list_append(NULL, &data[4]);
226    l2 = eina_list_append(l2, &data[5]);
227       fail_if(l2 == NULL);
228
229    l1 = eina_list_merge(l1, l2);
230       fail_if(l1 == NULL);
231       fail_if(eina_list_count(l1) != 6);
232    for (i = 0, l2 = l1; ((l2 != NULL) && (i < 6)); ++i, l2 = l2->next)
233       fail_if(l2->data != &data[i]);
234       fail_if(i != 6);
235       fail_if(l2 != NULL);
236
237       eina_list_free(l1);
238
239    l1 = eina_list_append(NULL, &data[0]);
240    l1 = eina_list_append(l1, &data[1]);
241       fail_if(l1 == NULL);
242
243    l2 = eina_list_append(NULL, &data[2]);
244    l2 = eina_list_append(l2, &data[3]);
245    l2 = eina_list_append(l2, &data[4]);
246    l2 = eina_list_append(l2, &data[5]);
247       fail_if(l2 == NULL);
248
249    l1 = eina_list_merge(l1, l2);
250       fail_if(l1 == NULL);
251       fail_if(eina_list_count(l1) != 6);
252    for (i = 0, l2 = l1; ((l2 != NULL) && (i < 6)); ++i, l2 = l2->next)
253       fail_if(l2->data != &data[i]);
254       fail_if(i != 6);
255       fail_if(l2 != NULL);
256
257    l3 = eina_list_append(NULL, &data[6]);
258    l3 = eina_list_append(l3, &data[7]);
259    l3 = eina_list_append(l3, &data[8]);
260
261    l4 = eina_list_append(NULL, &data[9]);
262    l4 = eina_list_append(l4, &data[10]);
263    l4 = eina_list_append(l4, &data[11]);
264
265    l5 = eina_list_append(NULL, &data[12]);
266    l5 = eina_list_append(l5, &data[13]);
267    l5 = eina_list_append(l5, &data[14]);
268
269    l1 = eina_list_sort(l1, -1, eina_int_cmp);
270    l3 = eina_list_sort(l3, -1, eina_int_cmp);
271    l4 = eina_list_sort(l4, -1, eina_int_cmp);
272    l5 = eina_list_sort(l5, -1, eina_int_cmp);
273
274    l1 = eina_list_sorted_merge(l1, l3, eina_int_cmp);
275       fail_if(l1 == NULL);
276       fail_if(eina_list_count(l1) != 9);
277
278    l1 = eina_list_sorted_merge(l1, l4, eina_int_cmp);
279       fail_if(l1 == NULL);
280       fail_if(eina_list_count(l1) != 12);
281
282    l1 = eina_list_sorted_merge(l1, l5, eina_int_cmp);
283       fail_if(l1 == NULL);
284       fail_if(eina_list_count(l1) != 15);
285
286       fail_if(!eina_list_sorted_check(l1));
287
288       eina_shutdown();
289 }
290 END_TEST
291
292 START_TEST(eina_test_sorted_insert)
293 {
294    const int data[] = {6, 9, 42, 1, 7, 9, 81, 1664, 1337, 3, 21, 10, 0, 5, 2008};
295    const int data2[] = {5, 0, 3, 2, 1, 0, 1, 2, 3, 4, 5};
296    int i, count;
297    Eina_List *l1, *l2, *itr;
298    void *d;
299
300    eina_init();
301
302    count = sizeof(data) / sizeof(data[0]);
303
304    l1 = NULL;
305    for (i = 0; i < count; i++)
306       l1 = eina_list_sorted_insert(l1, eina_int_cmp, data + i);
307
308    fail_if(l1 == NULL);
309    fail_if(!eina_list_sorted_check(l1));
310
311    l2 = NULL;
312    EINA_LIST_FOREACH(l1, itr, d)
313    l2 = eina_list_sorted_insert(l2, eina_int_cmp, d);
314
315    fail_if(l2 == NULL);
316    fail_if(!eina_list_sorted_check(l2));
317    eina_list_free(l2);
318
319    l2 = NULL;
320    EINA_LIST_REVERSE_FOREACH(l1, itr, d)
321    l2 = eina_list_sorted_insert(l2, eina_int_cmp, d);
322
323    fail_if(l2 == NULL);
324    fail_if(!eina_list_sorted_check(l2));
325    eina_list_free(l2);
326    eina_list_free(l1);
327
328    count = sizeof(data2) / sizeof(data2[0]);
329    l1 = NULL;
330    for (i = 0; i < count; i++)
331       l1 = eina_list_sorted_insert(l1, eina_int_cmp, data2 + i);
332
333    fail_if(l1 == NULL);
334    fail_if(!eina_list_sorted_check(l1));
335    eina_list_free(l1);
336
337    eina_shutdown();
338 }
339 END_TEST
340
341 START_TEST(eina_test_list_split)
342 {
343   Eina_List *left = NULL, *right = NULL ;
344   Eina_List *list = NULL;
345   unsigned int i;
346
347   eina_init();
348
349   list = eina_list_append(list, "tigh");
350   list = eina_list_append(list, "adar");
351   list = eina_list_append(list, "baltar");
352   list = eina_list_append(list, "roslin");
353   list = eina_list_append(list, "baltar");
354   list = eina_list_append(list, "roslin");
355   list = eina_list_append(list, "baltar");
356   list = eina_list_append(list, "roslin");
357
358   fail_if(list == NULL);
359   fail_if(eina_list_count(list) != 8);
360
361   for ( i = 0; i <  200; i++)
362     {
363       left = eina_list_split_list(list, eina_list_nth_list(list, i % 2), &right);
364
365       if (i % 2 == 0)
366         fail_if(eina_list_count(left) == 1 && eina_list_count(right) + eina_list_count(left) == i + 7);
367       else
368         fail_if(eina_list_count(left) == 2 && eina_list_count(right) + eina_list_count(left) == i + 7);
369
370       list = eina_list_merge(left, right);
371       list = eina_list_append(list, "roslin");
372     }
373
374   eina_shutdown();
375 }
376 END_TEST
377
378 void
379 eina_test_list(TCase *tc)
380 {
381    tcase_add_test(tc, eina_test_simple);
382    tcase_add_test(tc, eina_test_merge);
383    tcase_add_test(tc, eina_test_sorted_insert);
384    tcase_add_test(tc, eina_test_list_split);
385 }