diff options
author | Denis Kenzior <denkenz@gmail.com> | 2023-10-29 19:29:30 -0500 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2023-11-02 13:53:32 -0500 |
commit | c4e8419a9c96f6532ed8028d7d3d62e3940e026d (patch) | |
tree | 8e608077c49749350b3ca75a08631184ac082715 | |
parent | 38117a44e4daf88812ac3005555dc04353b78c31 (diff) |
unit: Add minheap tests
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | Makefile.am | 5 | ||||
-rw-r--r-- | unit/test-minheap.c | 155 |
3 files changed, 160 insertions, 1 deletions
@@ -63,6 +63,7 @@ unit/test-time unit/test-path unit/test-net unit/test-sysctl +unit/test-minheap unit/cert-*.pem unit/cert-*.csr unit/cert-*.srl diff --git a/Makefile.am b/Makefile.am index c648b49b..6c86e94e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -204,7 +204,8 @@ unit_tests = unit/test-unit \ unit/test-time \ unit/test-path \ unit/test-net \ - unit/test-sysctl + unit/test-sysctl \ + unit/test-minheap dbus_tests = unit/test-hwdb \ unit/test-dbus \ @@ -355,6 +356,8 @@ unit_test_net_LDADD = ell/libell-private.la unit_test_sysctl_LDADD = ell/libell-private.la +unit_test_minheap_LDADD = ell/libell-private.la + unit_test_data_files = unit/settings.test unit/dbus.conf if EXAMPLES diff --git a/unit/test-minheap.c b/unit/test-minheap.c new file mode 100644 index 00000000..3354fd19 --- /dev/null +++ b/unit/test-minheap.c @@ -0,0 +1,155 @@ +/* + * Embedded Linux library + * Copyright (C) 2023 Cruise LLC + * + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <assert.h> +#include <limits.h> +#include <stdlib.h> + +#include <ell/ell.h> +#include "ell/useful.h" + +static inline void swap_int(void *l, void *r) +{ + int *li = l; + int *ri = r; + + SWAP(*li, *ri); +} + +static inline bool less(const void *l, const void *r) +{ + const int *li = l; + const int *ri = r; + + return *li < *ri; +} + +static const struct l_minheap_ops ops = { + .less = less, + .swap = swap_int, + .elem_size = sizeof(int), +}; + +static const int test_values[] = { + 3, 1, 2, 4, INT_MAX, INT_MIN, -4, -2, -1, -3, 0, INT_MIN, INT_MAX +}; + +static void verify_pop(struct l_minheap *minheap) +{ + size_t size = minheap->used; + int *values = minheap->data; + int last; + + last = values[0]; + while (size) { + assert(last <= values[0]); + last = values[0]; + assert(l_minheap_pop(minheap, &ops, NULL)); + size -= 1; + } +} + +static void test_minheap_init(const void *data) +{ + struct l_minheap minheap; + int *values = alloca(sizeof(test_values)); + + memcpy(values, test_values, sizeof(test_values)); + + l_minheap_init(&minheap, values, L_ARRAY_SIZE(test_values), + L_ARRAY_SIZE(test_values), &ops); + + verify_pop(&minheap); +} + +static void test_minheap_push(const void *data) +{ + struct l_minheap minheap; + int *values = l_newa(int, L_ARRAY_SIZE(test_values)); + unsigned int i; + + l_minheap_init(&minheap, values, 0, L_ARRAY_SIZE(test_values), &ops); + + for (i = 0; i < L_ARRAY_SIZE(test_values); i++) + assert(l_minheap_push(&minheap, &ops, &test_values[i])); + + verify_pop(&minheap); +} + +static void test_minheap_push_random(const void *data) +{ + struct l_minheap minheap; + unsigned int n_items = 1024 * 1024; + int *values = l_malloc(sizeof(int) * n_items); + unsigned int i; + + l_minheap_init(&minheap, values, 0, n_items, &ops); + + for (i = 0; i < n_items; i++) { + unsigned int r = random(); + + assert(l_minheap_push(&minheap, &ops, &r)); + } + + verify_pop(&minheap); + l_free(values); +} + +static void test_minheap_pop_push(const void *data) +{ + struct l_minheap minheap; + int *values = alloca(sizeof(test_values)); + unsigned int i; + int tmp; + + for (i = 0; i < L_ARRAY_SIZE(test_values); i++) + values[i] = INT_MIN; + + l_minheap_init(&minheap, values, L_ARRAY_SIZE(test_values), + L_ARRAY_SIZE(test_values), &ops); + + for (i = 0; i < L_ARRAY_SIZE(test_values); i++) { + tmp = test_values[i]; + + assert(l_minheap_pop_push(&minheap, &ops, &tmp)); + assert(tmp == INT_MIN); + } + + verify_pop(&minheap); +} + +static void test_minheap_delete(const void *data) +{ + struct l_minheap minheap; + int *values = l_newa(int, L_ARRAY_SIZE(test_values)); + unsigned int i; + + for (i = 0; i < L_ARRAY_SIZE(test_values); i++) { + l_minheap_init(&minheap, values, L_ARRAY_SIZE(test_values), + L_ARRAY_SIZE(test_values), &ops); + assert(l_minheap_delete(&minheap, i, &ops)); + verify_pop(&minheap); + } +} + +int main(int argc, char *argv[]) +{ + l_test_init(&argc, &argv); + + l_test_add("minheap/init", test_minheap_init, NULL); + l_test_add("minheap/push", test_minheap_push, NULL); + l_test_add("minheap/push_random", test_minheap_push_random, NULL); + l_test_add("minheap/pop_push", test_minheap_pop_push, NULL); + l_test_add("minheap/delete", test_minheap_delete, NULL); + + return l_test_run(); +} |