|
|
@@ -5,65 +5,83 @@
|
|
|
|
|
|
struct base_service {
|
|
|
virtual ~base_service() = default;
|
|
|
- virtual void invoke() {}
|
|
|
+ virtual int invoke(int) = 0;
|
|
|
};
|
|
|
|
|
|
-struct null_service: base_service {
|
|
|
- void invoke() override {
|
|
|
- invoked = true;
|
|
|
+struct derived_service: base_service {
|
|
|
+ derived_service(int val)
|
|
|
+ : value{val} {}
|
|
|
+
|
|
|
+ int invoke(int other) override {
|
|
|
+ return value + other;
|
|
|
}
|
|
|
|
|
|
- static inline bool invoked{};
|
|
|
+private:
|
|
|
+ int value;
|
|
|
};
|
|
|
|
|
|
-struct derived_service: base_service {
|
|
|
- void invoke() override {
|
|
|
- invoked = true;
|
|
|
+struct ServiceLocator: ::testing::Test {
|
|
|
+ void SetUp() override {
|
|
|
+ entt::locator<base_service>::reset();
|
|
|
}
|
|
|
-
|
|
|
- static inline bool invoked{};
|
|
|
};
|
|
|
|
|
|
-TEST(ServiceLocator, Functionalities) {
|
|
|
- ASSERT_FALSE(entt::locator<base_service>::has_value());
|
|
|
- ASSERT_FALSE(derived_service::invoked);
|
|
|
- ASSERT_FALSE(null_service::invoked);
|
|
|
+using ServiceLocatorDeathTest = ServiceLocator;
|
|
|
|
|
|
- entt::locator<base_service>::value_or<null_service>().invoke();
|
|
|
+TEST_F(ServiceLocator, ValueAndTheLike) {
|
|
|
+ ASSERT_FALSE(entt::locator<base_service>::has_value());
|
|
|
+ ASSERT_EQ(entt::locator<base_service>::value_or<derived_service>(1).invoke(3), 4);
|
|
|
+ ASSERT_TRUE(entt::locator<base_service>::has_value());
|
|
|
+ ASSERT_EQ(entt::locator<base_service>::value().invoke(9), 10);
|
|
|
+}
|
|
|
|
|
|
+TEST_F(ServiceLocator, Emplace) {
|
|
|
+ ASSERT_FALSE(entt::locator<base_service>::has_value());
|
|
|
+ ASSERT_EQ(entt::locator<base_service>::emplace<derived_service>(5).invoke(1), 6);
|
|
|
ASSERT_TRUE(entt::locator<base_service>::has_value());
|
|
|
- ASSERT_TRUE(null_service::invoked);
|
|
|
+ ASSERT_EQ(entt::locator<base_service>::value().invoke(3), 8);
|
|
|
|
|
|
- auto handle = entt::locator<base_service>::handle();
|
|
|
entt::locator<base_service>::reset();
|
|
|
|
|
|
ASSERT_FALSE(entt::locator<base_service>::has_value());
|
|
|
+ ASSERT_EQ(entt::locator<base_service>::emplace<derived_service>(std::allocator_arg, std::allocator<derived_service>{}, 5).invoke(1), 6);
|
|
|
+ ASSERT_TRUE(entt::locator<base_service>::has_value());
|
|
|
+ ASSERT_EQ(entt::locator<base_service>::value().invoke(3), 8);
|
|
|
+}
|
|
|
|
|
|
- entt::locator<base_service>::reset(handle);
|
|
|
+TEST_F(ServiceLocator, ResetHandle) {
|
|
|
+ entt::locator<base_service>::emplace<derived_service>(1);
|
|
|
+ auto handle = entt::locator<base_service>::handle();
|
|
|
|
|
|
ASSERT_TRUE(entt::locator<base_service>::has_value());
|
|
|
+ ASSERT_EQ(entt::locator<base_service>::value().invoke(3), 4);
|
|
|
|
|
|
- entt::locator<base_service>::reset(decltype(handle){});
|
|
|
+ entt::locator<base_service>::reset();
|
|
|
|
|
|
ASSERT_FALSE(entt::locator<base_service>::has_value());
|
|
|
|
|
|
- entt::locator<base_service>::emplace<derived_service>();
|
|
|
- entt::locator<base_service>::value().invoke();
|
|
|
+ entt::locator<base_service>::reset(handle);
|
|
|
|
|
|
ASSERT_TRUE(entt::locator<base_service>::has_value());
|
|
|
- ASSERT_TRUE(derived_service::invoked);
|
|
|
+ ASSERT_EQ(entt::locator<base_service>::value().invoke(3), 4);
|
|
|
+}
|
|
|
|
|
|
- derived_service::invoked = false;
|
|
|
- entt::locator<base_service>::allocate_emplace<derived_service>(std::allocator<derived_service>{}).invoke();
|
|
|
+TEST_F(ServiceLocator, ElementWithDeleter) {
|
|
|
+ derived_service service{1};
|
|
|
+ entt::locator<base_service>::reset(&service, [](base_service *serv) { *static_cast<derived_service *>(serv) = derived_service{2}; });
|
|
|
|
|
|
ASSERT_TRUE(entt::locator<base_service>::has_value());
|
|
|
- ASSERT_TRUE(derived_service::invoked);
|
|
|
+ ASSERT_EQ(entt::locator<base_service>::value().invoke(1), 2);
|
|
|
+
|
|
|
+ entt::locator<base_service>::reset();
|
|
|
+
|
|
|
+ ASSERT_EQ(service.invoke(1), 3);
|
|
|
}
|
|
|
|
|
|
-ENTT_DEBUG_TEST(ServiceLocatorDeathTest, UninitializedValue) {
|
|
|
- ASSERT_NO_FATAL_FAILURE(entt::locator<base_service>::value_or().invoke());
|
|
|
+ENTT_DEBUG_TEST_F(ServiceLocatorDeathTest, UninitializedValue) {
|
|
|
+ ASSERT_EQ(entt::locator<base_service>::value_or<derived_service>(1).invoke(1), 2);
|
|
|
|
|
|
entt::locator<base_service>::reset();
|
|
|
|
|
|
- ASSERT_DEATH(entt::locator<base_service>::value().invoke(), "");
|
|
|
+ ASSERT_DEATH(entt::locator<base_service>::value().invoke(42), "");
|
|
|
}
|