feat: initial commit, basic arena

This commit is contained in:
2026-01-09 00:35:24 +02:00
parent ed1fa16625
commit 1dd4a788a8
8 changed files with 289 additions and 1 deletions

52
test/niarena_test.c Normal file
View File

@@ -0,0 +1,52 @@
#define N_INTS_TEST 4
#define NIARENA_ARENA_SIZE (N_INTS_TEST * sizeof(int))
#define NIARENA_IMPLEMENTATION
#include "../niarena.h"
#include <assert.h>
#include <stdio.h>
#include <string.h>
void
test_arena_new()
{
NIArena *arena = niarena_new();
assert(arena->offset == 0);
assert(arena->capacity == (N_INTS_TEST * sizeof(int)));
niarena_delete(arena);
}
void
test_arena_allocations()
{
NIArena *arena = niarena_new();
int *ns[N_INTS_TEST];
for(int i = 1; i <= N_INTS_TEST + 1; i++) {
int *p = (int *)niarena_alloc(arena, sizeof(int));
if(i == N_INTS_TEST + 1) {
// Invalid allocation does not invalidate the rest
assert(p == NULL);
const char *err = niarena_get_error();
assert(strcmp(err, "niarena_alloc: out of memory inside of the arena") == 0);
} else {
assert(arena->offset == i * sizeof(int));
*p = 1234 + i;
ns[i - 1] = p;
}
}
for(int i = 1; i <= N_INTS_TEST; i++) {
assert(*ns[i - 1] == 1234 + i);
}
niarena_delete(arena);
}
int
main()
{
test_arena_new();
test_arena_allocations();
printf("== TESTS SUCCESSFUL ==\n");
return 0;
}

View File

@@ -0,0 +1,42 @@
#include <stdio.h>
#include <stdlib.h>
void *
bad_malloc(size_t sz)
{
(void)sz;
return NULL;
}
#define NIARENA_MALLOC(sz) bad_malloc(sz)
void
mock_free(void *p)
{
free(p);
}
#define NIARENA_FREE(p) mock_free(p)
#define N_INTS_TEST 4
#define NIARENA_ARENA_SIZE (N_INTS_TEST * sizeof(int))
#define NIARENA_IMPLEMENTATION
#include "../niarena.h"
#include <assert.h>
#include <string.h>
void
niarena_test_malloc_fail_arena()
{
NIArena *arena = niarena_new();
assert(arena == NULL);
const char *err = niarena_get_error();
assert(strcmp(err, "niarena_new: out of memory allocating arena") == 0);
}
int
main()
{
niarena_test_malloc_fail_arena();
printf("== TESTS SUCCESSFUL ==\n");
return 0;
}

View File

@@ -0,0 +1,46 @@
#include <stdio.h>
#include <stdlib.h>
int call_count = 0;
void *
bad_malloc(size_t sz)
{
call_count++;
if(call_count != 2) {
return malloc(sz);
}
return NULL;
}
#define NIARENA_MALLOC(sz) bad_malloc(sz)
void
mock_free(void *p)
{
free(p);
}
#define NIARENA_FREE(p) mock_free(p)
#define N_INTS_TEST 4
#define NIARENA_ARENA_SIZE (N_INTS_TEST * sizeof(int))
#define NIARENA_IMPLEMENTATION
#include "../niarena.h"
#include <assert.h>
#include <string.h>
void
niarena_test_malloc_fail_buffer()
{
NIArena *arena = niarena_new();
assert(arena == NULL);
const char *err = niarena_get_error();
assert(strcmp(err, "niarena_new: out of memory allocating buffer") == 0);
}
int
main()
{
niarena_test_malloc_fail_buffer();
printf("== TESTS SUCCESSFUL ==\n");
return 0;
}