mirror of
https://github.com/Karaka-Management/cOMS.git
synced 2026-01-11 03:08:41 +00:00
150 lines
3.8 KiB
C++
Executable File
150 lines
3.8 KiB
C++
Executable File
#include "../TestFramework.h"
|
|
#include "../../memory/ChunkMemory.h"
|
|
|
|
static void test_chunk_alloc() {
|
|
ChunkMemory mem = {};
|
|
chunk_alloc(&mem, 10, 10);
|
|
|
|
ASSERT_TRUE(memcmp(mem.memory, mem.memory + 1, 10 * 10) == 0);
|
|
ASSERT_EQUALS(mem.size, 10 * 64 + 8 * 1); // chunks are aligned to 64
|
|
ASSERT_EQUALS(*mem.free, 0);
|
|
|
|
chunk_free(&mem);
|
|
ASSERT_EQUALS(mem.size, 0);
|
|
ASSERT_EQUALS(mem.memory, NULL);
|
|
}
|
|
|
|
static void test_chunk_id_from_memory() {
|
|
ChunkMemory mem = {};
|
|
chunk_alloc(&mem, 10, 10);
|
|
|
|
ASSERT_EQUALS(chunk_id_from_memory(&mem, mem.memory), 0);
|
|
ASSERT_EQUALS(chunk_id_from_memory(&mem, mem.memory + 64), 1);
|
|
ASSERT_EQUALS(chunk_id_from_memory(&mem, mem.memory + 127), 1);
|
|
ASSERT_EQUALS(chunk_id_from_memory(&mem, mem.memory + 128), 2);
|
|
|
|
chunk_free(&mem);
|
|
}
|
|
|
|
static void test_chunk_get_element() {
|
|
ChunkMemory mem = {};
|
|
chunk_alloc(&mem, 10, 10);
|
|
|
|
ASSERT_EQUALS(chunk_get_element(&mem, 2), mem.memory + 128);
|
|
|
|
chunk_free(&mem);
|
|
}
|
|
|
|
static void test_chunk_reserve() {
|
|
ChunkMemory mem = {};
|
|
chunk_alloc(&mem, 10, 10);
|
|
|
|
ASSERT_EQUALS(chunk_reserve(&mem, 1), 0);
|
|
ASSERT_EQUALS(chunk_reserve(&mem, 1), 1);
|
|
ASSERT_TRUE(IS_BIT_SET_64_R2L(*mem.free, 0));
|
|
ASSERT_TRUE(IS_BIT_SET_64_R2L(*mem.free, 1));
|
|
ASSERT_FALSE(IS_BIT_SET_64_R2L(*mem.free, 2));
|
|
|
|
ASSERT_EQUALS(chunk_reserve(&mem, 2), 2);
|
|
ASSERT_TRUE(IS_BIT_SET_64_R2L(*mem.free, 2));
|
|
ASSERT_TRUE(IS_BIT_SET_64_R2L(*mem.free, 3));
|
|
|
|
chunk_free(&mem);
|
|
}
|
|
|
|
static void test_chunk_free_elements() {
|
|
ChunkMemory mem = {};
|
|
chunk_alloc(&mem, 10, 10);
|
|
|
|
ASSERT_EQUALS(chunk_reserve(&mem, 3), 0);
|
|
|
|
chunk_free_elements(&mem, 0, 2);
|
|
ASSERT_FALSE(IS_BIT_SET_64_R2L(*mem.free, 0));
|
|
ASSERT_FALSE(IS_BIT_SET_64_R2L(*mem.free, 1));
|
|
ASSERT_TRUE(IS_BIT_SET_64_R2L(*mem.free, 2));
|
|
|
|
chunk_free_elements(&mem, 2, 1);
|
|
ASSERT_FALSE(IS_BIT_SET_64_R2L(*mem.free, 2));
|
|
|
|
chunk_free_elements(&mem, 0, 10);
|
|
ASSERT_EQUALS(*mem.free, 0);
|
|
|
|
chunk_free(&mem);
|
|
}
|
|
|
|
// To ensure there is no logical error we test memory wrapping specifically
|
|
static void test_chunk_reserve_wrapping() {
|
|
ChunkMemory mem = {};
|
|
chunk_alloc(&mem, 10, 10);
|
|
|
|
mem.last_pos = 7;
|
|
ASSERT_EQUALS(chunk_reserve(&mem, 5), 0);
|
|
ASSERT_EQUALS((byte) BITS_GET_8_R2L(*mem.free, 0, 8), (byte) 0b00011111);
|
|
|
|
chunk_free(&mem);
|
|
}
|
|
|
|
// To ensure there is no logical error we test the last element specifically
|
|
static void test_chunk_reserve_last_element() {
|
|
ChunkMemory mem = {};
|
|
chunk_alloc(&mem, 10, 10);
|
|
|
|
// Get last element when the last_pos is the previous element
|
|
mem.last_pos = 8;
|
|
ASSERT_EQUALS(chunk_reserve(&mem, 1), 9);
|
|
|
|
// Get last element when the last element is not defined and all other elements are in use
|
|
mem.last_pos = -1;
|
|
*mem.free = 511;
|
|
ASSERT_EQUALS(chunk_reserve(&mem, 1), 9);
|
|
|
|
chunk_free(&mem);
|
|
}
|
|
|
|
#if !DEBUG
|
|
static void test_chunk_reserve_full() {
|
|
ChunkMemory mem = {};
|
|
chunk_alloc(&mem, 10, 10);
|
|
mem.free[0] = 0xFFFFFFFFFFFFFFFF;
|
|
|
|
ASSERT_EQUALS(chunk_reserve(&mem, 1), -1);
|
|
}
|
|
|
|
static void test_chunk_reserve_invalid_size() {
|
|
ChunkMemory mem = {};
|
|
chunk_alloc(&mem, 10, 10);
|
|
|
|
ASSERT_EQUALS(chunk_reserve(&mem, 11), -1);
|
|
|
|
chunk_free(&mem);
|
|
}
|
|
#endif
|
|
|
|
#ifdef UBER_TEST
|
|
#ifdef main
|
|
#undef main
|
|
#endif
|
|
#define main MemoryChunkMemoryTest
|
|
#endif
|
|
|
|
int main() {
|
|
TEST_INIT(25);
|
|
|
|
TEST_RUN(test_chunk_alloc);
|
|
TEST_RUN(test_chunk_id_from_memory);
|
|
TEST_RUN(test_chunk_get_element);
|
|
TEST_RUN(test_chunk_reserve);
|
|
TEST_RUN(test_chunk_free_elements);
|
|
TEST_RUN(test_chunk_reserve_wrapping);
|
|
TEST_RUN(test_chunk_reserve_last_element);
|
|
|
|
#if !DEBUG
|
|
TEST_RUN(test_chunk_reserve_full);
|
|
TEST_RUN(test_chunk_reserve_invalid_size);
|
|
#endif
|
|
|
|
TEST_FINALIZE();
|
|
|
|
return 0;
|
|
}
|