157 lines
4.7 KiB
C++
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()
|