#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(1)); ASSERT_EQ(state.pages.depth(), std::size_t(1)); ASSERT_EQ(static_cast(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(1)); clear_log(); state.pages.push(state, std::make_unique(2)); ASSERT_EQ(state.pages.depth(), std::size_t(2)); ASSERT_EQ(static_cast(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(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(1)); state.pages.push(state, std::make_unique(2)); clear_log(); state.pages.pop(state); ASSERT_EQ(state.pages.depth(), std::size_t(1)); ASSERT_EQ(static_cast(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(1)); ASSERT_EQ(state.pages.depth(), std::size_t(1)); ASSERT_EQ(static_cast(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(1)); clear_log(); state.pages.replace(state, std::make_unique(2)); ASSERT_EQ(state.pages.depth(), std::size_t(1)); ASSERT_EQ(static_cast(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(1)); ASSERT_EQ(state.pages.depth(), std::size_t(1)); state.pages.push(state, std::make_unique(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(1)); state.pages.push(state, std::make_unique(2)); state.pages.pop(state); state.pages.push(state, std::make_unique(3)); ASSERT_EQ(state.pages.depth(), std::size_t(2)); ASSERT_EQ(static_cast(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()