#include #include #include #include "renderive/scene/dependency/Dependency_Resolver.hpp" namespace { enum class Preparation { acquire_source, transform_vertices, upload_visual }; using Resolver = renderive::scene::dependency::Dependency_Resolver; TEST(dependency_resolver_test, resolves_declared_dependencies_in_deterministic_order) { std::pmr::unsynchronized_pool_resource memory; Resolver resolver(memory); resolver.attach(Preparation::upload_visual); resolver.attach(Preparation::acquire_source); resolver.attach(Preparation::transform_vertices); resolver.add_parent(Preparation::transform_vertices, Preparation::acquire_source); resolver.add_parent(Preparation::upload_visual, Preparation::transform_vertices); const auto resolution = resolver.resolve(); EXPECT_EQ(resolution.order, (std::vector{Preparation::acquire_source, Preparation::transform_vertices, Preparation::upload_visual})); } TEST(dependency_resolver_test, rejected_cycle_preserves_the_previous_authoritative_relationships) { std::pmr::unsynchronized_pool_resource memory; Resolver resolver(memory); resolver.attach(Preparation::acquire_source); resolver.attach(Preparation::transform_vertices); resolver.attach(Preparation::upload_visual); resolver.add_parent(Preparation::transform_vertices, Preparation::acquire_source); resolver.add_parent(Preparation::upload_visual, Preparation::transform_vertices); EXPECT_EQ(resolver.add_parent(Preparation::acquire_source, Preparation::upload_visual).error, renderive::scene::dependency::Mutation_Error::cycle); EXPECT_TRUE(resolver.parents(Preparation::acquire_source).empty()); EXPECT_EQ(resolver.resolve().order, (std::vector{Preparation::acquire_source, Preparation::transform_vertices, Preparation::upload_visual})); } } // namespace