aboutsummaryrefslogtreecommitdiffstats
path: root/src/libstrongswan/tests/suites/test_array.c
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2014-01-27 15:02:19 +0100
committerTobias Brunner <tobias@strongswan.org>2014-02-12 14:34:33 +0100
commit79962d9e995b6805c39b0dd3fc3e8d3d974d9abf (patch)
tree590be9da1a286c6dd2ba164e9d95585865106b8f /src/libstrongswan/tests/suites/test_array.c
parent132b00ce02e6e9c4b4a73aea415a33e3f444ac99 (diff)
downloadstrongswan-79962d9e995b6805c39b0dd3fc3e8d3d974d9abf.tar.bz2
strongswan-79962d9e995b6805c39b0dd3fc3e8d3d974d9abf.tar.xz
array: Add array_bsearch function
Diffstat (limited to 'src/libstrongswan/tests/suites/test_array.c')
-rw-r--r--src/libstrongswan/tests/suites/test_array.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/libstrongswan/tests/suites/test_array.c b/src/libstrongswan/tests/suites/test_array.c
index 4295f0e66..ba2aff460 100644
--- a/src/libstrongswan/tests/suites/test_array.c
+++ b/src/libstrongswan/tests/suites/test_array.c
@@ -359,6 +359,67 @@ START_TEST(test_sort_ptr)
}
END_TEST
+static int comp_search_obj(const void *a, const void *b)
+{
+ return *(int*)a - *(int*)b;
+}
+
+START_TEST(test_bsearch_obj)
+{
+ array_t *array;
+ int x[] = { 3, 2, 1 };
+ int k, v;
+
+ array = array_create(sizeof(x[0]), 0);
+ array_insert(array, ARRAY_TAIL, &x[0]);
+ array_insert(array, ARRAY_TAIL, &x[1]);
+ array_insert(array, ARRAY_TAIL, &x[2]);
+
+ array_sort(array, (void*)comp_search_obj, NULL);
+
+ k = 0;
+ ck_assert_int_eq(array_bsearch(array, &k, comp_search_obj, &v), -1);
+ for (k = 1; k < 4; k++)
+ {
+ ck_assert_int_eq(array_bsearch(array, &k, comp_search_obj, &v), k-1);
+ ck_assert_int_eq(v, k);
+ }
+ k = 4;
+ ck_assert_int_eq(array_bsearch(array, &k, comp_search_obj, &v), -1);
+ array_destroy(array);
+}
+END_TEST
+
+static int comp_search_ptr(const void *a, const void *b)
+{
+ return strcmp(a, b);
+}
+
+START_TEST(test_bsearch_ptr)
+{
+ array_t *array;
+ char *x[] = {"c", "b", "a"};
+ char *v;
+
+ array = array_create(0, 0);
+ array_insert(array, ARRAY_TAIL, x[0]);
+ array_insert(array, ARRAY_TAIL, x[1]);
+ array_insert(array, ARRAY_TAIL, x[2]);
+
+ array_sort(array, (void*)comp_search_ptr, NULL);
+
+ ck_assert_int_eq(array_bsearch(array, "abc", comp_search_ptr, &v), -1);
+ ck_assert_int_eq(array_bsearch(array, "a", comp_search_ptr, &v), 0);
+ ck_assert_str_eq(v, "a");
+ ck_assert_int_eq(array_bsearch(array, "b", comp_search_ptr, &v), 1);
+ ck_assert_str_eq(v, "b");
+ ck_assert_int_eq(array_bsearch(array, "c", comp_search_ptr, &v), 2);
+ ck_assert_str_eq(v, "c");
+
+ array_destroy(array);
+}
+END_TEST
+
static void invoke(void *data, int idx, void *user)
{
int *y = user, *x = data;
@@ -454,6 +515,11 @@ Suite *array_suite_create()
tcase_add_test(tc, test_sort_ptr);
suite_add_tcase(s, tc);
+ tc = tcase_create("bsearch");
+ tcase_add_test(tc, test_bsearch_obj);
+ tcase_add_test(tc, test_bsearch_ptr);
+ suite_add_tcase(s, tc);
+
tc = tcase_create("invoke");
tcase_add_test(tc, test_invoke);
suite_add_tcase(s, tc);