2 * Copyright (C) 2013 Tobias Brunner
3 * HSR Hochschule fuer Technik Rapperswil
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2 of the License, or (at your
8 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 #include "test_suite.h"
18 #include <collections/linked_list.h>
20 /*******************************************************************************
24 static linked_list_t
*list
;
26 START_SETUP(setup_list
)
28 list
= linked_list_create_with_items((void*)1, (void*)2, (void*)3, (void*)4,
30 ck_assert_int_eq(list
->get_count(list
), 5);
34 START_TEARDOWN(teardown_list
)
40 /*******************************************************************************
44 START_TEST(test_enumerate
)
46 enumerator_t
*enumerator
;
51 enumerator
= list
->create_enumerator(list
);
52 while (enumerator
->enumerate(enumerator
, &x
))
54 ck_assert_int_eq(round
, x
);
57 ck_assert_int_eq(round
, 6);
58 enumerator
->destroy(enumerator
);
62 START_TEST(test_enumerate_null
)
64 enumerator_t
*enumerator
;
68 enumerator
= list
->create_enumerator(list
);
69 while (enumerator
->enumerate(enumerator
, NULL
))
73 ck_assert_int_eq(round
, 6);
74 enumerator
->destroy(enumerator
);
78 START_TEST(test_reset_enumerator
)
80 enumerator_t
*enumerator
;
84 enumerator
= list
->create_enumerator(list
);
85 while (enumerator
->enumerate(enumerator
, &x
))
88 list
->reset_enumerator(list
, enumerator
);
90 while (enumerator
->enumerate(enumerator
, &x
))
92 ck_assert_int_eq(round
, x
);
95 ck_assert_int_eq(round
, 6);
96 enumerator
->destroy(enumerator
);
100 /*******************************************************************************
104 START_TEST(test_insert_before
)
106 enumerator_t
*enumerator
;
111 enumerator
= list
->create_enumerator(list
);
112 while (enumerator
->enumerate(enumerator
, &x
))
114 ck_assert_int_eq(round
, x
);
118 list
->insert_before(list
, enumerator
, (void*)6);
121 ck_assert_int_eq(list
->get_count(list
), 6);
122 list
->reset_enumerator(list
, enumerator
);
124 while (enumerator
->enumerate(enumerator
, &x
))
126 if (round
== _i
&& x
!= _i
)
128 ck_assert_int_eq(6, x
);
132 ck_assert_int_eq(round
, x
);
136 enumerator
->destroy(enumerator
);
140 START_TEST(test_insert_before_ends
)
142 enumerator_t
*enumerator
;
146 enumerator
= list
->create_enumerator(list
);
147 /* this does not change the enumerator position, which points to 1 */
148 list
->insert_before(list
, enumerator
, (void*)0);
149 ck_assert_int_eq(list
->get_count(list
), 6);
150 ck_assert(list
->get_first(list
, (void*)&x
) == SUCCESS
);
151 ck_assert_int_eq(x
, 0);
153 while (enumerator
->enumerate(enumerator
, &x
))
155 ck_assert_int_eq(round
, x
);
158 list
->insert_before(list
, enumerator
, (void*)6);
159 ck_assert_int_eq(list
->get_count(list
), 7);
160 ck_assert(list
->get_last(list
, (void*)&x
) == SUCCESS
);
161 ck_assert_int_eq(x
, 6);
162 ck_assert(!enumerator
->enumerate(enumerator
, &x
));
163 enumerator
->destroy(enumerator
);
167 START_TEST(test_insert_before_empty
)
169 enumerator_t
*enumerator
;
173 list
= linked_list_create();
174 enumerator
= list
->create_enumerator(list
);
175 list
->insert_before(list
, enumerator
, (void*)1);
176 ck_assert_int_eq(list
->get_count(list
), 1);
177 ck_assert(list
->get_first(list
, (void*)&x
) == SUCCESS
);
178 ck_assert_int_eq(x
, 1);
179 ck_assert(list
->get_last(list
, (void*)&x
) == SUCCESS
);
180 ck_assert_int_eq(x
, 1);
181 ck_assert(!enumerator
->enumerate(enumerator
, &x
));
182 list
->insert_before(list
, enumerator
, (void*)2);
183 ck_assert_int_eq(list
->get_count(list
), 2);
184 ck_assert(list
->get_first(list
, (void*)&x
) == SUCCESS
);
185 ck_assert_int_eq(x
, 1);
186 ck_assert(list
->get_last(list
, (void*)&x
) == SUCCESS
);
187 ck_assert_int_eq(x
, 2);
188 ck_assert(!enumerator
->enumerate(enumerator
, NULL
));
189 enumerator
->destroy(enumerator
);
193 /*******************************************************************************
197 START_TEST(test_remove_at
)
199 enumerator_t
*enumerator
;
204 enumerator
= list
->create_enumerator(list
);
205 while (enumerator
->enumerate(enumerator
, &x
))
207 ck_assert_int_eq(round
, x
);
210 list
->remove_at(list
, enumerator
);
214 ck_assert_int_eq(list
->get_count(list
), 4);
215 list
->reset_enumerator(list
, enumerator
);
217 while (enumerator
->enumerate(enumerator
, &x
))
220 { /* skip removed item */
223 ck_assert_int_eq(round
, x
);
226 enumerator
->destroy(enumerator
);
230 START_TEST(test_remove_at_multi
)
232 enumerator_t
*enumerator
;
237 enumerator
= list
->create_enumerator(list
);
238 while (enumerator
->enumerate(enumerator
, &x
))
240 ck_assert_int_eq(round
, x
);
241 if (round
== 2 || round
== 5)
243 list
->remove_at(list
, enumerator
);
247 ck_assert_int_eq(list
->get_count(list
), 3);
248 list
->reset_enumerator(list
, enumerator
);
250 while (enumerator
->enumerate(enumerator
, &x
))
253 { /* skip removed item */
256 ck_assert_int_eq(round
, x
);
257 list
->remove_at(list
, enumerator
);
260 ck_assert_int_eq(list
->get_count(list
), 0);
261 list
->reset_enumerator(list
, enumerator
);
262 ck_assert(!enumerator
->enumerate(enumerator
, &x
));
263 enumerator
->destroy(enumerator
);
267 START_TEST(test_remove_at_ends
)
269 enumerator_t
*enumerator
;
272 enumerator
= list
->create_enumerator(list
);
273 list
->remove_at(list
, enumerator
);
274 ck_assert_int_eq(list
->get_count(list
), 4);
275 ck_assert(list
->get_first(list
, (void*)&x
) == SUCCESS
);
276 ck_assert_int_eq(x
, 2);
277 while (enumerator
->enumerate(enumerator
, &x
))
280 list
->remove_at(list
, enumerator
);
281 ck_assert_int_eq(list
->get_count(list
), 4);
282 ck_assert(list
->get_last(list
, (void*)&x
) == SUCCESS
);
283 ck_assert_int_eq(x
, 5);
284 enumerator
->destroy(enumerator
);
288 START_TEST(test_insert_before_remove_at
)
290 enumerator_t
*enumerator
;
295 enumerator
= list
->create_enumerator(list
);
296 while (enumerator
->enumerate(enumerator
, &x
))
298 ck_assert_int_eq(round
, x
);
300 { /* this replaces the current item */
301 list
->insert_before(list
, enumerator
, (void*)42);
302 list
->remove_at(list
, enumerator
);
305 { /* same here, the order of calls does not matter */
306 list
->remove_at(list
, enumerator
);
307 list
->insert_before(list
, enumerator
, (void*)21);
311 ck_assert_int_eq(list
->get_count(list
), 5);
312 list
->reset_enumerator(list
, enumerator
);
314 while (enumerator
->enumerate(enumerator
, &x
))
317 { /* check replaced item */
318 ck_assert_int_eq(42, x
);
321 { /* check replace item */
322 ck_assert_int_eq(21, x
);
326 ck_assert_int_eq(round
, x
);
330 enumerator
->destroy(enumerator
);
334 /*******************************************************************************
335 * create list from enumerator
338 START_TEST(test_create_from_enumerator
)
340 enumerator_t
*enumerator
, *enumerator_other
;
341 linked_list_t
*other
;
345 enumerator
= list
->create_enumerator(list
);
346 other
= linked_list_create_from_enumerator(enumerator
);
347 ck_assert_int_eq(other
->get_count(list
), 5);
349 enumerator
= list
->create_enumerator(list
);
350 enumerator_other
= other
->create_enumerator(other
);
351 while (enumerator
->enumerate(enumerator
, &x
) &&
352 enumerator_other
->enumerate(enumerator_other
, &y
))
354 ck_assert_int_eq(x
, y
);
357 ck_assert_int_eq(count
, 5);
358 enumerator_other
->destroy(enumerator_other
);
359 enumerator
->destroy(enumerator
);
360 other
->destroy(other
);
364 Suite
*linked_list_enumerator_suite_create()
369 s
= suite_create("linked list and enumerators");
371 tc
= tcase_create("enumerate");
372 tcase_add_checked_fixture(tc
, setup_list
, teardown_list
);
373 tcase_add_test(tc
, test_enumerate
);
374 tcase_add_test(tc
, test_enumerate_null
);
375 tcase_add_test(tc
, test_reset_enumerator
);
376 suite_add_tcase(s
, tc
);
378 tc
= tcase_create("insert_before()");
379 tcase_add_checked_fixture(tc
, setup_list
, teardown_list
);
380 tcase_add_loop_test(tc
, test_insert_before
, 1, 5);
381 tcase_add_test(tc
, test_insert_before_ends
);
382 tcase_add_test(tc
, test_insert_before_empty
);
383 suite_add_tcase(s
, tc
);
385 tc
= tcase_create("modify");
386 tcase_add_checked_fixture(tc
, setup_list
, teardown_list
);
387 tcase_add_test(tc
, test_remove_at
);
388 tcase_add_test(tc
, test_remove_at_multi
);
389 tcase_add_test(tc
, test_remove_at_ends
);
390 tcase_add_test(tc
, test_insert_before_remove_at
);
391 suite_add_tcase(s
, tc
);
393 tc
= tcase_create("create_from_enumerator");
394 tcase_add_checked_fixture(tc
, setup_list
, teardown_list
);
395 tcase_add_test(tc
, test_create_from_enumerator
);
396 suite_add_tcase(s
, tc
);