diff --git a/tests/src/array/main.c b/tests/src/array/main.c index 5c9f26c..1586be0 100644 --- a/tests/src/array/main.c +++ b/tests/src/array/main.c @@ -1,8 +1,102 @@ /* This software is licensed by the MIT License, see LICENSE file */ /* Copyright © 2022 Gregory Lirent */ +#include "../../../include/extra/vtype.h" #include "plug.h" +static void array_push_random_value(vtype_array* x) { + switch (random_uint8()%10) { + default: + case 0: array_push(x, random_boolean()); break; + case 1: array_push(x, random_uint8()); break; + case 2: array_push(x, random_uint16()); break; + case 3: array_push(x, random_uint32()); break; + case 4: array_push(x, random_uint64()); break; + case 5: array_push(x, random_int8()); break; + case 6: array_push(x, random_int16()); break; + case 7: array_push(x, random_int32()); break; + case 8: array_push(x, random_int64()); break; + case 9: array_push(x, (void*)((sizeof(void*) == 8) ? random_uint64() : random_uint32())); break; + } +} + +static void array_push_random_float(vtype_array* x) { + switch (random_uint8()%3) { + default: + case 0: array_push(x, random_float()); break; + case 1: array_push(x, random_double()); break; + case 2: array_push(x, random_ldouble()); break; + } +} + +static void array_push_random(vtype_array* x) { + if (x->type < VTYPE_FLOAT) { + array_push_random_value(x); + } else array_push_random_float(x); +} + +static void array_init_random(vtype_array* x) { + switch (random_uint8()%13) { + default: + case 0: array_init(x, VTYPE_BOOLEAN); break; + case 1: array_init(x, VTYPE_UINT8); break; + case 2: array_init(x, VTYPE_UINT16); break; + case 3: array_init(x, VTYPE_UINT32); break; + case 4: array_init(x, VTYPE_UINT64); break; + case 5: array_init(x, VTYPE_INT8); break; + case 6: array_init(x, VTYPE_INT16); break; + case 7: array_init(x, VTYPE_INT32); break; + case 8: array_init(x, VTYPE_INT64); break; + case 9: array_init(x, VTYPE_POINTER); break; + case 10: array_init(x, VTYPE_FLOAT); break; + case 11: array_init(x, VTYPE_DOUBLE); break; + case 12: array_init(x, VTYPE_LDOUBLE); break; + } +} + +static vtype_array array_random() { + unsigned short n = random_int16(); + + vtype_array x; + + array_init_random(&x); + + for (int i = 0; i < 10; ++i) { + array_push_random(&x); + } + + return x; +} + + int main(int argc, char** argv) { test_init(argc, argv); + + vtype_array x = { .mem = 0 }; + + do { + array_free(&x); + x = array_random(); + } while (x.type >= VTYPE_FLOAT); + + printf("Array initialized with type `%s`;\n", libcdsb_vtype_name(x.type)); + printf("Array has %lu elements (%lu bytes);\n", array_size(&x), array_nmemb(&x)); + puts(""); + + for (int i = 0; i < x.size; ++i) { + printf("%s\n", libcdsb_vtype_stringify(array_at(&x, i), x.type)); + } + + for (vtype_uint64 v = 0; v < UINT64_MAX; ++v) { + ssize_t index = array_indexof(&x, v); + if (index >= 0) { + printf("Value %lu was found on the position %ld\n", v, index); + break; + } + } + + + + + array_free(&x); }