#include "render_2D/scene/Scene_Context.hpp" #include #include #include #include #include "renderive/inheritance/Registry.hpp" #include "renderive/scene/Inheritance.hpp" namespace { struct Lifecycle_Event { std::vector& handled_by; }; struct Scene_Impl : renderive::scene_inheritance::Impl_Root { struct Observer : renderive::scene_inheritance::Observer_Root { static void handle(Scene_Impl&, const Lifecycle_Event& event) { event.handled_by.emplace_back("scene"); } }; }; struct Scene2D_Impl : renderive::scene_inheritance::Impl_Node { struct Observer : renderive::scene_inheritance::Observer_Node< Scene2D_Impl, Scene_Impl::Observer> { static void handle(Scene2D_Impl&, const Lifecycle_Event& event) { event.handled_by.emplace_back("scene_2d"); } }; }; struct Plot_Scene_Impl : renderive::scene_inheritance::Impl_Node { struct Observer : renderive::scene_inheritance::Observer_Node< Plot_Scene_Impl, Scene2D_Impl::Observer> { static void handle(Plot_Scene_Impl&, const Lifecycle_Event& event) { event.handled_by.emplace_back("plot_scene"); } }; }; struct Scene_Editor : renderive::scene_inheritance::Editor_Root {}; struct Scene2D_Editor : renderive::scene_inheritance::Editor_Node {}; struct Plot_Scene_Editor : renderive::scene_inheritance::Editor_Node {}; struct Scene_Builder : renderive::scene_inheritance::Builder_Root {}; struct Scene2D_Builder : renderive::scene_inheritance::Builder_Node {}; struct Plot_Scene_Builder : renderive::scene_inheritance::Builder_Node {}; struct Scene_State : renderive::scene_inheritance::State_Root {}; struct Scene2D_State : renderive::scene_inheritance::State_Node {}; struct Plot_Scene_State : renderive::scene_inheritance::State_Node {}; TEST(scene_inheritance_test, observer_dispatch_follows_the_scene_chain_parent_before_child) { Plot_Scene_Impl impl; std::vector handled_by; impl.dispatch({handled_by}); EXPECT_EQ(handled_by, (std::vector{"scene", "scene_2d", "plot_scene"})); } TEST(scene_inheritance_test, editor_chain_registers_each_semantic_layer_at_its_own_position) { using Registry = Plot_Scene_Editor::Inheritance_Registry; using Chain = renderive::scene_inheritance::Editor_Chain; static_assert(renderive::inheritance::Chain_Registration_Count_V< Registry, Chain> == 3); static_assert(std::same_as< renderive::inheritance::Type_At_Position_T, Scene_Editor>); static_assert(std::same_as< renderive::inheritance::Type_At_Position_T, Plot_Scene_Editor>); SUCCEED(); } TEST(scene_inheritance_test, builder_and_state_chains_extend_without_sharing_registrations) { using Builder_Registry = Plot_Scene_Builder::Inheritance_Registry; using State_Registry = Plot_Scene_State::Inheritance_Registry; using Builder_Chain = renderive::scene_inheritance::Builder_Chain; using State_Chain = renderive::scene_inheritance::State_Chain; static_assert(renderive::inheritance::Chain_Registration_Count_V< Builder_Registry, Builder_Chain> == 3); static_assert(renderive::inheritance::Chain_Registration_Count_V< Builder_Registry, State_Chain> == 0); static_assert(renderive::inheritance::Chain_Registration_Count_V< State_Registry, State_Chain> == 3); static_assert(renderive::inheritance::Chain_Registration_Count_V< State_Registry, Builder_Chain> == 0); static_assert(std::same_as< renderive::inheritance::Type_At_Position_T< Builder_Registry, Builder_Chain, 2>, Plot_Scene_Builder>); static_assert(std::same_as< renderive::inheritance::Type_At_Position_T< State_Registry, State_Chain, 2>, Plot_Scene_State>); SUCCEED(); } } // namespace