#include "renderive/renderable/Inheritance.hpp" #include #include #include namespace { namespace chain = renderive::renderable_inheritance; enum class Visit { parent, child }; struct Event {}; struct Impl_Base : renderive::inheritance::Type_Root { explicit Impl_Base(std::vector& visits) : visits(&visits) {} std::vector* visits; }; struct Parent_Impl : chain::Impl_Root { using Impl_Root::Impl_Root; void handle_observation(const Event&) { visits->push_back(Visit::parent); } }; struct Child_Impl : chain::Impl_Node { using Impl_Node::Impl_Node; void handle_observation(const Event&) { visits->push_back(Visit::child); } }; struct Parent_State : chain::State_Root {}; struct Child_State : chain::State_Node {}; struct Parent_Builder : chain::Builder_Root {}; struct Child_Builder : chain::Builder_Node {}; struct Parent_Observer : chain::Observer_Root {}; struct Child_Observer : chain::Observer_Node {}; TEST(renderable_inheritance_test, dispatches_parent_before_child) { std::vector visits; Child_Impl impl(visits); impl.dispatch(Event{}); EXPECT_EQ(visits, (std::vector{Visit::parent, Visit::child})); } TEST(renderable_inheritance_test, every_chain_registers_its_own_layer) { static_assert(renderive::inheritance::Chain_Registration_Count_V< typename Child_State::Inheritance_Registry, chain::State_Chain> == 2); static_assert(renderive::inheritance::Chain_Registration_Count_V< typename Child_Builder::Inheritance_Registry, chain::Builder_Chain> == 2); static_assert(renderive::inheritance::Chain_Registration_Count_V< typename Child_Observer::Inheritance_Registry, chain::Observer_Chain> == 2); SUCCEED(); } } // namespace