Files
radiantwave/tests/test_page_manager.cpp
T
2026-08-07 14:51:41 -05:00

157 lines
4.7 KiB
C++

#include "test_harness.h"
#include "test_page.h"
#include "../src/page_manager.h"
// Minimal AppState for test compilation
struct AppState {
SDL_Window* window = nullptr;
SDL_Renderer* renderer = nullptr;
PageManager pages;
};
TEST(push_single_page)
{
clear_log();
AppState state;
state.pages.push(state, std::make_unique<TestPage>(1));
ASSERT_EQ(state.pages.depth(), std::size_t(1));
ASSERT_EQ(static_cast<TestPage*>(state.pages.current())->id(), 1);
ASSERT_EQ(lifecycle_log().size(), std::size_t(1));
ASSERT_EQ(lifecycle_log()[0], (LifecycleEvent{"onPush", 1}));
}
TEST(push_two_pages)
{
clear_log();
AppState state;
state.pages.push(state, std::make_unique<TestPage>(1));
clear_log();
state.pages.push(state, std::make_unique<TestPage>(2));
ASSERT_EQ(state.pages.depth(), std::size_t(2));
ASSERT_EQ(static_cast<TestPage*>(state.pages.current())->id(), 2);
ASSERT_EQ(lifecycle_log().size(), std::size_t(2));
ASSERT_EQ(lifecycle_log()[0], (LifecycleEvent{"onPause", 1}));
ASSERT_EQ(lifecycle_log()[1], (LifecycleEvent{"onPush", 2}));
}
TEST(pop_single_page)
{
clear_log();
AppState state;
state.pages.push(state, std::make_unique<TestPage>(1));
clear_log();
state.pages.pop(state);
ASSERT_EQ(state.pages.depth(), std::size_t(0));
ASSERT_TRUE(state.pages.current() == nullptr);
ASSERT_EQ(lifecycle_log().size(), std::size_t(1));
ASSERT_EQ(lifecycle_log()[0], (LifecycleEvent{"onPop", 1}));
}
TEST(pop_resumes_previous)
{
clear_log();
AppState state;
state.pages.push(state, std::make_unique<TestPage>(1));
state.pages.push(state, std::make_unique<TestPage>(2));
clear_log();
state.pages.pop(state);
ASSERT_EQ(state.pages.depth(), std::size_t(1));
ASSERT_EQ(static_cast<TestPage*>(state.pages.current())->id(), 1);
ASSERT_EQ(lifecycle_log().size(), std::size_t(2));
ASSERT_EQ(lifecycle_log()[0], (LifecycleEvent{"onPop", 2}));
ASSERT_EQ(lifecycle_log()[1], (LifecycleEvent{"onResume", 1}));
}
TEST(replace_on_empty)
{
clear_log();
AppState state;
state.pages.replace(state, std::make_unique<TestPage>(1));
ASSERT_EQ(state.pages.depth(), std::size_t(1));
ASSERT_EQ(static_cast<TestPage*>(state.pages.current())->id(), 1);
ASSERT_EQ(lifecycle_log().size(), std::size_t(1));
ASSERT_EQ(lifecycle_log()[0], (LifecycleEvent{"onPush", 1}));
}
TEST(replace_on_existing)
{
clear_log();
AppState state;
state.pages.push(state, std::make_unique<TestPage>(1));
clear_log();
state.pages.replace(state, std::make_unique<TestPage>(2));
ASSERT_EQ(state.pages.depth(), std::size_t(1));
ASSERT_EQ(static_cast<TestPage*>(state.pages.current())->id(), 2);
ASSERT_EQ(lifecycle_log().size(), std::size_t(2));
ASSERT_EQ(lifecycle_log()[0], (LifecycleEvent{"onPop", 1}));
ASSERT_EQ(lifecycle_log()[1], (LifecycleEvent{"onPush", 2}));
}
TEST(pop_empty_stack)
{
clear_log();
AppState state;
state.pages.pop(state);
ASSERT_EQ(state.pages.depth(), std::size_t(0));
ASSERT_TRUE(state.pages.current() == nullptr);
ASSERT_EQ(lifecycle_log().size(), std::size_t(0));
}
TEST(depth_tracks_correctly)
{
AppState state;
ASSERT_EQ(state.pages.depth(), std::size_t(0));
state.pages.push(state, std::make_unique<TestPage>(1));
ASSERT_EQ(state.pages.depth(), std::size_t(1));
state.pages.push(state, std::make_unique<TestPage>(2));
ASSERT_EQ(state.pages.depth(), std::size_t(2));
state.pages.pop(state);
ASSERT_EQ(state.pages.depth(), std::size_t(1));
state.pages.pop(state);
ASSERT_EQ(state.pages.depth(), std::size_t(0));
}
TEST(push_pop_push_sequence)
{
clear_log();
AppState state;
state.pages.push(state, std::make_unique<TestPage>(1));
state.pages.push(state, std::make_unique<TestPage>(2));
state.pages.pop(state);
state.pages.push(state, std::make_unique<TestPage>(3));
ASSERT_EQ(state.pages.depth(), std::size_t(2));
ASSERT_EQ(static_cast<TestPage*>(state.pages.current())->id(), 3);
// 1: push(1), 2: push(2) [pause(1), push(2)],
// 3: pop() [pop(2), resume(1)], 4: push(3) [pause(1), push(3)]
ASSERT_EQ(lifecycle_log().size(), std::size_t(7));
ASSERT_EQ(lifecycle_log()[0], (LifecycleEvent{"onPush", 1}));
ASSERT_EQ(lifecycle_log()[1], (LifecycleEvent{"onPause", 1}));
ASSERT_EQ(lifecycle_log()[2], (LifecycleEvent{"onPush", 2}));
ASSERT_EQ(lifecycle_log()[3], (LifecycleEvent{"onPop", 2}));
ASSERT_EQ(lifecycle_log()[4], (LifecycleEvent{"onResume", 1}));
ASSERT_EQ(lifecycle_log()[5], (LifecycleEvent{"onPause", 1}));
ASSERT_EQ(lifecycle_log()[6], (LifecycleEvent{"onPush", 3}));
}
RUN_ALL_TESTS()