diff --git a/FlippR-Driver/.settings/language.settings.xml b/FlippR-Driver/.settings/language.settings.xml index d3526a4..c7e504e 100644 --- a/FlippR-Driver/.settings/language.settings.xml +++ b/FlippR-Driver/.settings/language.settings.xml @@ -1,15 +1,28 @@ - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FlippR-Driver/src/input/EventNotifier.cpp b/FlippR-Driver/src/input/EventNotifier.cpp index 8fb99cb..485d078 100644 --- a/FlippR-Driver/src/input/EventNotifier.cpp +++ b/FlippR-Driver/src/input/EventNotifier.cpp @@ -26,6 +26,8 @@ EventNotifier::~EventNotifier() { is_running = false; + event_queue.release(); + notify_thread.join(); } diff --git a/FlippR-Driver/src/utilities/BlockingQueue.hpp b/FlippR-Driver/src/utilities/BlockingQueue.hpp index 2ba177f..dec18b9 100644 --- a/FlippR-Driver/src/utilities/BlockingQueue.hpp +++ b/FlippR-Driver/src/utilities/BlockingQueue.hpp @@ -38,6 +38,11 @@ public: this->p_queue.pop(); return rc; } + + void release() + { + this->d_condition.notify_one(); + } }; diff --git a/FlippR-Driver/tests/input/TestEventNotifier.cpp b/FlippR-Driver/tests/input/TestEventNotifier.cpp index 21bc883..fb7f64d 100644 --- a/FlippR-Driver/tests/input/TestEventNotifier.cpp +++ b/FlippR-Driver/tests/input/TestEventNotifier.cpp @@ -9,6 +9,111 @@ #include "../catch.hpp" #include "../fakeit.hpp" #include "../../src/utilities/LoggerFactory.hpp" +#include "../../src/utilities/IEventHandler.h" + // testing purposes #define private public + +#include "../../src/input/EventNotifier.h" + +using namespace Input; +using namespace fakeit; + +SCENARIO("An EventNotifier gets created", "[construction]") +{ + LoggerFactory::CreateInputLogger(); + + WHEN("The EventNotifier gets created") + { + EventNotifier notifier; + THEN("It sets the running variable to true") + { + REQUIRE(notifier.is_running); + } + THEN("It creates a notify thread") + { + //REQUIRE(typeid(notifier.notify_thread).hash_code() == typeid(std::thread).hash_code()); + } + } +} + +SCENARIO("An EventHandler gets [un]registered at the notifier", "[un-register notifier]") +{ + GIVEN("An EventHandler") + { + LoggerFactory::CreateInputLogger(); + + Mock event_handler_mock; + Fake(Method(event_handler_mock, handle)); + Fake(Dtor(event_handler_mock)); + + EventNotifier notifier; + + WHEN("The EventHandler gets registered at the eventNotifier") + { + notifier.register_event_handler(&event_handler_mock.get()); + + THEN("The EventHandler gets saved") + { + REQUIRE(*(notifier.event_handler.find(&event_handler_mock.get())) == &event_handler_mock.get()); + } + } + + WHEN("The EventHandler gets unregistered at the driver") + { + REQUIRE(!notifier.event_handler.empty()); + + notifier.unregister_event_handler(&event_handler_mock.get()); + + THEN("The unregister_event_handler at the event_notifier gets called") + { + REQUIRE(notifier.event_handler.empty()); + } + } + } +} + +SCENARIO("An event should be distributed", "[distribute]") +{ + GIVEN("An event") + { + Event event(0, 0, "test"); + + EventNotifier notifier; + WHEN("The event comes in") + { + notifier.distribute_event(event); + THEN("The event gets queued") + { + REQUIRE(!notifier.event_queue.p_queue.empty()); + } + } + } +} + +SCENARIO("The EventHandler gets notified") +{ + GIVEN("An Event and an EventHandler") + { + Event event(0, 0, "test"); + + Mock event_handler_mock; + Fake(Method(event_handler_mock, handle)); + Fake(Dtor(event_handler_mock)); + + EventNotifier notifier; + + + WHEN("The event gets queued") + { + notifier.event_queue.push(event); + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + THEN("The EventHandler gets called") + { + REQUIRE((bool) Verify(Method(event_handler_mock, handle))); + } + } + } +}