Spider2/tests/dynarr.c.old

134 lines
4.2 KiB
C

#include <string.h>
#include "util.h"
#include "unit.h"
#define TEST_LEN 32768
void get_test(void) {
int_dynarr_t arr = DYNARR_INIT(int_dynarr_t);
for (int i = 0; i < 100; i++)
DYNARR_PUSH(arr, 0);
chi_assert("get(5) == arr.data + 5", DYNARR_GET(arr, 5) == arr.data + 5);
}
void extensions_test(void) {
int *cmp = xmalloc(TEST_LEN * sizeof(int));
for (size_t i = 0; i < TEST_LEN; i++)
cmp[i] = rand();
int_dynarr_t extend = DYNARR_INIT(int_dynarr_t);
DYNARR_EXTEND_FIXED(extend, cmp, TEST_LEN);
chi_assert("extend.data != cmp", memcmp(extend.data, cmp, TEST_LEN * sizeof(int)) == 0);
chi_assert("extend.len != TEST_LEN", extend.len == TEST_LEN);
DYNARR_DEINIT(extend);
int_dynarr_t push = DYNARR_INIT(int_dynarr_t);
for (size_t i = 0; i < TEST_LEN; i++)
DYNARR_PUSH(push, cmp[i]);
chi_assert("push.data != cmp", memcmp(push.data, cmp, TEST_LEN * sizeof(int)) == 0);
chi_assert("push.len != TEST_LEN", push.len == TEST_LEN);
DYNARR_DEINIT(push);
int_dynarr_t both = DYNARR_INIT(int_dynarr_t);
DYNARR_EXTEND_FIXED(both, cmp, TEST_LEN / 2);
for (size_t i = TEST_LEN / 2; i < TEST_LEN; i++)
DYNARR_PUSH(both, cmp[i]);
chi_assert("both.data != cmp", memcmp(both.data, cmp, TEST_LEN * sizeof(int)) == 0);
chi_assert("both.len != TEST_LEN", both.len == TEST_LEN);
DYNARR_DEINIT(both);
xfree(cmp);
}
void insert_test(void) {
size_t_dynarr_t increm = DYNARR_INIT(size_t_dynarr_t);
for (size_t i = 0; i < TEST_LEN; i += 2)
DYNARR_PUSH(increm, i);
for (size_t i = 1; i < TEST_LEN; i += 2)
DYNARR_INSERT(increm, i, i);
chi_assert("arr.len == TEST_LEN", increm.len == TEST_LEN);
for (size_t i = 0; i < TEST_LEN; i++)
chi_assert("arr[i] == i", *DYNARR_GET(increm, i) == i);
DYNARR_DEINIT(increm);
int_dynarr_t randins = DYNARR_INIT(int_dynarr_t);
long long parity = 0, check = 0;
for (size_t i = 0; i < TEST_LEN; i++) {
int gen = rand() % 10;
parity += gen;
DYNARR_INSERT(randins, (rand() % (randins.len + 1)), gen);
}
chi_assert("arr.len == TEST_LEN", randins.len == TEST_LEN);
for (size_t i = 0; i < TEST_LEN; i++)
check += *DYNARR_GET(randins, i);
chi_assert("parity == check", parity == check);
DYNARR_DEINIT(randins);
}
void check_arr(int check[], size_t check_len) {
int_dynarr_t dyn = DYNARR_INIT(int_dynarr_t);
DYNARR_EXTEND_FIXED(dyn, check, check_len);
chi_assert("dyn.len == check_len", dyn.len == check_len);
chi_assert("dyn.data == check", memcmp(dyn.data, check, check_len * sizeof(int)) == 0);
for (size_t i = 0; i < dyn.len; i++) {
size_t ind = rand() % check_len;
DYNARR_REMOVE(dyn, ind);
memmove(check + ind, check + ind + 1, (check_len - ind - 1) * sizeof(int));
check_len -= 1;
chi_assert("dyn.len == check_len (modified)", dyn.len == check_len);
chi_assert("dyn.data == check (modified)", memcmp(dyn.data, check, check_len * sizeof(int)) == 0);
}
}
void remove_test(void) {
int_dynarr_t randdel = DYNARR_INIT(int_dynarr_t);
long long parity = 0;
for (size_t i = 0; i < TEST_LEN; i++) {
int gen = rand() % 10;
parity += gen;
DYNARR_PUSH(randdel, gen);
}
long long check = parity;
for (size_t i = 0; i < TEST_LEN; i++) {
size_t ind = rand() % randdel.len;
check -= *DYNARR_GET(randdel, ind);
DYNARR_REMOVE(randdel, ind);
chi_assert("randdel.len == TEST_LEN - i - 1", randdel.len == TEST_LEN - i - 1);
}
chi_assert("check == 0", check == 0);
int *c = xmalloc(TEST_LEN * sizeof(int));
for (int i = 0; i < TEST_LEN; i++)
c[i] = rand();
check_arr(c, TEST_LEN);
xfree(c);
DYNARR_DEINIT(randdel);
}
int main(int argc, char **argv) {
if (argc != 2)
return 1;
if (strcmp(argv[1], "push") == 0) {
push_test();
} else if (strcmp(argv[1], "get") == 0) {
get_test();
} else if (strcmp(argv[1], "extensions") == 0) {
extensions_test();
} else if (strcmp(argv[1], "insert") == 0) {
insert_test();
} else if (strcmp(argv[1], "remove") == 0) {
remove_test();
}
}