diff --git a/src/uvw/emitter.hpp b/src/uvw/emitter.hpp index c41e8c7f..5b985d03 100644 --- a/src/uvw/emitter.hpp +++ b/src/uvw/emitter.hpp @@ -182,6 +182,20 @@ public: } } + /** + * @brief Checks if there are listeners registered for the specific event. + * @return True if there are no listeners registered for the specific event, + * false otherwise. + */ + template + bool empty() const noexcept { + std::size_t type = E::type(); + + return (!(type < handlers.size()) || + !handlers[type] || + static_cast&>(*handlers[type]).empty()); + } + /** * @brief Checks if there are listeners registered with the event emitter. * @return True if there are no listeners registered with the event emitter, diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index b6648859..d7a521d9 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -23,9 +23,11 @@ set( set(TARGET_MAIN main) set(TARGET_ASYNC async) set(TARGET_CHECK check) +set(TARGET_EMITTER emitter) set(TARGET_IDLE idle) set(TARGET_LOOP loop) set(TARGET_PREPARE prepare) +set(TARGET_SIGNAL signal) set(TARGET_TIMER timer) set(TARGET_WORK work) @@ -53,6 +55,14 @@ target_include_directories(${TARGET_CHECK} PRIVATE ${COMMON_INCLUDE_DIRS}) target_link_libraries(${TARGET_CHECK} PRIVATE ${COMMON_LINK_LIBS}) add_test(NAME ${TARGET_CHECK} COMMAND ${TARGET_CHECK}) +# Test TARGET_EMITTER + +set(TARGET_EMITTER_SOURCES uvw/emitter.cpp) +add_executable(${TARGET_EMITTER} ${TARGET_EMITTER_SOURCES}) +target_include_directories(${TARGET_EMITTER} PRIVATE ${COMMON_INCLUDE_DIRS}) +target_link_libraries(${TARGET_EMITTER} PRIVATE ${COMMON_LINK_LIBS}) +add_test(NAME ${TARGET_EMITTER} COMMAND ${TARGET_EMITTER}) + # Test TARGET_IDLE set(TARGET_IDLE_SOURCES uvw/idle.cpp) @@ -77,6 +87,14 @@ target_include_directories(${TARGET_PREPARE} PRIVATE ${COMMON_INCLUDE_DIRS}) target_link_libraries(${TARGET_PREPARE} PRIVATE ${COMMON_LINK_LIBS}) add_test(NAME ${TARGET_PREPARE} COMMAND ${TARGET_PREPARE}) +# Test TARGET_SIGNAL + +set(TARGET_SIGNAL_SOURCES uvw/signal.cpp) +add_executable(${TARGET_SIGNAL} ${TARGET_SIGNAL_SOURCES}) +target_include_directories(${TARGET_SIGNAL} PRIVATE ${COMMON_INCLUDE_DIRS}) +target_link_libraries(${TARGET_SIGNAL} PRIVATE ${COMMON_LINK_LIBS}) +add_test(NAME ${TARGET_SIGNAL} COMMAND ${TARGET_SIGNAL}) + # Test TARGET_TIMER set(TARGET_TIMER_SOURCES uvw/timer.cpp) diff --git a/test/uvw/emitter.cpp b/test/uvw/emitter.cpp new file mode 100644 index 00000000..a32f2302 --- /dev/null +++ b/test/uvw/emitter.cpp @@ -0,0 +1,108 @@ +#include +#include +#include + + +struct FakeEvent: uvw::Event { }; + +struct TestEmitter: uvw::Emitter { + void emit() { publish(FakeEvent{}); } +}; + + +TEST(Emitter, ClearAndClearAll) { + TestEmitter emitter{}; + + ASSERT_TRUE(emitter.empty()); + + emitter.on([](const auto &, auto &){}); + + ASSERT_FALSE(emitter.empty()); + ASSERT_FALSE(emitter.empty()); + ASSERT_TRUE(emitter.empty()); + + emitter.clear(); + + ASSERT_FALSE(emitter.empty()); + ASSERT_FALSE(emitter.empty()); + ASSERT_TRUE(emitter.empty()); + + emitter.clear(); + + ASSERT_TRUE(emitter.empty()); + ASSERT_TRUE(emitter.empty()); + ASSERT_TRUE(emitter.empty()); + + emitter.on([](const auto &, auto &){}); + emitter.on([](const auto &, auto &){}); + + ASSERT_FALSE(emitter.empty()); + ASSERT_FALSE(emitter.empty()); + ASSERT_FALSE(emitter.empty()); + + emitter.clearAll(); + + ASSERT_TRUE(emitter.empty()); + ASSERT_TRUE(emitter.empty()); + ASSERT_TRUE(emitter.empty()); +} + + +TEST(Emitter, On) { + TestEmitter emitter{}; + + emitter.on([](const auto &, auto &){}); + + ASSERT_FALSE(emitter.empty()); + ASSERT_FALSE(emitter.empty()); + + emitter.emit(); + + ASSERT_FALSE(emitter.empty()); + ASSERT_FALSE(emitter.empty()); +} + + +TEST(Emitter, Once) { + TestEmitter emitter{}; + + emitter.once([](const auto &, auto &){}); + + ASSERT_FALSE(emitter.empty()); + ASSERT_FALSE(emitter.empty()); + + emitter.emit(); + + ASSERT_TRUE(emitter.empty()); + ASSERT_TRUE(emitter.empty()); +} + + +TEST(Emitter, OnceAndErase) { + TestEmitter emitter{}; + + auto conn = emitter.once([](const auto &, auto &){}); + + ASSERT_FALSE(emitter.empty()); + ASSERT_FALSE(emitter.empty()); + + emitter.erase(conn); + + ASSERT_TRUE(emitter.empty()); + ASSERT_TRUE(emitter.empty()); +} + + +TEST(Emitter, OnAndErase) { + TestEmitter emitter{}; + + auto conn = emitter.on([](const auto &, auto &){}); + + ASSERT_FALSE(emitter.empty()); + ASSERT_FALSE(emitter.empty()); + + emitter.erase(conn); + + ASSERT_TRUE(emitter.empty()); + ASSERT_TRUE(emitter.empty()); +} diff --git a/test/uvw/signal.cpp b/test/uvw/signal.cpp new file mode 100644 index 00000000..c57a7e99 --- /dev/null +++ b/test/uvw/signal.cpp @@ -0,0 +1,24 @@ +#include +#include + + +TEST(Signal, Fake) { + auto loop = uvw::Loop::getDefault(); + auto handle = loop->resource(); + + auto l = [](const auto &, auto &) { ASSERT_FALSE(true); }; + handle->on(l); + handle->on(l); + + handle->start(42); + + ASSERT_EQ(42, handle->signal()); + + handle->stop(); + handle->close(); + + ASSERT_FALSE(handle->active()); + ASSERT_TRUE(handle->closing()); + + loop->run(); +}