diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/sorted_array_test.c | 213 |
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; -} |