#include #include #include #include TEST(Observer, Functionalities) { entt::registry registry; entt::observer observer{registry, entt::collector.group()}; ASSERT_EQ(observer.size(), 0u); ASSERT_TRUE(observer.empty()); ASSERT_EQ(observer.begin(), observer.end()); const auto entity = registry.create(); registry.emplace(entity); ASSERT_EQ(observer.size(), 1u); ASSERT_FALSE(observer.empty()); ASSERT_EQ(*observer.data(), entity); ASSERT_NE(observer.begin(), observer.end()); ASSERT_EQ(++observer.begin(), observer.end()); ASSERT_EQ(*observer.begin(), entity); observer.clear(); ASSERT_EQ(observer.size(), 0u); ASSERT_TRUE(observer.empty()); observer.disconnect(); registry.erase(entity); registry.emplace(entity); ASSERT_EQ(observer.size(), 0u); ASSERT_TRUE(observer.empty()); } TEST(Observer, AllOf) { constexpr auto collector = entt::collector .group(entt::exclude) .group(); entt::registry registry; entt::observer observer{registry, collector}; const auto entity = registry.create(); ASSERT_TRUE(observer.empty()); registry.emplace(entity); registry.emplace(entity); ASSERT_EQ(observer.size(), 1u); ASSERT_FALSE(observer.empty()); ASSERT_EQ(*observer.data(), entity); registry.emplace(entity); ASSERT_FALSE(observer.empty()); registry.erase(entity); ASSERT_TRUE(observer.empty()); registry.emplace(entity); registry.emplace(entity); ASSERT_FALSE(observer.empty()); registry.erase(entity); ASSERT_TRUE(observer.empty()); registry.emplace(entity); observer.clear(); ASSERT_TRUE(observer.empty()); observer.disconnect(); registry.emplace_or_replace(entity); registry.emplace_or_replace(entity); registry.erase(entity); ASSERT_TRUE(observer.empty()); } TEST(Observer, AllOfFiltered) { constexpr auto collector = entt::collector .group() .where(entt::exclude); entt::registry registry; entt::observer observer{registry, collector}; const auto entity = registry.create(); ASSERT_TRUE(observer.empty()); registry.emplace(entity); ASSERT_EQ(observer.size(), 0u); ASSERT_TRUE(observer.empty()); registry.erase(entity); registry.emplace(entity); registry.emplace(entity); registry.emplace(entity); ASSERT_TRUE(observer.empty()); registry.erase(entity); registry.erase(entity); registry.emplace(entity); ASSERT_EQ(observer.size(), 1u); ASSERT_FALSE(observer.empty()); ASSERT_EQ(*observer.data(), entity); registry.emplace(entity); ASSERT_TRUE(observer.empty()); registry.erase(entity); ASSERT_TRUE(observer.empty()); observer.disconnect(); registry.erase(entity); registry.emplace(entity); ASSERT_TRUE(observer.empty()); } TEST(Observer, Observe) { entt::registry registry; entt::observer observer{registry, entt::collector.update().update()}; const auto entity = registry.create(); ASSERT_TRUE(observer.empty()); registry.emplace(entity); registry.emplace(entity); ASSERT_TRUE(observer.empty()); registry.emplace_or_replace(entity); ASSERT_EQ(observer.size(), 1u); ASSERT_FALSE(observer.empty()); ASSERT_EQ(*observer.data(), entity); observer.clear(); registry.replace(entity); ASSERT_FALSE(observer.empty()); observer.clear(); ASSERT_TRUE(observer.empty()); observer.disconnect(); registry.emplace_or_replace(entity); registry.emplace_or_replace(entity); ASSERT_TRUE(observer.empty()); } TEST(Observer, ObserveFiltered) { constexpr auto collector = entt::collector .update() .where(entt::exclude); entt::registry registry; entt::observer observer{registry, collector}; const auto entity = registry.create(); ASSERT_TRUE(observer.empty()); registry.emplace(entity); registry.replace(entity); ASSERT_EQ(observer.size(), 0u); ASSERT_TRUE(observer.empty()); registry.emplace(entity); registry.emplace(entity); registry.replace(entity); ASSERT_TRUE(observer.empty()); registry.erase(entity); registry.replace(entity); ASSERT_EQ(observer.size(), 1u); ASSERT_FALSE(observer.empty()); ASSERT_EQ(*observer.data(), entity); registry.emplace(entity); ASSERT_TRUE(observer.empty()); registry.erase(entity); ASSERT_TRUE(observer.empty()); observer.disconnect(); registry.replace(entity); ASSERT_TRUE(observer.empty()); } TEST(Observer, AllOfObserve) { entt::registry registry; entt::observer observer{}; const auto entity = registry.create(); observer.connect(registry, entt::collector.group().update()); ASSERT_TRUE(observer.empty()); registry.emplace(entity); registry.emplace(entity); registry.replace(entity); registry.erase(entity); ASSERT_EQ(observer.size(), 1u); ASSERT_FALSE(observer.empty()); ASSERT_EQ(*observer.data(), entity); registry.erase(entity); registry.emplace(entity); ASSERT_TRUE(observer.empty()); registry.replace(entity); observer.clear(); ASSERT_TRUE(observer.empty()); observer.disconnect(); registry.emplace_or_replace(entity); registry.emplace_or_replace(entity); ASSERT_TRUE(observer.empty()); } TEST(Observer, CrossRulesCornerCase) { entt::registry registry; entt::observer observer{registry, entt::collector.group().group()}; const auto entity = registry.create(); registry.emplace(entity); observer.clear(); ASSERT_TRUE(observer.empty()); registry.emplace(entity); registry.erase(entity); ASSERT_FALSE(observer.empty()); } TEST(Observer, Each) { entt::registry registry; entt::observer observer{registry, entt::collector.group()}; const auto entity = registry.create(); registry.emplace(entity); ASSERT_FALSE(observer.empty()); ASSERT_EQ(observer.size(), 1u); std::as_const(observer).each([entity](const auto entt) { ASSERT_EQ(entity, entt); }); ASSERT_FALSE(observer.empty()); ASSERT_EQ(observer.size(), 1u); observer.each([entity](const auto entt) { ASSERT_EQ(entity, entt); }); ASSERT_TRUE(observer.empty()); ASSERT_EQ(observer.size(), 0u); } TEST(Observer, MultipleFilters) { constexpr auto collector = entt::collector .update() .where() .update() .where(); entt::registry registry; entt::observer observer{registry, collector}; const auto entity = registry.create(); ASSERT_TRUE(observer.empty()); registry.emplace_or_replace(entity); registry.emplace(entity); ASSERT_TRUE(observer.empty()); registry.emplace_or_replace(entity); ASSERT_EQ(observer.size(), 1u); ASSERT_FALSE(observer.empty()); ASSERT_EQ(*observer.data(), entity); observer.clear(); registry.emplace(entity); ASSERT_TRUE(observer.empty()); registry.emplace_or_replace(entity); registry.emplace(entity); ASSERT_TRUE(observer.empty()); registry.emplace_or_replace(entity); ASSERT_EQ(observer.size(), 1u); ASSERT_FALSE(observer.empty()); ASSERT_EQ(*observer.data(), entity); registry.erase(entity); ASSERT_TRUE(observer.empty()); registry.emplace_or_replace(entity); ASSERT_EQ(observer.size(), 1u); ASSERT_FALSE(observer.empty()); ASSERT_EQ(*observer.data(), entity); observer.clear(); observer.disconnect(); registry.emplace_or_replace(entity); ASSERT_TRUE(observer.empty()); } TEST(Observer, GroupCornerCase) { constexpr auto add_collector = entt::collector.group(entt::exclude); constexpr auto remove_collector = entt::collector.group(); entt::registry registry; entt::observer add_observer{registry, add_collector}; entt::observer remove_observer{registry, remove_collector}; const auto entity = registry.create(); registry.emplace(entity); ASSERT_FALSE(add_observer.empty()); ASSERT_TRUE(remove_observer.empty()); add_observer.clear(); registry.emplace(entity); ASSERT_TRUE(add_observer.empty()); ASSERT_FALSE(remove_observer.empty()); remove_observer.clear(); registry.erase(entity); ASSERT_FALSE(add_observer.empty()); ASSERT_TRUE(remove_observer.empty()); }