#include #include #include #include "../common/config.h" struct base_service { virtual ~base_service() = default; virtual void invoke() {} }; struct null_service: base_service { void invoke() override { invoked = true; } static inline bool invoked{}; }; struct derived_service: base_service { void invoke() override { invoked = true; } static inline bool invoked{}; }; struct ServiceLocator: ::testing::Test { void SetUp() override { null_service::invoked = false; derived_service::invoked = false; } }; using ServiceLocatorDeathTest = ServiceLocator; TEST(ServiceLocator, Functionalities) { ASSERT_FALSE(entt::locator::has_value()); ASSERT_FALSE(derived_service::invoked); ASSERT_FALSE(null_service::invoked); entt::locator::value_or().invoke(); ASSERT_TRUE(entt::locator::has_value()); ASSERT_TRUE(null_service::invoked); auto handle = entt::locator::handle(); entt::locator::reset(); ASSERT_FALSE(entt::locator::has_value()); entt::locator::reset(handle); ASSERT_TRUE(entt::locator::has_value()); entt::locator::reset(decltype(handle){}); ASSERT_FALSE(entt::locator::has_value()); entt::locator::emplace(); entt::locator::value().invoke(); ASSERT_TRUE(entt::locator::has_value()); ASSERT_TRUE(derived_service::invoked); derived_service::invoked = false; entt::locator::allocate_emplace(std::allocator{}).invoke(); ASSERT_TRUE(entt::locator::has_value()); ASSERT_TRUE(derived_service::invoked); } ENTT_DEBUG_TEST(ServiceLocatorDeathTest, UninitializedValue) { ASSERT_NO_FATAL_FAILURE(entt::locator::value_or().invoke()); entt::locator::reset(); ASSERT_DEATH(entt::locator::value().invoke(), ""); }