#include <gtest/gtest.h>

#include "engine/arena.h"

TEST(Arena, SmallAllocs)
{
    Engine::Arena arena;
    auto mem1 = arena.Allocate(1, 1);
    auto mem2 = arena.Allocate(1, 1);
    auto mem3 = arena.Allocate(1, 1);
    ASSERT_NE(mem1, mem2);
    ASSERT_NE(mem1, mem3);
    ASSERT_NE(mem3, mem2);
}

TEST(Arena, ImplAware1)
{
    Engine::Arena arena;
    auto mem1 = reinterpret_cast<uintptr_t>(arena.Allocate(1, 1));
    auto mem2 = reinterpret_cast<uintptr_t>(arena.Allocate(1, 1));
    auto mem3 = reinterpret_cast<uintptr_t>(arena.Allocate(1, 1));
    ASSERT_EQ(mem1 + alignof(std::max_align_t), mem2);
    ASSERT_EQ(mem2 + alignof(std::max_align_t), mem3);
}

TEST(Arena, ImplAware2)
{
    Engine::Arena arena;
    auto mem1   = reinterpret_cast<uintptr_t>(arena.Allocate(1, 1));
    auto mem2   = reinterpret_cast<uintptr_t>(arena.Allocate(1, 1));
    auto bigMem = reinterpret_cast<char*>(arena.Allocate(1024, 1));
    auto mem3   = reinterpret_cast<uintptr_t>(arena.Allocate(1, 1));
    ASSERT_EQ(mem1 + alignof(std::max_align_t), mem2);
    ASSERT_EQ(mem2 + alignof(std::max_align_t), mem3);
    bigMem[1023] = 0;
}