sc/array/array_test.c

375 lines
6.2 KiB
C
Raw Normal View History

2020-11-11 01:19:49 +03:00
#include "sc_array.h"
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
void example_str(void)
2020-11-11 01:19:49 +03:00
{
2021-04-26 20:33:38 +03:00
const char *it;
struct sc_array_str arr;
2020-11-11 01:19:49 +03:00
2021-04-26 20:33:38 +03:00
sc_array_init(&arr);
2020-11-11 01:19:49 +03:00
2021-04-26 20:33:38 +03:00
sc_array_add(&arr, "item0");
sc_array_add(&arr, "item1");
sc_array_add(&arr, "item2");
2020-11-11 01:19:49 +03:00
2021-04-26 20:33:38 +03:00
printf("\nDelete first element \n\n");
sc_array_del(&arr, 0);
2020-11-11 01:19:49 +03:00
2021-04-26 20:33:38 +03:00
sc_array_foreach (&arr, it) {
printf("Elem = %s \n", it);
}
2020-11-11 01:19:49 +03:00
2021-04-26 20:33:38 +03:00
sc_array_term(&arr);
}
2021-01-31 02:52:06 +03:00
void example_int(void)
2021-04-26 20:33:38 +03:00
{
struct sc_array_int arr;
2020-11-11 01:19:49 +03:00
2021-04-26 20:33:38 +03:00
sc_array_init(&arr);
sc_array_add(&arr, 0);
sc_array_add(&arr, 1);
sc_array_add(&arr, 2);
for (size_t i = 0; i < sc_array_size(&arr); i++) {
printf("Elem = %d \n", arr.elems[i]);
}
sc_array_term(&arr);
2020-11-11 01:19:49 +03:00
}
static int compare(const void *a, const void *b)
{
const int *x = a;
const int *y = b;
2020-11-11 01:19:49 +03:00
return *x - *y;
2020-11-11 01:19:49 +03:00
}
static void test1(void)
{
2021-04-26 20:33:38 +03:00
int total = 0;
struct sc_array_int arr;
sc_array_init(&arr);
sc_array_term(&arr);
assert(sc_array_size(&arr) == 0);
sc_array_add(&arr, 1);
sc_array_add(&arr, 2);
sc_array_add(&arr, 3);
assert(arr.elems[0] == 1);
assert(arr.elems[1] == 2);
assert(arr.elems[2] == 3);
sc_array_term(&arr);
sc_array_init(&arr);
sc_array_add(&arr, 3);
sc_array_add(&arr, 4);
sc_array_add(&arr, 5);
assert(sc_array_size(&arr) == 3);
sc_array_del(&arr, 0);
assert(arr.elems[0] == 4);
sc_array_del_last(&arr);
assert(arr.elems[0] == 4);
sc_array_add(&arr, 1);
sc_array_add(&arr, 3);
sc_array_add(&arr, 2);
sc_array_add(&arr, 0);
assert(sc_array_last(&arr) == 0);
sc_array_sort(&arr, compare);
for (size_t i = 0; i < sc_array_size(&arr); i++) {
total += arr.elems[i];
}
2020-11-11 01:19:49 +03:00
assert(total == 10);
2020-11-11 01:19:49 +03:00
2021-04-26 20:33:38 +03:00
for (size_t i = 0; i < sc_array_size(&arr); i++) {
assert(arr.elems[i] == (int) i);
}
2020-11-11 01:19:49 +03:00
2021-04-26 20:33:38 +03:00
sc_array_term(&arr);
2020-11-11 01:19:49 +03:00
}
void test2(void)
2021-01-31 02:52:06 +03:00
{
int val;
2021-04-26 20:33:38 +03:00
struct sc_array_int arr;
2021-04-26 20:33:38 +03:00
sc_array_init(&arr);
2021-04-26 20:33:38 +03:00
sc_array_foreach (&arr, val) {
assert(true);
}
2021-04-26 20:33:38 +03:00
sc_array_term(&arr);
2021-04-26 20:33:38 +03:00
sc_array_init(&arr);
2021-04-26 20:33:38 +03:00
sc_array_foreach (&arr, val) {
assert(true);
}
2021-04-26 20:33:38 +03:00
sc_array_term(&arr);
2021-04-26 20:33:38 +03:00
sc_array_init(&arr);
2021-04-26 20:33:38 +03:00
sc_array_add(&arr, 1);
assert(!sc_array_oom(&arr));
2021-04-26 20:33:38 +03:00
sc_array_foreach (&arr, val) {
assert(val == 1);
}
2021-04-26 20:33:38 +03:00
sc_array_del_last(&arr);
sc_array_foreach (&arr, val) {
assert(true);
}
2021-04-26 20:33:38 +03:00
sc_array_add(&arr, 1);
assert(!sc_array_oom(&arr));
sc_array_del_unordered(&arr, 0);
sc_array_foreach (&arr, val) {
assert(true);
}
2021-04-26 20:33:38 +03:00
sc_array_term(&arr);
sc_array_init(&arr);
sc_array_add(&arr, 100);
sc_array_add(&arr, 200);
sc_array_add(&arr, 300);
assert(sc_array_at(&arr, 0) == 100);
sc_array_del_last(&arr);
assert(sc_array_at(&arr, 0) == 100);
sc_array_del(&arr, 0);
assert(sc_array_at(&arr, 0) == 200);
sc_array_term(&arr);
2021-01-31 02:52:06 +03:00
}
void bounds_test(void)
2020-12-27 15:19:23 +03:00
{
2021-04-26 20:33:38 +03:00
int total = 0;
int val;
2021-04-26 20:33:38 +03:00
struct sc_array_int arr;
2020-12-27 15:19:23 +03:00
2021-04-26 20:33:38 +03:00
sc_array_init(&arr);
sc_array_add(&arr, 3);
sc_array_add(&arr, 4);
2020-12-27 15:19:23 +03:00
2021-04-26 20:33:38 +03:00
sc_array_foreach (&arr, val) {
total += val;
}
2020-12-27 15:19:23 +03:00
assert(total == 7);
2020-12-27 15:19:23 +03:00
2021-04-26 20:33:38 +03:00
sc_array_term(&arr);
2020-12-27 15:19:23 +03:00
total = 0;
2020-12-27 15:19:23 +03:00
2021-04-26 20:33:38 +03:00
sc_array_init(&arr);
sc_array_foreach (&arr, val) {
total += val;
}
2020-12-27 15:19:23 +03:00
2021-04-26 20:33:38 +03:00
sc_array_foreach (&arr, val) {
total += val;
}
2020-12-27 15:19:23 +03:00
assert(total == 0);
2020-12-27 15:19:23 +03:00
2021-04-26 20:33:38 +03:00
sc_array_term(&arr);
2021-02-06 21:42:25 +03:00
2021-04-26 20:33:38 +03:00
sc_array_init(&arr);
sc_array_add(&arr, 0);
sc_array_add(&arr, 1);
sc_array_add(&arr, 2);
sc_array_add(&arr, 4);
sc_array_add(&arr, 3);
2021-02-06 21:42:25 +03:00
2021-04-26 20:33:38 +03:00
sc_array_del(&arr, 3);
for (size_t i = 0; i < sc_array_size(&arr); i++) {
assert((int) i == arr.elems[i]);
}
2021-02-06 21:42:25 +03:00
2021-04-26 20:33:38 +03:00
sc_array_add(&arr, 3);
sc_array_add(&arr, 4);
2021-02-06 21:42:25 +03:00
2021-04-26 20:33:38 +03:00
sc_array_del(&arr, 3);
for (size_t i = 0; i < sc_array_size(&arr); i++) {
assert((int) i == arr.elems[i]);
}
2021-02-06 21:42:25 +03:00
2021-04-26 20:33:38 +03:00
sc_array_term(&arr);
2020-12-27 15:19:23 +03:00
}
2020-11-11 01:19:49 +03:00
#ifdef SC_HAVE_WRAP
bool fail_realloc = false;
void *__real_realloc(void *p, size_t size);
void *__wrap_realloc(void *p, size_t n)
{
if (fail_realloc) {
return NULL;
}
2020-11-11 01:19:49 +03:00
return __real_realloc(p, n);
2020-11-11 01:19:49 +03:00
}
void fail_test(void)
2020-11-11 01:19:49 +03:00
{
int tmp;
2021-04-26 20:33:38 +03:00
int total = 0;
struct sc_array_int arr;
sc_array_init(&arr);
2021-04-26 20:33:38 +03:00
sc_array_add(&arr, 0);
assert(!sc_array_oom(&arr));
sc_array_term(&arr);
2021-04-26 20:33:38 +03:00
sc_array_init(&arr);
assert(sc_array_size(&arr) == 0);
sc_array_foreach (&arr, tmp) {
assert(false);
}
2021-04-26 20:33:38 +03:00
size_t count = SC_ARRAY_MAX / sizeof(int);
for (size_t i = 0; i < count + 5; i++) {
2021-04-26 20:33:38 +03:00
sc_array_add(&arr, i);
}
2021-04-26 20:33:38 +03:00
assert(sc_array_oom(&arr));
sc_array_del(&arr, 0);
sc_array_add(&arr, 400);
assert(sc_array_oom(&arr) == false);
sc_array_term(&arr);
2021-04-26 20:33:38 +03:00
sc_array_init(&arr);
assert(sc_array_size(&arr) == 0);
fail_realloc = true;
2021-04-26 20:33:38 +03:00
sc_array_add(&arr, 0);
assert(sc_array_oom(&arr));
fail_realloc = false;
2021-04-26 20:33:38 +03:00
sc_array_add(&arr, 222);
assert(!sc_array_oom(&arr));
sc_array_term(&arr);
fail_realloc = true;
2021-04-26 20:33:38 +03:00
sc_array_init(&arr);
sc_array_add(&arr, 3);
assert(sc_array_oom(&arr));
fail_realloc = false;
2021-04-26 20:33:38 +03:00
sc_array_add(&arr, 3);
assert(sc_array_size(&arr) == 1);
assert(sc_array_oom(&arr) == false);
sc_array_term(&arr);
2021-04-26 20:33:38 +03:00
sc_array_init(&arr);
fail_realloc = true;
2021-04-26 20:33:38 +03:00
sc_array_add(&arr, 222);
assert(sc_array_oom(&arr));
fail_realloc = false;
2021-04-26 20:33:38 +03:00
sc_array_add(&arr, 3);
sc_array_add(&arr, 4);
sc_array_add(&arr, 5);
2021-04-26 20:33:38 +03:00
assert(sc_array_size(&arr) == 3);
2021-04-26 20:33:38 +03:00
sc_array_del(&arr, 0);
assert(arr.elems[0] == 4);
sc_array_del_last(&arr);
assert(arr.elems[0] == 4);
2021-04-26 20:33:38 +03:00
sc_array_add(&arr, 1);
sc_array_add(&arr, 3);
sc_array_add(&arr, 2);
sc_array_add(&arr, 0);
2021-04-26 20:33:38 +03:00
sc_array_sort(&arr, compare);
2021-04-26 20:33:38 +03:00
for (size_t i = 0; i < sc_array_size(&arr); i++) {
total += arr.elems[i];
}
assert(total == 10);
2021-04-26 20:33:38 +03:00
for (size_t i = 0; i < sc_array_size(&arr); i++) {
assert(arr.elems[i] == (int) i);
}
total = 0;
2021-04-26 20:33:38 +03:00
sc_array_foreach (&arr, tmp) {
total += tmp;
}
assert(total == 10);
2021-04-26 20:33:38 +03:00
sc_array_sort(&arr, compare);
sc_array_del_unordered(&arr, 0);
assert(arr.elems[0] == 4);
assert(sc_array_size(&arr) == 4);
size_t cap = arr.cap;
2021-04-26 20:33:38 +03:00
sc_array_clear(&arr);
assert(cap == arr.cap);
2021-04-26 20:33:38 +03:00
assert(sc_array_size(&arr) == 0);
sc_array_add(&arr, 10);
assert(sc_array_size(&arr) == 1);
assert(arr.elems[0] == 10);
sc_array_clear(&arr);
assert(arr.size == 0);
assert(arr.cap == cap);
for (int i = 0; i < 100; i++) {
sc_array_add(&arr, i * 514);
}
for (int i = 0; i < 100; i++) {
assert(sc_array_at(&arr, i) == i * 514);
}
cap = arr.cap;
sc_array_clear(&arr);
assert(arr.size == 0);
assert(arr.cap == cap);
2021-04-26 20:33:38 +03:00
sc_array_term(&arr);
2020-11-11 01:19:49 +03:00
}
2020-12-27 08:07:14 +03:00
2020-11-11 01:19:49 +03:00
#else
void fail_test(void)
{
}
#endif
int main(int argc, char *argv[])
{
(void) argc;
(void) argv;
2021-02-07 22:31:04 +03:00
2021-04-26 20:33:38 +03:00
example_str();
example_int();
test1();
test2();
fail_test();
bounds_test();
2020-12-27 08:34:10 +03:00
return 0;
2020-11-11 01:19:49 +03:00
}