#include "test.h" #include "eventpp/utilities/scopedremover.h" #include "eventpp/eventdispatcher.h" #include "eventpp/hetereventdispatcher.h" TEST_CASE("ScopedRemover, EventDispatcher") { using ED = eventpp::EventDispatcher; ED dispatcher; using Remover = eventpp::ScopedRemover; constexpr int event = 3; std::vector dataList(4); dispatcher.appendListener(event, [&dataList]() { ++dataList[0]; }); { Remover r1(dispatcher); r1.prependListener(event, [&dataList]() { ++dataList[1]; }); { Remover r2(dispatcher); auto handle = r2.appendListener(event, [&dataList]() { ++dataList[2]; }); { Remover r3(dispatcher); r3.insertListener(event, [&dataList]() { ++dataList[3]; }, handle); REQUIRE(dataList == std::vector { 0, 0, 0, 0 }); dispatcher.dispatch(event); REQUIRE(dataList == std::vector { 1, 1, 1, 1 }); } dispatcher.dispatch(event); REQUIRE(dataList == std::vector { 2, 2, 2, 1 }); } dispatcher.dispatch(event); REQUIRE(dataList == std::vector { 3, 3, 2, 1 }); } dispatcher.dispatch(event); REQUIRE(dataList == std::vector { 4, 3, 2, 1 }); { ED dispatcher2; int counter = 0; Remover r(dispatcher2); auto handle = r.appendListener(event, [&counter] { ++counter; }); dispatcher2.dispatch(event); REQUIRE(counter == 1); REQUIRE(dispatcher2.hasAnyListener(event) == true); r.removeListener(event, handle); REQUIRE(dispatcher2.hasAnyListener(event) == false); dispatcher2.dispatch(event); REQUIRE(counter == 1); } } TEST_CASE("ScopedRemover, CallbackList") { using CL = eventpp::CallbackList; CL callbackList; using Remover = eventpp::ScopedRemover; std::vector dataList(4); callbackList.append([&dataList]() { ++dataList[0]; }); { Remover r1(callbackList); r1.prepend([&dataList]() { ++dataList[1]; }); { Remover r2(callbackList); auto handle = r2.append([&dataList]() { ++dataList[2]; }); { Remover r3(callbackList); r3.insert([&dataList]() { ++dataList[3]; }, handle); REQUIRE(dataList == std::vector { 0, 0, 0, 0 }); callbackList(); REQUIRE(dataList == std::vector { 1, 1, 1, 1 }); } callbackList(); REQUIRE(dataList == std::vector { 2, 2, 2, 1 }); } callbackList(); REQUIRE(dataList == std::vector { 3, 3, 2, 1 }); } callbackList(); REQUIRE(dataList == std::vector { 4, 3, 2, 1 }); { CL callback_list2; Remover r(callback_list2); int counter = 0; auto handle = r.append([&counter]{++counter;}); callback_list2(); REQUIRE(callbackList.empty() == false); REQUIRE(counter == 1); r.remove(handle); callback_list2(); REQUIRE(callback_list2.empty() == true); REQUIRE(counter == 1); } } TEST_CASE("ScopedRemover, HeterEventDispatcher") { using ED = eventpp::HeterEventDispatcher >; ED dispatcher; using Remover = eventpp::ScopedRemover; constexpr int event = 3; std::vector dataList(4); dispatcher.appendListener(event, [&dataList]() { ++dataList[0]; }); { Remover r1(dispatcher); r1.prependListener(event, [&dataList]() { ++dataList[1]; }); { Remover r2(dispatcher); auto handle = r2.appendListener(event, [&dataList]() { ++dataList[2]; }); { Remover r3(dispatcher); r3.insertListener(event, [&dataList]() { ++dataList[3]; }, handle); REQUIRE(dataList == std::vector { 0, 0, 0, 0 }); dispatcher.dispatch(event); REQUIRE(dataList == std::vector { 1, 1, 1, 1 }); } dispatcher.dispatch(event); REQUIRE(dataList == std::vector { 2, 2, 2, 1 }); } dispatcher.dispatch(event); REQUIRE(dataList == std::vector { 3, 3, 2, 1 }); } dispatcher.dispatch(event); REQUIRE(dataList == std::vector { 4, 3, 2, 1 }); } TEST_CASE("ScopedRemover, HeterCallbackList") { using CL = eventpp::HeterCallbackList >; CL callbackList; using Remover = eventpp::ScopedRemover; std::vector dataList(4); callbackList.append([&dataList]() { ++dataList[0]; }); { Remover r1(callbackList); r1.prepend([&dataList]() { ++dataList[1]; }); { Remover r2(callbackList); auto handle = r2.append([&dataList]() { ++dataList[2]; }); { Remover r3(callbackList); r3.insert([&dataList]() { ++dataList[3]; }, handle); REQUIRE(dataList == std::vector { 0, 0, 0, 0 }); callbackList(); REQUIRE(dataList == std::vector { 1, 1, 1, 1 }); } callbackList(); REQUIRE(dataList == std::vector { 2, 2, 2, 1 }); } callbackList(); REQUIRE(dataList == std::vector { 3, 3, 2, 1 }); } callbackList(); REQUIRE(dataList == std::vector { 4, 3, 2, 1 }); }