summaryrefslogtreecommitdiffstats
path: root/test/sorted_array_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/sorted_array_test.c')
-rw-r--r--test/sorted_array_test.c213
1 files changed, 0 insertions, 213 deletions
diff --git a/test/sorted_array_test.c b/test/sorted_array_test.c
deleted file mode 100644
index cc87619..0000000
--- a/test/sorted_array_test.c
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- Copyright 2011-2020 David Robillard <d@drobilla.net>
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted, provided that the above
- copyright notice and this permission notice appear in all copies.
-
- THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-*/
-
-#include "test_data.h"
-
-#include "zix/common.h"
-#include "zix/sorted_array.h"
-
-#include <inttypes.h>
-#include <stdbool.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-
-static unsigned seed = 1;
-
-static int
-int_cmp(const void* a, const void* b, const void* ZIX_UNUSED(user_data))
-{
- const intptr_t ia = *(const intptr_t*)a;
- const intptr_t ib = *(const intptr_t*)b;
-
- return ia < ib ? -1 : ia > ib ? 1 : 0;
-}
-
-static intptr_t
-ith_elem(unsigned test_num, unsigned n_elems, unsigned i)
-{
- switch (test_num % 3) {
- case 0:
- return i; // Increasing (worst case)
- case 1:
- return n_elems - i; // Decreasing (worse case)
- case 2:
- default:
- return lcg64(seed + i) % 100u; // Pseudo-random
- }
-}
-
-static int
-test_fail(void)
-{
- return EXIT_FAILURE;
-}
-
-static int
-stress(unsigned test_num, unsigned n_elems)
-{
- intptr_t r = 0;
- ZixSortedArrayIter ti = NULL;
-
- ZixSortedArray* t =
- zix_sorted_array_new(true, int_cmp, NULL, sizeof(intptr_t));
-
- // Insert n_elems elements
- for (unsigned i = 0; i < n_elems; ++i) {
- r = ith_elem(test_num, n_elems, i);
- int status = zix_sorted_array_insert(t, &r, &ti);
- if (status) {
- fprintf(stderr, "Insert failed\n");
- return test_fail();
- }
-
- if (*(intptr_t*)zix_sorted_array_get_data(ti) != r) {
- fprintf(stderr,
- "Data corrupt (%" PRIdPTR " != %" PRIdPTR ")\n",
- *(intptr_t*)zix_sorted_array_get_data(ti),
- r);
- return test_fail();
- }
- }
-
- // Search for all elements
- for (unsigned i = 0; i < n_elems; ++i) {
- r = ith_elem(test_num, n_elems, i);
- if (zix_sorted_array_find(t, &r, &ti)) {
- fprintf(stderr, "Find failed\n");
- return test_fail();
- }
-
- if (*(intptr_t*)zix_sorted_array_get_data(ti) != r) {
- fprintf(stderr,
- "Data corrupt (%" PRIdPTR " != %" PRIdPTR ")\n",
- *(intptr_t*)zix_sorted_array_get_data(ti),
- r);
- return test_fail();
- }
- }
-
- // Iterate over all elements
- unsigned i = 0;
- intptr_t last = -1;
- for (ZixSortedArrayIter iter = zix_sorted_array_begin(t);
- !zix_sorted_array_iter_is_end(t, iter);
- iter = zix_sorted_array_iter_next(t, iter), ++i) {
- r = ith_elem(test_num, n_elems, i);
-
- const intptr_t iter_data = *(intptr_t*)zix_sorted_array_get_data(iter);
- if (iter_data < last) {
- fprintf(stderr,
- "Iter corrupt (%" PRIdPTR " < %" PRIdPTR ")\n",
- iter_data,
- last);
- return test_fail();
- }
- last = iter_data;
- }
-
- if (i != zix_sorted_array_size(t)) {
- fprintf(stderr,
- "Iterated over only %u/%" PRIuPTR " elements\n",
- i,
- zix_sorted_array_size(t));
- return test_fail();
- }
-
- if (zix_sorted_array_index(t, zix_sorted_array_size(t))) {
- fprintf(stderr, "Got element past end\n");
- return test_fail();
- }
-
- // Iterate over all elements by index
- last = -1;
- for (i = 0; i < zix_sorted_array_size(t); ++i) {
- r = ith_elem(test_num, n_elems, i);
-
- const intptr_t iter_data = *(intptr_t*)zix_sorted_array_index(t, i);
- if (iter_data < last) {
- fprintf(stderr,
- "Iter corrupt (%" PRIdPTR " < %" PRIdPTR ")\n",
- iter_data,
- last);
- return test_fail();
- }
-
- last = iter_data;
- }
-
- // Delete all elements
- for (unsigned e = 0; e < n_elems; e++) {
- r = ith_elem(test_num, n_elems, e);
-
- ZixSortedArrayIter item = NULL;
- if (zix_sorted_array_find(t, &r, &item) != ZIX_STATUS_SUCCESS) {
- fprintf(stderr, "Failed to find item to remove\n");
- return test_fail();
- }
-
- if (zix_sorted_array_remove(t, item)) {
- fprintf(stderr, "Error removing item\n");
- }
- }
-
- if (zix_sorted_array_size(t) != 0) {
- fprintf(stderr, "Array is not empty after removing all items\n");
- return test_fail();
- }
-
- zix_sorted_array_free(t);
-
- return EXIT_SUCCESS;
-}
-
-int
-main(int argc, char** argv)
-{
- const unsigned n_tests = 3;
- unsigned n_elems = 0;
-
- if (argc == 1) {
- n_elems = 4096;
- } else {
- n_elems = (unsigned)strtoul(argv[1], NULL, 10);
- if (argc > 2) {
- seed = (unsigned)strtoul(argv[2], NULL, 10);
- } else {
- seed = (unsigned)time(NULL);
- }
- }
-
- if (n_elems == 0) {
- fprintf(stderr, "USAGE: %s [N_ELEMS]\n", argv[0]);
- return 1;
- }
-
- printf(
- "Running %u tests with %u elements (seed %u)\n", n_tests, n_elems, seed);
-
- for (unsigned i = 0; i < n_tests; ++i) {
- printf(".");
- fflush(stdout);
- if (stress(i, n_elems)) {
- fprintf(stderr, "FAIL: Random seed %u\n", seed);
- return test_fail();
- }
- }
- printf("\n");
- return EXIT_SUCCESS;
-}