1 /* EINA - EFL data type library
2 * Copyright (C) 2008 Cedric Bail
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.
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.
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/>.
25 #include "eina_suite.h"
28 static Eina_Bool eina_list_sorted_check(const Eina_List *list)
32 int last = *(int *)list->data;
34 EINA_LIST_FOREACH(list->next, n, d)
36 int current = *(int *)d;
39 fprintf(stderr, "list is not sorted: last=%d, current=%d\n",
50 static int eina_int_cmp(const void *a, const void *b)
58 START_TEST(eina_test_simple)
60 Eina_List *list = NULL;
65 int data[] = { 6, 9, 42, 1, 7, 9, 81, 1664, 1337 };
66 int result[] = { 81, 9, 9, 7, 1 };
71 list = eina_list_append(list, &data[0]);
72 fail_if(list == NULL);
74 list = eina_list_prepend(list, &data[1]);
75 fail_if(list == NULL);
77 list = eina_list_append(list, &data[2]);
78 fail_if(list == NULL);
80 list = eina_list_remove(list, &data[0]);
81 fail_if(list == NULL);
83 list = eina_list_remove(list, &data[0]);
84 fail_if(list == NULL);
86 tmp = eina_list_data_find_list(list, &data[2]);
89 list = eina_list_append_relative_list(list, &data[3], tmp);
90 fail_if(list == NULL);
92 list = eina_list_prepend_relative_list(list, &data[4], tmp);
93 fail_if(list == NULL);
95 list = eina_list_promote_list(list, tmp);
96 fail_if(list == NULL);
98 list = eina_list_append_relative(list, &data[5], &data[2]);
99 fail_if(list == NULL);
101 list = eina_list_prepend_relative(list, &data[6], &data[2]);
102 fail_if(list == NULL);
104 list = eina_list_remove_list(list, tmp);
105 fail_if(list == NULL);
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]);
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);
116 for (tmp = list, i = 0; tmp != NULL; tmp = eina_list_next(tmp), ++i)
118 int *d = eina_list_data_get(tmp);
120 fail_if(*d != result[i]);
123 list = eina_list_reverse(list);
125 for (tmp = list; tmp != NULL; tmp = eina_list_next(tmp), --i)
127 int *d = eina_list_data_get(tmp);
129 fail_if(*d != result[i - 1]);
132 list = eina_list_append_relative(list, &data[7], &data[7]);
133 fail_if(list == NULL);
135 list = eina_list_prepend_relative(list, &data[8], &data[8]);
136 fail_if(list == NULL);
138 list = eina_list_sort(list, 2, eina_int_cmp);
140 list = eina_list_sort(list, 2, eina_int_cmp);
142 test1 = eina_list_nth(list, 0);
143 test2 = eina_list_nth(list, 1);
144 test3 = eina_list_nth(list, 2);
146 fail_if(test1 == NULL || test2 == NULL || test3 == NULL);
147 fail_if(*test1 > *test2);
148 fail_if(*test3 == *test2);
150 list = eina_list_sort(list, 5, eina_int_cmp);
152 test1 = eina_list_nth(list, 3);
153 test2 = eina_list_nth(list, 4);
154 test3 = eina_list_nth(list, 5);
156 fail_if(test1 == NULL || test2 == NULL || test3 == NULL);
157 fail_if(*test1 > *test2);
158 fail_if(*test3 > *test2);
160 list = eina_list_append(list, &data[8]);
161 fail_if(list == NULL);
163 list = eina_list_append(list, &data[7]);
164 fail_if(list == NULL);
166 list = eina_list_sort(list, -1, eina_int_cmp);
168 test1 = eina_list_nth(list, 0);
169 for (tmp = list; tmp != NULL; tmp = eina_list_next(tmp))
171 int *d = eina_list_data_get(tmp);
172 fail_if(*test1 > *d);
177 test3 = eina_list_nth(list, 5);
178 fail_if(test3 == NULL);
180 list = eina_list_promote_list(list, list);
181 fail_if(list == NULL);
183 list = eina_list_promote_list(list, eina_list_last(list));
184 fail_if(list == NULL);
186 test1 = eina_list_nth(list, 0);
187 test2 = eina_list_nth(list, 1);
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);
194 list = eina_list_remove_list(list, list);
195 fail_if(list == NULL);
197 list = eina_list_remove_list(list, eina_list_last(list));
198 fail_if(list == NULL);
200 list = eina_list_free(list);
201 fail_if(list != NULL);
207 START_TEST(eina_test_merge)
214 int data[] = { 6, 9, 42, 1, 7, 9, 81, 1664, 1337, 3, 21, 10, 0, 5, 2008 };
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]);
225 l2 = eina_list_append(NULL, &data[4]);
226 l2 = eina_list_append(l2, &data[5]);
229 l1 = eina_list_merge(l1, l2);
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]);
239 l1 = eina_list_append(NULL, &data[0]);
240 l1 = eina_list_append(l1, &data[1]);
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]);
249 l1 = eina_list_merge(l1, l2);
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]);
257 l3 = eina_list_append(NULL, &data[6]);
258 l3 = eina_list_append(l3, &data[7]);
259 l3 = eina_list_append(l3, &data[8]);
261 l4 = eina_list_append(NULL, &data[9]);
262 l4 = eina_list_append(l4, &data[10]);
263 l4 = eina_list_append(l4, &data[11]);
265 l5 = eina_list_append(NULL, &data[12]);
266 l5 = eina_list_append(l5, &data[13]);
267 l5 = eina_list_append(l5, &data[14]);
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);
274 l1 = eina_list_sorted_merge(l1, l3, eina_int_cmp);
276 fail_if(eina_list_count(l1) != 9);
278 l1 = eina_list_sorted_merge(l1, l4, eina_int_cmp);
280 fail_if(eina_list_count(l1) != 12);
282 l1 = eina_list_sorted_merge(l1, l5, eina_int_cmp);
284 fail_if(eina_list_count(l1) != 15);
286 fail_if(!eina_list_sorted_check(l1));
292 START_TEST(eina_test_sorted_insert)
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};
297 Eina_List *l1, *l2, *itr;
302 count = sizeof(data) / sizeof(data[0]);
305 for (i = 0; i < count; i++)
306 l1 = eina_list_sorted_insert(l1, eina_int_cmp, data + i);
309 fail_if(!eina_list_sorted_check(l1));
312 EINA_LIST_FOREACH(l1, itr, d)
313 l2 = eina_list_sorted_insert(l2, eina_int_cmp, d);
316 fail_if(!eina_list_sorted_check(l2));
320 EINA_LIST_REVERSE_FOREACH(l1, itr, d)
321 l2 = eina_list_sorted_insert(l2, eina_int_cmp, d);
324 fail_if(!eina_list_sorted_check(l2));
328 count = sizeof(data2) / sizeof(data2[0]);
330 for (i = 0; i < count; i++)
331 l1 = eina_list_sorted_insert(l1, eina_int_cmp, data2 + i);
334 fail_if(!eina_list_sorted_check(l1));
341 START_TEST(eina_test_list_split)
343 Eina_List *left = NULL, *right = NULL ;
344 Eina_List *list = NULL;
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");
358 fail_if(list == NULL);
359 fail_if(eina_list_count(list) != 8);
361 for ( i = 0; i < 200; i++)
363 left = eina_list_split_list(list, eina_list_nth_list(list, i % 2), &right);
366 fail_if(eina_list_count(left) == 1 && eina_list_count(right) + eina_list_count(left) == i + 7);
368 fail_if(eina_list_count(left) == 2 && eina_list_count(right) + eina_list_count(left) == i + 7);
370 list = eina_list_merge(left, right);
371 list = eina_list_append(list, "roslin");
379 eina_test_list(TCase *tc)
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);