diff options
| author | Feoramund <161657516+Feoramund@users.noreply.github.com> | 2025-06-15 13:16:19 -0400 |
|---|---|---|
| committer | Feoramund <161657516+Feoramund@users.noreply.github.com> | 2025-06-15 14:29:30 -0400 |
| commit | 0b2cf9a4ca7e84fb7920a8d7b0d58b7d61f24a10 (patch) | |
| tree | fd9af81c7d5c01b980e4ac98e78f2101810a4ad3 | |
| parent | 134c39b58b21cda10cfc8be27bada568a5474763 (diff) | |
Add a tiny sanity test for `core:mem` allocators
| -rw-r--r-- | tests/core/mem/test_core_mem.odin | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/tests/core/mem/test_core_mem.odin b/tests/core/mem/test_core_mem.odin index bd072b4e9..c1cb59c68 100644 --- a/tests/core/mem/test_core_mem.odin +++ b/tests/core/mem/test_core_mem.odin @@ -193,3 +193,111 @@ fail_if_allocations_overlap :: proc(t: ^testing.T, a, b: []byte) { testing.fail_now(t, "Allocations overlapped") } } + + +// This merely does a few simple operations to test basic sanity. +// +// A serious test of an allocator would require hooking it up to a benchmark or +// a large, complicated program in order to get all manner of usage patterns. +basic_sanity_test :: proc(t: ^testing.T, allocator: mem.Allocator, limit: int, loc := #caller_location) -> bool { + context.allocator = allocator + + { + a := make([dynamic]u8) + for i in 0..<limit { + append(&a, u8(i)) + } + testing.expect_value(t, len(a), limit, loc) or_return + for i in 0..<limit { + testing.expect_value(t, a[i], u8(i), loc) or_return + } + delete(a) + } + + { + v := make([]u8, limit) + testing.expect_value(t, len(v), limit, loc) or_return + for i in 0..<limit { + v[i] = u8(i) + testing.expect_value(t, v[i], u8(i), loc) or_return + } + delete(v) + } + + { + for i in 0..<limit { + v := make([]u8, 1) + v[0] = u8(i) + testing.expect_value(t, v[0], u8(i), loc) or_return + delete(v) + } + } + + return true +} + +@test +test_scratch :: proc(t: ^testing.T) { + N :: 4096 + sa: mem.Scratch_Allocator + mem.scratch_init(&sa, N) + defer mem.scratch_destroy(&sa) + basic_sanity_test(t, mem.scratch_allocator(&sa), N / 4) + basic_sanity_test(t, mem.scratch_allocator(&sa), N / 4) +} + +@test +test_stack :: proc(t: ^testing.T) { + N :: 4096 + buf: [N]u8 + + sa: mem.Stack + mem.stack_init(&sa, buf[:]) + basic_sanity_test(t, mem.stack_allocator(&sa), N / 4) + basic_sanity_test(t, mem.stack_allocator(&sa), N / 4) +} + +@test +test_small_stack :: proc(t: ^testing.T) { + N :: 4096 + buf: [N]u8 + + ss: mem.Small_Stack + mem.small_stack_init(&ss, buf[:]) + basic_sanity_test(t, mem.small_stack_allocator(&ss), N / 4) + // The test cannot be run a second time on top of the last for a Small + // Stack because the dynamic array inside will resize and leave a gap, thus + // limiting the amount of space. + basic_sanity_test(t, mem.small_stack_allocator(&ss), N / 8) +} + +@test +test_dynamic_arena :: proc(t: ^testing.T) { + da: mem.Dynamic_Arena + mem.dynamic_arena_init(&da) + defer mem.dynamic_arena_destroy(&da) + basic_sanity_test(t, mem.dynamic_arena_allocator(&da), da.block_size / 4) + basic_sanity_test(t, mem.dynamic_arena_allocator(&da), da.block_size / 4) +} + +@test +test_buddy :: proc(t: ^testing.T) { + N :: 4096 + buf: [N]u8 + + ba: mem.Buddy_Allocator + mem.buddy_allocator_init(&ba, buf[:], align_of(u8)) + basic_sanity_test(t, mem.buddy_allocator(&ba), N / 8) + basic_sanity_test(t, mem.buddy_allocator(&ba), N / 8) +} + +@test +test_rollback :: proc(t: ^testing.T) { + N :: 4096 + buf: [N]u8 + + rb: mem.Rollback_Stack + mem.rollback_stack_init(&rb, buf[:]) + basic_sanity_test(t, mem.rollback_stack_allocator(&rb), N / 8) + basic_sanity_test(t, mem.rollback_stack_allocator(&rb), N / 8) +} |