#include #include #include #include struct test_emitter: entt::emitter { using entt::emitter::emitter; }; struct foo_event { int i; }; struct bar_event {}; struct quux_event {}; TEST(Emitter, Move) { test_emitter emitter; emitter.on([](auto &, const auto &) {}); ASSERT_FALSE(emitter.empty()); ASSERT_TRUE(emitter.contains()); test_emitter other{std::move(emitter)}; ASSERT_FALSE(other.empty()); ASSERT_TRUE(other.contains()); ASSERT_TRUE(emitter.empty()); emitter = std::move(other); ASSERT_FALSE(emitter.empty()); ASSERT_TRUE(emitter.contains()); ASSERT_TRUE(other.empty()); } TEST(Emitter, Swap) { test_emitter emitter; test_emitter other; int value{}; emitter.on([&value](auto &event, const auto &) { value = event.i; }); ASSERT_FALSE(emitter.empty()); ASSERT_TRUE(other.empty()); emitter.swap(other); emitter.publish(foo_event{42}); ASSERT_EQ(value, 0); ASSERT_TRUE(emitter.empty()); ASSERT_FALSE(other.empty()); other.publish(foo_event{42}); ASSERT_EQ(value, 42); } TEST(Emitter, Clear) { test_emitter emitter; ASSERT_TRUE(emitter.empty()); emitter.on([](auto &, const auto &) {}); emitter.on([](const auto &, const auto &) {}); ASSERT_FALSE(emitter.empty()); ASSERT_TRUE(emitter.contains()); ASSERT_TRUE(emitter.contains()); ASSERT_FALSE(emitter.contains()); emitter.erase(); ASSERT_FALSE(emitter.empty()); ASSERT_TRUE(emitter.contains()); ASSERT_TRUE(emitter.contains()); ASSERT_FALSE(emitter.contains()); emitter.erase(); ASSERT_FALSE(emitter.empty()); ASSERT_FALSE(emitter.contains()); ASSERT_TRUE(emitter.contains()); ASSERT_FALSE(emitter.contains()); emitter.on([](auto &, const auto &) {}); emitter.on([](const auto &, const auto &) {}); ASSERT_FALSE(emitter.empty()); ASSERT_TRUE(emitter.contains()); ASSERT_TRUE(emitter.contains()); ASSERT_TRUE(emitter.contains()); emitter.clear(); ASSERT_TRUE(emitter.empty()); ASSERT_FALSE(emitter.contains()); ASSERT_FALSE(emitter.contains()); } TEST(Emitter, ClearFromCallback) { test_emitter emitter; ASSERT_TRUE(emitter.empty()); emitter.on([](auto &, auto &owner) { owner.template on([](auto &, auto &) {}); owner.template erase(); }); emitter.on([](const auto &, auto &owner) { owner.template on([](const auto &, auto &) {}); owner.template erase(); }); ASSERT_FALSE(emitter.empty()); emitter.publish(foo_event{}); emitter.publish(bar_event{}); ASSERT_TRUE(emitter.empty()); } TEST(Emitter, On) { test_emitter emitter; int value{}; emitter.on([&value](auto &event, const auto &) { value = event.i; }); ASSERT_FALSE(emitter.empty()); ASSERT_TRUE(emitter.contains()); ASSERT_EQ(value, 0); emitter.publish(foo_event{42}); ASSERT_EQ(value, 42); } TEST(Emitter, OnAndErase) { test_emitter emitter; std::function func{}; emitter.on(func); ASSERT_FALSE(emitter.empty()); ASSERT_TRUE(emitter.contains()); emitter.erase(); ASSERT_TRUE(emitter.empty()); ASSERT_FALSE(emitter.contains()); } TEST(Emitter, CustomAllocator) { std::allocator allocator; test_emitter emitter{allocator}; ASSERT_EQ(emitter.get_allocator(), allocator); ASSERT_FALSE(emitter.get_allocator() != allocator); emitter.on([](auto &, const auto &) {}); decltype(emitter) other{std::move(emitter), allocator}; ASSERT_TRUE(emitter.empty()); ASSERT_FALSE(other.empty()); }