array: Add array_sort function
This commit is contained in:
@@ -1,4 +1,7 @@
|
||||
/*
|
||||
* Copyright (C) 2014 Tobias Brunner
|
||||
* Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* Copyright (C) 2013 Martin Willi
|
||||
* Copyright (C) 2013 revosec AG
|
||||
*
|
||||
@@ -274,6 +277,88 @@ START_TEST(test_enumerate)
|
||||
}
|
||||
END_TEST
|
||||
|
||||
static int comp_obj(const void *a, const void *b, void *arg)
|
||||
{
|
||||
ck_assert_str_eq(arg, "arg");
|
||||
return *(int*)a - *(int*)b;
|
||||
}
|
||||
|
||||
START_TEST(test_sort_obj)
|
||||
{
|
||||
array_t *array;
|
||||
int x[][3] = {
|
||||
{1, 2, 3},
|
||||
{1, 3, 2},
|
||||
{2, 1, 3},
|
||||
{2, 3, 1},
|
||||
{3, 1, 2},
|
||||
{3, 2, 1},
|
||||
};
|
||||
char *arg = "arg";
|
||||
int i, v;
|
||||
|
||||
for (i = 0; i < countof(x); i++)
|
||||
{
|
||||
array = array_create(sizeof(x[i][0]), 0);
|
||||
array_insert(array, ARRAY_TAIL, &x[i][0]);
|
||||
array_insert(array, ARRAY_TAIL, &x[i][1]);
|
||||
array_insert(array, ARRAY_TAIL, &x[i][2]);
|
||||
|
||||
array_sort(array, comp_obj, arg);
|
||||
|
||||
ck_assert(array_get(array, 0, &v));
|
||||
ck_assert_int_eq(v, 1);
|
||||
ck_assert(array_get(array, 1, &v));
|
||||
ck_assert_int_eq(v, 2);
|
||||
ck_assert(array_get(array, 2, &v));
|
||||
ck_assert_int_eq(v, 3);
|
||||
|
||||
array_destroy(array);
|
||||
}
|
||||
}
|
||||
END_TEST
|
||||
|
||||
static int comp_ptr(const void *a, const void *b, void *arg)
|
||||
{
|
||||
ck_assert_str_eq(arg, "arg");
|
||||
return strcmp(a, b);
|
||||
}
|
||||
|
||||
START_TEST(test_sort_ptr)
|
||||
{
|
||||
array_t *array;
|
||||
char *x[][3] = {
|
||||
{"a", "b", "c"},
|
||||
{"a", "c", "b"},
|
||||
{"b", "a", "c"},
|
||||
{"b", "c", "a"},
|
||||
{"c", "a", "b"},
|
||||
{"c", "b", "a"},
|
||||
};
|
||||
char *v, *arg = "arg";
|
||||
int i;
|
||||
|
||||
for (i = 0; i < countof(x); i++)
|
||||
{
|
||||
array = array_create(0, 0);
|
||||
array_insert(array, ARRAY_TAIL, x[i][0]);
|
||||
array_insert(array, ARRAY_TAIL, x[i][1]);
|
||||
array_insert(array, ARRAY_TAIL, x[i][2]);
|
||||
|
||||
array_sort(array, comp_ptr, arg);
|
||||
|
||||
ck_assert(array_get(array, 0, &v));
|
||||
ck_assert_str_eq(v, "a");
|
||||
ck_assert(array_get(array, 1, &v));
|
||||
ck_assert_str_eq(v, "b");
|
||||
ck_assert(array_get(array, 2, &v));
|
||||
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;
|
||||
@@ -364,6 +449,11 @@ Suite *array_suite_create()
|
||||
tcase_add_test(tc, test_enumerate);
|
||||
suite_add_tcase(s, tc);
|
||||
|
||||
tc = tcase_create("sort");
|
||||
tcase_add_test(tc, test_sort_obj);
|
||||
tcase_add_test(tc, test_sort_ptr);
|
||||
suite_add_tcase(s, tc);
|
||||
|
||||
tc = tcase_create("invoke");
|
||||
tcase_add_test(tc, test_invoke);
|
||||
suite_add_tcase(s, tc);
|
||||
|
||||
Reference in New Issue
Block a user