]>
git.ipfire.org Git - thirdparty/strongswan.git/blob - src/libstrongswan/tests/test_enumerator.c
b5dde465095c552855af5f01fe34b8dfa6b9bf44
2 * Copyright (C) 2013 Tobias Brunner
3 * Copyright (C) 2007 Martin Willi
4 * Hochschule fuer Technik Rapperswil
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2 of the License, or (at your
9 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 #include "test_suite.h"
19 #include <collections/enumerator.h>
20 #include <collections/linked_list.h>
22 /*******************************************************************************
26 static const char *token_results1
[] = { "abc", "cde", "efg" };
27 static const char *token_results2
[] = { "a", "b", "c" };
35 {"abc, cde, efg", ",", " ", token_results1
},
36 {" abc 1:2 cde;3 4efg5. ", ":;.,", " 12345", token_results1
},
37 {"abc.cde,efg", ",.", "", token_results1
},
38 {" abc cde efg ", " ", " ", token_results1
},
39 {"a'abc' c 'cde' cefg", " ", " abcd", token_results1
},
40 {"'abc' abc 'cde'd 'efg'", " ", " abcd", token_results1
},
42 {"a, b, c", ",", " ", token_results2
},
43 {"a,b,c", ",", " ", token_results2
},
44 {" a 1:2 b;3 4c5. ", ":;.,", " 12345", token_results2
},
45 {"a.b,c", ",.", "", token_results2
},
46 {" a b c ", " ", " ", token_results2
},
49 START_TEST(test_token
)
51 enumerator_t
*enumerator
;
56 enumerator
= enumerator_create_token(token_tests
[_i
].string
,
57 token_tests
[_i
].sep
, token_tests
[_i
].trim
);
58 results
= token_tests
[_i
].results
;
59 while (enumerator
->enumerate(enumerator
, &token
))
66 ck_assert_str_eq(token
, results
[tok
]);
69 fail("unexpected token '%s'", token
);
73 fail_if(tok
!= 3, "not enough tokens (%d) extracted from '%s'",
74 tok
, token_tests
[_i
].string
);
75 enumerator
->destroy(enumerator
);
79 /*******************************************************************************
80 * utilities for filtered, nested and cleaner tests
83 static int destroy_data_called
;
85 START_SETUP(setup_destroy_data
)
87 destroy_data_called
= 0;
91 START_TEARDOWN(teardown_destroy_data
)
93 ck_assert_int_eq(destroy_data_called
, 1);
97 static void destroy_data(void *data
)
99 fail_if(data
!= (void*)101, "data does not match '101' in destructor");
100 destroy_data_called
++;
103 /*******************************************************************************
107 static bool filter(void *data
, int *v
, int *vo
, int *w
, int *wo
,
108 int *x
, int *xo
, int *y
, int *yo
, int *z
, int *zo
)
117 fail_if(data
!= (void*)101, "data does not match '101' in filter function");
121 static bool filter_odd(void *data
, int *item
, int *out
)
123 fail_if(data
!= (void*)101, "data does not match '101' in filter function");
125 return *item
% 2 == 0;
128 START_TEST(test_filtered
)
130 int round
, v
, w
, x
, y
, z
;
132 enumerator_t
*enumerator
;
134 list
= linked_list_create_with_items((void*)1, (void*)2, (void*)3, (void*)4,
138 enumerator
= enumerator_create_filter(list
->create_enumerator(list
),
139 (void*)filter
, (void*)101, destroy_data
);
140 while (enumerator
->enumerate(enumerator
, &v
, &w
, &x
, &y
, &z
))
142 ck_assert_int_eq(v
, round
);
143 ck_assert_int_eq(w
, round
+ 1);
144 ck_assert_int_eq(x
, round
+ 2);
145 ck_assert_int_eq(y
, round
+ 3);
146 ck_assert_int_eq(z
, round
+ 4);
149 enumerator
->destroy(enumerator
);
150 ck_assert_int_eq(round
, 6);
156 START_TEST(test_filtered_filter
)
160 enumerator_t
*enumerator
;
162 list
= linked_list_create_with_items((void*)1, (void*)2, (void*)3, (void*)4,
166 /* should also work without destructor, so set this manually */
167 destroy_data_called
= 1;
168 enumerator
= enumerator_create_filter(list
->create_enumerator(list
),
169 (void*)filter_odd
, (void*)101, NULL
);
170 while (enumerator
->enumerate(enumerator
, &x
))
172 ck_assert(x
% 2 == 0);
175 enumerator
->destroy(enumerator
);
176 ck_assert_int_eq(count
, 2);
182 /*******************************************************************************
186 static enumerator_t
* create_inner(linked_list_t
*outer
, void *data
)
188 fail_if(data
!= (void*)101, "data does not match '101' in nested constr.");
189 return outer
->create_enumerator(outer
);
192 static enumerator_t
* create_inner_null(void *outer
, void *data
)
194 ck_assert(outer
== (void*)1);
195 fail_if(data
!= (void*)101, "data does not match '101' in nested constr.");
199 START_TEST(test_nested
)
201 linked_list_t
*list
, *l1
, *l2
, *l3
;
202 enumerator_t
*enumerator
;
206 l1
= linked_list_create_with_items((void*)1, (void*)2, NULL
);
207 l2
= linked_list_create();
208 l3
= linked_list_create_with_items((void*)3, (void*)4, (void*)5, NULL
);
209 list
= linked_list_create_with_items(l1
, l2
, l3
, NULL
);
212 enumerator
= enumerator_create_nested(list
->create_enumerator(list
),
213 (void*)create_inner
, (void*)101, destroy_data
);
214 while (enumerator
->enumerate(enumerator
, &x
))
216 ck_assert_int_eq(round
, x
);
219 enumerator
->destroy(enumerator
);
220 ck_assert_int_eq(round
, 6);
229 START_TEST(test_nested_reset
)
231 linked_list_t
*list
, *l1
, *l2
, *l3
;
232 enumerator_t
*outer
, *enumerator
;
236 l1
= linked_list_create_with_items((void*)1, (void*)2, NULL
);
237 l2
= linked_list_create();
238 l3
= linked_list_create_with_items((void*)3, (void*)4, (void*)5, NULL
);
239 list
= linked_list_create_with_items(l1
, l2
, l3
, NULL
);
241 outer
= list
->create_enumerator(list
);
242 enumerator
= enumerator_create_nested(outer
, (void*)create_inner
,
243 (void*)101, destroy_data
);
244 while (enumerator
->enumerate(enumerator
, &x
))
248 ck_assert_int_eq(count
, 5);
250 list
->reset_enumerator(list
, outer
);
251 ck_assert(enumerator
->enumerate(enumerator
, &x
));
252 ck_assert_int_eq(x
, 1);
253 enumerator
->destroy(enumerator
);
262 START_TEST(test_nested_empty
)
265 enumerator_t
*enumerator
;
269 list
= linked_list_create();
271 enumerator
= enumerator_create_nested(list
->create_enumerator(list
),
272 (void*)create_inner
, (void*)101, destroy_data
);
273 while (enumerator
->enumerate(enumerator
, &x
))
277 enumerator
->destroy(enumerator
);
278 ck_assert_int_eq(count
, 0);
284 START_TEST(test_nested_null
)
287 enumerator_t
*enumerator
;
291 list
= linked_list_create_with_items((void*)1, NULL
);
294 /* should also work without destructor, so set this manually */
295 destroy_data_called
= 1;
296 enumerator
= enumerator_create_nested(list
->create_enumerator(list
),
297 (void*)create_inner_null
, (void*)101, NULL
);
298 while (enumerator
->enumerate(enumerator
, &x
))
302 enumerator
->destroy(enumerator
);
303 ck_assert_int_eq(count
, 0);
309 /*******************************************************************************
313 START_TEST(test_cleaner
)
315 enumerator_t
*enumerator
;
320 list
= linked_list_create_with_items((void*)1, (void*)2, NULL
);
323 enumerator
= enumerator_create_cleaner(list
->create_enumerator(list
),
324 destroy_data
, (void*)101);
325 while (enumerator
->enumerate(enumerator
, &x
))
327 ck_assert_int_eq(round
, x
);
330 ck_assert_int_eq(round
, 3);
331 enumerator
->destroy(enumerator
);
336 /*******************************************************************************
340 static void single_cleanup(void *data
)
342 ck_assert_int_eq((intptr_t)data
, 1);
345 static void do_test_single(enumerator_t
*enumerator
)
349 ck_assert(enumerator
->enumerate(enumerator
, &x
));
350 ck_assert_int_eq(x
, 1);
351 ck_assert(!enumerator
->enumerate(enumerator
, &x
));
352 enumerator
->destroy(enumerator
);
355 START_TEST(test_single
)
357 enumerator_t
*enumerator
;
359 enumerator
= enumerator_create_single((void*)1, NULL
);
360 do_test_single(enumerator
);
364 START_TEST(test_single_cleanup
)
366 enumerator_t
*enumerator
;
368 enumerator
= enumerator_create_single((void*)1, single_cleanup
);
369 do_test_single(enumerator
);
373 Suite
*enumerator_suite_create()
378 s
= suite_create("enumerator");
380 tc
= tcase_create("tokens");
381 tcase_add_loop_test(tc
, test_token
, 0, countof(token_tests
));
382 suite_add_tcase(s
, tc
);
384 tc
= tcase_create("filtered");
385 tcase_add_checked_fixture(tc
, setup_destroy_data
, teardown_destroy_data
);
386 tcase_add_test(tc
, test_filtered
);
387 tcase_add_test(tc
, test_filtered_filter
);
388 suite_add_tcase(s
, tc
);
390 tc
= tcase_create("nested");
391 tcase_add_checked_fixture(tc
, setup_destroy_data
, teardown_destroy_data
);
392 tcase_add_test(tc
, test_nested
);
393 tcase_add_test(tc
, test_nested_reset
);
394 tcase_add_test(tc
, test_nested_empty
);
395 tcase_add_test(tc
, test_nested_null
);
396 suite_add_tcase(s
, tc
);
398 tc
= tcase_create("cleaner");
399 tcase_add_checked_fixture(tc
, setup_destroy_data
, teardown_destroy_data
);
400 tcase_add_test(tc
, test_cleaner
);
401 suite_add_tcase(s
, tc
);
403 tc
= tcase_create("single");
404 tcase_add_test(tc
, test_single
);
405 tcase_add_test(tc
, test_single_cleanup
);
406 suite_add_tcase(s
, tc
);