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/>.
26 #include "eina_suite.h"
28 #include "eina_safety_checks.h"
30 typedef struct _Eina_Test_Inlist Eina_Test_Inlist;
31 struct _Eina_Test_Inlist
37 #ifdef EINA_SAFETY_CHECKS
44 /* tests should not output on success, just uncomment this for debugging */
48 _eina_test_safety_print_cb(const Eina_Log_Domain *d, Eina_Log_Level level, const char *file, const char *fnc, int line, const char *fmt, void *data, va_list args __UNUSED__)
50 struct log_ctx *ctx = data;
54 va_copy(cp_args, args);
55 str = va_arg(cp_args, const char *);
58 ck_assert_int_eq(level, EINA_LOG_LEVEL_ERR);
59 ck_assert_str_eq(fmt, "%s");
60 ck_assert_str_eq(ctx->msg, str);
61 ck_assert_str_eq(ctx->fnc, fnc);
65 eina_log_print_cb_stderr(d, level, file, fnc, line, fmt, NULL, args);
74 static Eina_Test_Inlist *
75 _eina_test_inlist_build(int i)
77 Eina_Test_Inlist *tmp;
79 tmp = malloc(sizeof(Eina_Test_Inlist));
86 START_TEST(eina_inlist_simple)
88 Eina_Inlist *lst = NULL;
89 Eina_Test_Inlist *tmp;
90 Eina_Test_Inlist *prev;
92 #ifdef EINA_SAFETY_CHECKS
97 fail_if(!eina_init());
99 tmp = _eina_test_inlist_build(42);
100 lst = eina_inlist_append(lst, EINA_INLIST_GET(tmp));
103 lst = eina_inlist_remove(lst, EINA_INLIST_GET(tmp));
104 lst = eina_inlist_prepend(lst, EINA_INLIST_GET(tmp));
106 tmp = _eina_test_inlist_build(1664);
107 lst = eina_inlist_append_relative(lst, EINA_INLIST_GET(tmp), lst);
109 fail_if(EINA_INLIST_CONTAINER_GET(lst, Eina_Test_Inlist)->i != 42);
112 tmp = _eina_test_inlist_build(3227);
113 lst = eina_inlist_prepend_relative(lst, EINA_INLIST_GET(
114 tmp), EINA_INLIST_GET(prev));
116 fail_if(EINA_INLIST_CONTAINER_GET(lst, Eina_Test_Inlist)->i != 42);
118 lst = eina_inlist_remove(lst, EINA_INLIST_GET(tmp));
120 lst = eina_inlist_append_relative(lst, EINA_INLIST_GET(tmp), lst);
121 lst = eina_inlist_remove(lst, EINA_INLIST_GET(tmp));
123 lst = eina_inlist_prepend_relative(lst, EINA_INLIST_GET(tmp), lst);
125 tmp = _eina_test_inlist_build(27);
126 lst = eina_inlist_prepend_relative(lst, EINA_INLIST_GET(tmp), NULL);
128 tmp = _eina_test_inlist_build(81);
129 lst = eina_inlist_append_relative(lst, EINA_INLIST_GET(tmp), NULL);
131 EINA_INLIST_FOREACH(lst, tmp)
135 case 0: fail_if(tmp->i != 27); break;
137 case 1: fail_if(tmp->i != 3227); break;
139 case 2: fail_if(tmp->i != 42); break;
141 case 3: fail_if(tmp->i != 1664); break;
143 case 4: fail_if(tmp->i != 81); break;
149 #ifdef EINA_SAFETY_CHECKS
151 eina_log_print_cb_set(_eina_test_safety_print_cb, &ctx);
153 #define TEST_MAGIC_SAFETY(fn, _msg) \
159 fprintf(stderr, "you should have a safety check failure below:\n");
164 TEST_MAGIC_SAFETY("eina_inlist_remove",
165 "safety check failed: list == NULL");
167 tmp2 = eina_inlist_remove(NULL, EINA_INLIST_GET(tmp));
168 fail_if(tmp2 != NULL);
169 fail_if(eina_error_get() != EINA_ERROR_SAFETY_FAILED);
170 fail_unless(ctx.did);
174 fprintf(stderr, "you should have a safety check failure below:\n");
176 TEST_MAGIC_SAFETY("eina_inlist_remove",
177 "safety check failed: item == NULL");
178 lst = eina_inlist_remove(lst, NULL);
179 fail_if(eina_error_get() != EINA_ERROR_SAFETY_FAILED);
180 fail_unless(ctx.did);
183 fprintf(stderr, "you should have a safety check failure below:\n");
185 TEST_MAGIC_SAFETY("eina_inlist_append",
186 "safety check failed: new_l == NULL");
187 lst = eina_inlist_append(lst, NULL);
188 fail_if(eina_error_get() != EINA_ERROR_SAFETY_FAILED);
189 fail_unless(ctx.did);
192 fprintf(stderr, "you should have a safety check failure below:\n");
194 TEST_MAGIC_SAFETY("eina_inlist_append_relative",
195 "safety check failed: new_l == NULL");
196 lst = eina_inlist_append_relative(lst, NULL, NULL);
197 fail_if(eina_error_get() != EINA_ERROR_SAFETY_FAILED);
198 fail_unless(ctx.did);
201 fprintf(stderr, "you should have a safety check failure below:\n");
203 TEST_MAGIC_SAFETY("eina_inlist_prepend",
204 "safety check failed: new_l == NULL");
205 lst = eina_inlist_prepend(lst, NULL);
206 fail_if(eina_error_get() != EINA_ERROR_SAFETY_FAILED);
207 fail_unless(ctx.did);
210 fprintf(stderr, "you should have a safety check failure below:\n");
212 TEST_MAGIC_SAFETY("eina_inlist_prepend_relative",
213 "safety check failed: new_l == NULL");
214 lst = eina_inlist_prepend_relative(lst, NULL, NULL);
215 fail_if(eina_error_get() != EINA_ERROR_SAFETY_FAILED);
216 fail_unless(ctx.did);
219 fprintf(stderr, "you should have a safety check failure below:\n");
221 TEST_MAGIC_SAFETY("eina_inlist_find",
222 "safety check failed: item == NULL");
223 lst = eina_inlist_find(lst, NULL);
224 fail_if(eina_error_get() != EINA_ERROR_SAFETY_FAILED);
225 fail_unless(ctx.did);
228 fprintf(stderr, "you should have a safety check failure below:\n");
230 TEST_MAGIC_SAFETY("eina_inlist_demote",
231 "safety check failed: list == NULL");
232 lst = eina_inlist_demote(NULL, NULL);
233 fail_if(eina_error_get() != EINA_ERROR_SAFETY_FAILED);
234 fail_unless(ctx.did);
237 fprintf(stderr, "you should have a safety check failure below:\n");
239 TEST_MAGIC_SAFETY("eina_inlist_demote",
240 "safety check failed: item == NULL");
241 lst = eina_inlist_demote((void*)1L, NULL);
242 fail_if(eina_error_get() != EINA_ERROR_SAFETY_FAILED);
243 fail_unless(ctx.did);
247 fprintf(stderr, "you should have a safety check failure below:\n");
249 TEST_MAGIC_SAFETY("eina_inlist_promote",
250 "safety check failed: list == NULL");
251 lst = eina_inlist_promote(NULL, NULL);
252 fail_if(eina_error_get() != EINA_ERROR_SAFETY_FAILED);
253 fail_unless(ctx.did);
256 fprintf(stderr, "you should have a safety check failure below:\n");
258 TEST_MAGIC_SAFETY("eina_inlist_promote",
259 "safety check failed: item == NULL");
260 lst = eina_inlist_promote((void*)1L, NULL);
261 fail_if(eina_error_get() != EINA_ERROR_SAFETY_FAILED);
262 fail_unless(ctx.did);
266 fprintf(stderr, "you should have a safety check failure below:\n");
268 TEST_MAGIC_SAFETY("eina_inlist_sorted_insert",
269 "safety check failed: item == NULL");
270 lst = eina_inlist_sorted_insert(NULL, NULL, NULL);
271 fail_if(eina_error_get() != EINA_ERROR_SAFETY_FAILED);
272 fail_unless(ctx.did);
275 fprintf(stderr, "you should have a safety check failure below:\n");
277 TEST_MAGIC_SAFETY("eina_inlist_sorted_insert",
278 "safety check failed: func == NULL");
279 lst = eina_inlist_sorted_insert(NULL, (void*)1L, NULL);
280 fail_if(eina_error_get() != EINA_ERROR_SAFETY_FAILED);
281 fail_unless(ctx.did);
284 eina_log_print_cb_set(eina_log_print_cb_stderr, NULL);
288 tmp = EINA_INLIST_CONTAINER_GET(lst, Eina_Test_Inlist);
289 lst = eina_inlist_demote(lst, lst);
290 fail_if(EINA_INLIST_CONTAINER_GET(lst, Eina_Test_Inlist) == tmp);
292 lst = eina_inlist_promote(lst, EINA_INLIST_GET(tmp));
293 fail_if(lst != EINA_INLIST_GET(tmp));
295 tmp = EINA_INLIST_CONTAINER_GET(eina_inlist_find(lst, EINA_INLIST_GET(
296 prev)), Eina_Test_Inlist);
297 lst = eina_inlist_remove(lst, EINA_INLIST_GET(tmp));
298 prev = (Eina_Test_Inlist *)eina_inlist_find(lst, EINA_INLIST_GET(tmp));
299 tmp = prev ? EINA_INLIST_CONTAINER_GET(prev, Eina_Test_Inlist) : NULL;
300 fail_if(tmp != NULL);
303 lst = eina_inlist_remove(lst, lst);
309 typedef struct _Eina_Test_Inlist_Sorted Eina_Test_Inlist_Sorted;
310 struct _Eina_Test_Inlist_Sorted
318 _eina_test_inlist_cmp(const void *d1, const void *d2)
320 const Eina_Test_Inlist_Sorted *t1 = d1;
321 const Eina_Test_Inlist_Sorted *t2 = d2;
323 return t1->value - t2->value;
327 _eina_test_inlist_check(const Eina_Inlist *list)
329 const Eina_Test_Inlist_Sorted *t;
332 EINA_INLIST_FOREACH(list, t)
334 fail_if(t->value < last_value);
335 last_value = t->value;
339 START_TEST(eina_inlist_sorted)
341 Eina_Test_Inlist_Sorted *tmp;
342 Eina_Inlist *list = NULL;
343 Eina_Inlist *sorted = NULL;
346 fail_if(!eina_init());
350 for (i = 0; i < 2000; ++i)
352 tmp = malloc(sizeof (Eina_Test_Inlist_Sorted));
357 list = eina_inlist_prepend(list, EINA_INLIST_GET(tmp));
360 list = eina_inlist_sort(list, _eina_test_inlist_cmp);
362 _eina_test_inlist_check(list);
364 EINA_INLIST_FOREACH(list, tmp)
370 Eina_Inlist *p = list;
372 list = eina_inlist_remove(list, list);
374 sorted = eina_inlist_sorted_insert(sorted, p, _eina_test_inlist_cmp);
375 _eina_test_inlist_check(sorted);
378 _eina_test_inlist_check(sorted);
384 START_TEST(eina_inlist_sorted_state)
386 Eina_Test_Inlist_Sorted *tmp;
387 Eina_Inlist_Sorted_State *state;
388 Eina_Inlist *list = NULL;
391 fail_if(!eina_init());
393 state = eina_inlist_sorted_state_new();
396 for (i = 0; i < 2000; ++i)
398 tmp = malloc(sizeof (Eina_Test_Inlist_Sorted));
403 list = eina_inlist_sorted_state_insert(list, EINA_INLIST_GET(tmp), _eina_test_inlist_cmp, state);
404 _eina_test_inlist_check(list);
407 _eina_test_inlist_check(list);
409 eina_inlist_sorted_state_free(state);
416 eina_test_inlist(TCase *tc)
418 tcase_add_test(tc, eina_inlist_simple);
419 tcase_add_test(tc, eina_inlist_sorted);
420 tcase_add_test(tc, eina_inlist_sorted_state);