From d16a1385efe911b1683e390f672cadee78b842be Mon Sep 17 00:00:00 2001 From: physick Date: Wed, 12 Aug 2026 18:33:52 +0500 Subject: test system --- src/tests/arena_tests.c | 39 +++++++++++++++++++++++++++++++++++++++ src/tests/runner.c | 37 +++++++++++++++++++++++++++++++++++++ src/tests/test.h | 16 ++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 src/tests/arena_tests.c create mode 100644 src/tests/runner.c create mode 100644 src/tests/test.h (limited to 'src/tests') diff --git a/src/tests/arena_tests.c b/src/tests/arena_tests.c new file mode 100644 index 0000000..b1c8aa8 --- /dev/null +++ b/src/tests/arena_tests.c @@ -0,0 +1,39 @@ +#include "test.h" +#include "../utils/arena.h" +#include +#include + +char *ArenaAllocation() { + Arena arena = {0}; + ArenaInit(&arena, 1024); + + // Init + size_t elements = 10; + int *arr = ArenaAlloc(&arena, sizeof(int) * elements); + if (arr == NULL) return "The int array allocation failed"; + for (int i = 0; i < elements; ++i) { + arr[i] = i; + } + char *duped = ArenaStrdup(&arena, "Test string"); + if (arr == NULL) return "The string array allocation failed"; + + // Access + for (int i = 0; i < elements; ++i) { + if (arr[i] != i) return "Arena memory corruption in the int array"; + } + if (strcmp(duped, "Test string") != 0) { + return "Arena memory corruption in the string duping"; + } + + free(arena.mem); + return NULL; +} + +char *ArenaOutOfMemory() { + Arena arena = {0}; + ArenaInit(&arena, sizeof(int) * 2); + int *arr = ArenaAlloc(&arena, sizeof(int) * 3); + free(arena.mem); + if (arr != NULL) return "The int array allocation did not fail"; + return NULL; +} diff --git a/src/tests/runner.c b/src/tests/runner.c new file mode 100644 index 0000000..68c17bf --- /dev/null +++ b/src/tests/runner.c @@ -0,0 +1,37 @@ +#include "test.h" +#include + +const UnitTest TESTS[] = { + (UnitTest) { .Name = "Arena out of mem", .Function = ArenaOutOfMemory }, + (UnitTest) { .Name = "Arena allocation", .Function = ArenaAllocation }, +}; + +void SetGreenColor() { + printf("\x1b[32m"); +} + +void SetRedColor() { + printf("\x1b[31m"); +} + +void ResetColor() { + printf("\x1b[39m"); +} + +int main(void) { + size_t length = sizeof(TESTS) / sizeof(TESTS[0]); + SetGreenColor(); + for (size_t i = 0; i < length; ++i) { + const UnitTest *test = &TESTS[i]; + char *outp = test->Function(); + if (outp == NULL) { + printf("Test '%s' passed\n", test->Name); + } else { + SetRedColor(); + printf("test '%s' failed: %s\n", test->Name, outp); + return 1; + } + } + ResetColor(); + return 0; +} diff --git a/src/tests/test.h b/src/tests/test.h new file mode 100644 index 0000000..d2c4aeb --- /dev/null +++ b/src/tests/test.h @@ -0,0 +1,16 @@ +#ifndef TESTS_H +#define TESTS_H + +typedef struct { + char *Name; + // The test function. If it returns an error message + // the test is concidered as failed + char *(*Function)(); +} UnitTest; + +// ========== TESTS ========== + +char *ArenaAllocation(); +char *ArenaOutOfMemory(); + +#endif // TESTS_H -- cgit v1.3