Annotation of embedaddon/strongswan/src/libstrongswan/tests/suites/test_linked_list_enumerator.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2013 Tobias Brunner
3: * HSR Hochschule fuer Technik Rapperswil
4: *
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>.
9: *
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
13: * for more details.
14: */
15:
16: #include "test_suite.h"
17:
18: #include <collections/linked_list.h>
19:
20: /*******************************************************************************
21: * test fixture
22: */
23:
24: static linked_list_t *list;
25:
26: START_SETUP(setup_list)
27: {
28: list = linked_list_create_with_items((void*)1, (void*)2, (void*)3, (void*)4,
29: (void*)5, NULL);
30: ck_assert_int_eq(list->get_count(list), 5);
31: }
32: END_SETUP
33:
34: START_TEARDOWN(teardown_list)
35: {
36: list->destroy(list);
37: }
38: END_TEARDOWN
39:
40: /*******************************************************************************
41: * enumeration
42: */
43:
44: START_TEST(test_enumerate)
45: {
46: enumerator_t *enumerator;
47: intptr_t x;
48: int round;
49:
50: round = 1;
51: enumerator = list->create_enumerator(list);
52: while (enumerator->enumerate(enumerator, &x))
53: {
54: ck_assert_int_eq(round, x);
55: round++;
56: }
57: ck_assert_int_eq(round, 6);
58: enumerator->destroy(enumerator);
59: }
60: END_TEST
61:
62: START_TEST(test_enumerate_null)
63: {
64: enumerator_t *enumerator;
65: int round;
66:
67: round = 1;
68: enumerator = list->create_enumerator(list);
69: while (enumerator->enumerate(enumerator, NULL))
70: {
71: round++;
72: }
73: ck_assert_int_eq(round, 6);
74: enumerator->destroy(enumerator);
75: }
76: END_TEST
77:
78: START_TEST(test_reset_enumerator)
79: {
80: enumerator_t *enumerator;
81: intptr_t x;
82: int round;
83:
84: enumerator = list->create_enumerator(list);
85: while (enumerator->enumerate(enumerator, &x))
86: {
87: }
88: list->reset_enumerator(list, enumerator);
89: round = 1;
90: while (enumerator->enumerate(enumerator, &x))
91: {
92: ck_assert_int_eq(round, x);
93: round++;
94: }
95: ck_assert_int_eq(round, 6);
96: enumerator->destroy(enumerator);
97: }
98: END_TEST
99:
100: /*******************************************************************************
101: * insert before
102: */
103:
104: START_TEST(test_insert_before)
105: {
106: enumerator_t *enumerator;
107: intptr_t x;
108: int round;
109:
110: round = 1;
111: enumerator = list->create_enumerator(list);
112: while (enumerator->enumerate(enumerator, &x))
113: {
114: ck_assert_int_eq(round, x);
115: round++;
116: if (x == _i)
117: {
118: list->insert_before(list, enumerator, (void*)6);
119: }
120: }
121: ck_assert_int_eq(list->get_count(list), 6);
122: list->reset_enumerator(list, enumerator);
123: round = 1;
124: while (enumerator->enumerate(enumerator, &x))
125: {
126: if (round == _i && x != _i)
127: {
128: ck_assert_int_eq(6, x);
129: }
130: else
131: {
132: ck_assert_int_eq(round, x);
133: round++;
134: }
135: }
136: enumerator->destroy(enumerator);
137: }
138: END_TEST
139:
140: START_TEST(test_insert_before_ends)
141: {
142: enumerator_t *enumerator;
143: intptr_t x;
144: int round;
145:
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);
152: round = 1;
153: while (enumerator->enumerate(enumerator, &x))
154: {
155: ck_assert_int_eq(round, x);
156: round++;
157: }
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);
164: }
165: END_TEST
166:
167: START_TEST(test_insert_before_empty)
168: {
169: enumerator_t *enumerator;
170: intptr_t x;
171:
172: list->destroy(list);
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);
190: }
191: END_TEST
192:
193: /*******************************************************************************
194: * remove_at
195: */
196:
197: START_TEST(test_remove_at)
198: {
199: enumerator_t *enumerator;
200: intptr_t x;
201: int round;
202:
203: round = 1;
204: enumerator = list->create_enumerator(list);
205: while (enumerator->enumerate(enumerator, &x))
206: {
207: ck_assert_int_eq(round, x);
208: if (round == 2)
209: {
210: list->remove_at(list, enumerator);
211: }
212: round++;
213: }
214: ck_assert_int_eq(list->get_count(list), 4);
215: list->reset_enumerator(list, enumerator);
216: round = 1;
217: while (enumerator->enumerate(enumerator, &x))
218: {
219: if (round == 2)
220: { /* skip removed item */
221: round++;
222: }
223: ck_assert_int_eq(round, x);
224: round++;
225: }
226: enumerator->destroy(enumerator);
227: }
228: END_TEST
229:
230: START_TEST(test_remove_at_multi)
231: {
232: enumerator_t *enumerator;
233: intptr_t x;
234: int round;
235:
236: round = 1;
237: enumerator = list->create_enumerator(list);
238: while (enumerator->enumerate(enumerator, &x))
239: {
240: ck_assert_int_eq(round, x);
241: if (round == 2 || round == 5)
242: {
243: list->remove_at(list, enumerator);
244: }
245: round++;
246: }
247: ck_assert_int_eq(list->get_count(list), 3);
248: list->reset_enumerator(list, enumerator);
249: round = 1;
250: while (enumerator->enumerate(enumerator, &x))
251: {
252: if (round == 2)
253: { /* skip removed item */
254: round++;
255: }
256: ck_assert_int_eq(round, x);
257: list->remove_at(list, enumerator);
258: round++;
259: }
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);
264: }
265: END_TEST
266:
267: START_TEST(test_remove_at_ends)
268: {
269: enumerator_t *enumerator;
270: intptr_t x;
271:
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))
278: {
279: }
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);
285: }
286: END_TEST
287:
288: START_TEST(test_insert_before_remove_at)
289: {
290: enumerator_t *enumerator;
291: intptr_t x;
292: int round;
293:
294: round = 1;
295: enumerator = list->create_enumerator(list);
296: while (enumerator->enumerate(enumerator, &x))
297: {
298: ck_assert_int_eq(round, x);
299: if (round == 2)
300: { /* this replaces the current item */
301: list->insert_before(list, enumerator, (void*)42);
302: list->remove_at(list, enumerator);
303: }
304: else if (round == 4)
305: { /* same here, the order of calls does not matter */
306: list->remove_at(list, enumerator);
307: list->insert_before(list, enumerator, (void*)21);
308: }
309: round++;
310: }
311: ck_assert_int_eq(list->get_count(list), 5);
312: list->reset_enumerator(list, enumerator);
313: round = 1;
314: while (enumerator->enumerate(enumerator, &x))
315: {
316: if (round == 2)
317: { /* check replaced item */
318: ck_assert_int_eq(42, x);
319: }
320: else if (round == 4)
321: { /* check replace item */
322: ck_assert_int_eq(21, x);
323: }
324: else
325: {
326: ck_assert_int_eq(round, x);
327: }
328: round++;
329: }
330: enumerator->destroy(enumerator);
331: }
332: END_TEST
333:
334: /*******************************************************************************
335: * create list from enumerator
336: */
337:
338: START_TEST(test_create_from_enumerator)
339: {
340: enumerator_t *enumerator, *enumerator_other;
341: linked_list_t *other;
342: intptr_t x, y;
343: int count = 0;
344:
345: enumerator = list->create_enumerator(list);
346: other = linked_list_create_from_enumerator(enumerator);
347: ck_assert_int_eq(other->get_count(list), 5);
348:
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))
353: {
354: ck_assert_int_eq(x, y);
355: count++;
356: }
357: ck_assert_int_eq(count, 5);
358: enumerator_other->destroy(enumerator_other);
359: enumerator->destroy(enumerator);
360: other->destroy(other);
361: }
362: END_TEST
363:
364: Suite *linked_list_enumerator_suite_create()
365: {
366: Suite *s;
367: TCase *tc;
368:
369: s = suite_create("linked list and enumerators");
370:
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);
377:
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);
384:
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);
392:
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);
397:
398: return s;
399: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>