array: Add array_bsearch function
[strongswan.git] / src / libstrongswan / tests / suites / test_array.c
index 4295f0e..ba2aff4 100644 (file)
@@ -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);