2 * Copyright (C) 2013 Tobias Brunner
3 * 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 list
->insert_before(list
, enumerator
, (void*)0);
148 ck_assert_int_eq(list
->get_count(list
), 6);
149 ck_assert(list
->get_first(list
, (void*)&x
) == SUCCESS
);
150 ck_assert_int_eq(x
, 0);
152 while (enumerator
->enumerate(enumerator
, &x
))
154 ck_assert_int_eq(round
, x
);
157 list
->insert_before(list
, enumerator
, (void*)6);
158 ck_assert_int_eq(list
->get_count(list
), 7);
159 ck_assert(list
->get_last(list
, (void*)&x
) == SUCCESS
);
160 ck_assert_int_eq(x
, 6);
161 ck_assert(!enumerator
->enumerate(enumerator
, &x
));
162 enumerator
->destroy(enumerator
);
166 START_TEST(test_insert_before_empty
)
168 enumerator_t
*enumerator
;
172 list
= linked_list_create();
173 enumerator
= list
->create_enumerator(list
);
174 list
->insert_before(list
, enumerator
, (void*)1);
175 ck_assert_int_eq(list
->get_count(list
), 1);
176 ck_assert(list
->get_first(list
, (void*)&x
) == SUCCESS
);
177 ck_assert_int_eq(x
, 1);
178 ck_assert(list
->get_last(list
, (void*)&x
) == SUCCESS
);
179 ck_assert_int_eq(x
, 1);
180 ck_assert(enumerator
->enumerate(enumerator
, &x
));
181 ck_assert_int_eq(x
, 1);
182 ck_assert(!enumerator
->enumerate(enumerator
, NULL
));
183 enumerator
->destroy(enumerator
);
187 /*******************************************************************************
191 START_TEST(test_remove_at
)
193 enumerator_t
*enumerator
;
198 enumerator
= list
->create_enumerator(list
);
199 while (enumerator
->enumerate(enumerator
, &x
))
201 ck_assert_int_eq(round
, x
);
204 list
->remove_at(list
, enumerator
);
208 ck_assert_int_eq(list
->get_count(list
), 4);
209 list
->reset_enumerator(list
, enumerator
);
211 while (enumerator
->enumerate(enumerator
, &x
))
214 { /* skip removed item */
217 ck_assert_int_eq(round
, x
);
220 enumerator
->destroy(enumerator
);
224 START_TEST(test_remove_at_ends
)
226 enumerator_t
*enumerator
;
229 enumerator
= list
->create_enumerator(list
);
230 list
->remove_at(list
, enumerator
);
231 ck_assert_int_eq(list
->get_count(list
), 5);
232 ck_assert(list
->get_first(list
, (void*)&x
) == SUCCESS
);
233 ck_assert_int_eq(x
, 1);
234 while (enumerator
->enumerate(enumerator
, &x
))
237 list
->remove_at(list
, enumerator
);
238 ck_assert_int_eq(list
->get_count(list
), 5);
239 ck_assert(list
->get_last(list
, (void*)&x
) == SUCCESS
);
240 ck_assert_int_eq(x
, 5);
241 enumerator
->destroy(enumerator
);
245 START_TEST(test_insert_before_remove_at
)
247 enumerator_t
*enumerator
;
252 enumerator
= list
->create_enumerator(list
);
253 while (enumerator
->enumerate(enumerator
, &x
))
255 ck_assert_int_eq(round
, x
);
257 { /* this replaces the current item, as insert_before does not change
258 * the enumerator position */
259 list
->insert_before(list
, enumerator
, (void*)42);
260 list
->remove_at(list
, enumerator
);
263 { /* this does not replace the item, as remove_at moves the enumerator
264 * position to the previous item */
265 list
->remove_at(list
, enumerator
);
266 list
->insert_before(list
, enumerator
, (void*)21);
270 ck_assert_int_eq(list
->get_count(list
), 5);
271 list
->reset_enumerator(list
, enumerator
);
273 while (enumerator
->enumerate(enumerator
, &x
))
276 { /* check replaced item */
277 ck_assert_int_eq(42, x
);
280 { /* check misplaced item */
281 ck_assert_int_eq(21, x
);
284 { /* check misplaced item */
285 ck_assert_int_eq(3, x
);
289 ck_assert_int_eq(round
, x
);
293 enumerator
->destroy(enumerator
);
297 /*******************************************************************************
298 * create list from enumerator
301 START_TEST(test_create_from_enumerator
)
303 enumerator_t
*enumerator
, *enumerator_other
;
304 linked_list_t
*other
;
308 enumerator
= list
->create_enumerator(list
);
309 other
= linked_list_create_from_enumerator(enumerator
);
310 ck_assert_int_eq(other
->get_count(list
), 5);
312 enumerator
= list
->create_enumerator(list
);
313 enumerator_other
= other
->create_enumerator(other
);
314 while (enumerator
->enumerate(enumerator
, &x
) &&
315 enumerator_other
->enumerate(enumerator_other
, &y
))
317 ck_assert_int_eq(x
, y
);
320 ck_assert_int_eq(count
, 5);
321 enumerator_other
->destroy(enumerator_other
);
322 enumerator
->destroy(enumerator
);
323 other
->destroy(other
);
327 Suite
*linked_list_enumerator_suite_create()
332 s
= suite_create("linked list and enumerators");
334 tc
= tcase_create("enumerate");
335 tcase_add_checked_fixture(tc
, setup_list
, teardown_list
);
336 tcase_add_test(tc
, test_enumerate
);
337 tcase_add_test(tc
, test_enumerate_null
);
338 tcase_add_test(tc
, test_reset_enumerator
);
339 suite_add_tcase(s
, tc
);
341 tc
= tcase_create("insert_before()");
342 tcase_add_checked_fixture(tc
, setup_list
, teardown_list
);
343 tcase_add_loop_test(tc
, test_insert_before
, 1, 5);
344 tcase_add_test(tc
, test_insert_before_ends
);
345 tcase_add_test(tc
, test_insert_before_empty
);
346 suite_add_tcase(s
, tc
);
348 tc
= tcase_create("modify");
349 tcase_add_checked_fixture(tc
, setup_list
, teardown_list
);
350 tcase_add_test(tc
, test_remove_at
);
351 tcase_add_test(tc
, test_remove_at_ends
);
352 tcase_add_test(tc
, test_insert_before_remove_at
);
353 suite_add_tcase(s
, tc
);
355 tc
= tcase_create("create_from_enumerator");
356 tcase_add_checked_fixture(tc
, setup_list
, teardown_list
);
357 tcase_add_test(tc
, test_create_from_enumerator
);
358 suite_add_tcase(s
, tc
);