Browse Source

Extend EventManager class

- implement IEventSubscriber interface
- adjust IEventSubscriber interface
- adjust test for EventManager class
- adjust test for EventHandler class
- adjust test classes for EventManager class
- update event handling UML
Patrick-Christopher Mattulat 3 years ago
parent
commit
5a7140e790

+ 10 - 2
include/ls_std/event/EventManager.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-27
- * Changed:         2020-11-27
+ * Changed:         2020-11-29
  *
  * */
 
@@ -15,14 +15,22 @@
 #include <ls_std/event/EventTypes.hpp>
 #include <memory>
 #include "EventHandler.hpp"
+#include "IEventSubscriber.hpp"
 
 namespace ls_std {
-  class EventManager : public ls_std::Class {
+  class EventManager : public ls_std::Class, public ls_std::IEventSubscriber {
     public:
 
       explicit EventManager();
       ~EventManager() override = default;
 
+      // implementation
+
+      void subscribe(const ls_std::event_id& _id, const std::shared_ptr<IListener>& _listener) override;
+      void unsubscribe(const ls_std::event_id& _id, const std::shared_ptr<IListener>& _listener) override;
+
+      // additional functionality
+
       void addEventHandler(const std::shared_ptr<ls_std::EventHandler>& _eventHandler);
       void fire(ls_std::Event _event);
       void removeEventHandler(const std::shared_ptr<ls_std::EventHandler>& _eventHandler);

+ 5 - 3
include/ls_std/event/IEventSubscriber.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-27
- * Changed:         2020-11-27
+ * Changed:         2020-11-29
  *
  * */
 
@@ -11,6 +11,8 @@
 #define LS_STD_I_EVENT_SUBSCRIBER_HPP
 
 #include "EventTypes.hpp"
+#include <memory>
+#include <ls_std/logic/IListener.hpp>
 
 namespace ls_std {
   class IEventSubscriber {
@@ -19,8 +21,8 @@ namespace ls_std {
       IEventSubscriber() = default;
       ~IEventSubscriber() = default;
 
-      virtual void subscribe(const ls_std::event_id& _id) = 0;
-      virtual void unsubscribe(const ls_std::event_id& _id) = 0;
+      virtual void subscribe(const ls_std::event_id& _id, const std::shared_ptr<IListener>& _listener) = 0;
+      virtual void unsubscribe(const ls_std::event_id& _id, const std::shared_ptr<IListener>& _listener) = 0;
   };
 }
 

+ 15 - 1
source/ls_std/event/EventManager.cpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-27
- * Changed:         2020-11-28
+ * Changed:         2020-11-29
  *
  * */
 
@@ -12,6 +12,20 @@
 ls_std::EventManager::EventManager() : ls_std::Class("EventManager")
 {}
 
+void ls_std::EventManager::subscribe(const ls_std::event_id &_id, const std::shared_ptr<IListener> &_listener)
+{
+  if(this->_hasEventHandler(_id)) {
+    this->eventHandlers.at(_id)->addListener(_listener);
+  }
+}
+
+void ls_std::EventManager::unsubscribe(const ls_std::event_id &_id, const std::shared_ptr<IListener> &_listener)
+{
+  if(this->_hasEventHandler(_id)) {
+    this->eventHandlers.at(_id)->removeListener(_listener);
+  }
+}
+
 void ls_std::EventManager::addEventHandler(const std::shared_ptr<ls_std::EventHandler> &_eventHandler)
 {
   if(!this->_hasEventHandler(_eventHandler->getId())) {

+ 1 - 74
test/cases/event/EventHandlerTest.cpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-27
- * Changed:         2020-11-28
+ * Changed:         2020-11-29
  *
  * */
 
@@ -30,77 +30,4 @@ namespace {
     ls_std::EventHandler eventHandler {"EventId"};
     ASSERT_STREQ("EventId", eventHandler.getId().c_str());
   }
-
-  TEST_F(EventHandlerTest, production_example)
-  {
-    std::string news, expectedNews {};
-    ls_std::event_id seriousNewsEventId = ls_std_test::SeriousNewsEvent {""}.getId();
-    ls_std::event_id gossipNewsEventId = ls_std_test::GossipNewsEvent {""}.getId();
-
-    // create event handler
-
-    std::shared_ptr<ls_std::EventHandler> seriousNewsEventHandler = std::make_shared<ls_std::EventHandler>(seriousNewsEventId);   // event id
-    std::shared_ptr<ls_std::EventHandler> gossipNewsEventHandler = std::make_shared<ls_std::EventHandler>(gossipNewsEventId);     // event id
-
-    // create news agency (listener)
-
-    std::shared_ptr<ls_std_test::DailyNewsAgency> dailyNews = std::make_shared<ls_std_test::DailyNewsAgency>();
-    std::shared_ptr<ls_std_test::GossipNewsAgency> gossipNews = std::make_shared<ls_std_test::GossipNewsAgency>();
-
-    // add handler of those events, every news agency should know
-    // this is how agencies know about events
-
-    dailyNews->addEventHandler(seriousNewsEventHandler);
-
-    gossipNews->addEventHandler(seriousNewsEventHandler);
-    gossipNews->addEventHandler(gossipNewsEventHandler);
-
-    // fire SeriousNewsEvent event with no effect
-
-    seriousNewsEventHandler->tell(ls_std_test::SeriousNewsEvent(news)); // event call
-    ASSERT_TRUE(dailyNews->getNews().empty());
-    ASSERT_TRUE(gossipNews->getNews().empty());
-
-    // now subscribe to SeriousNewsEvent and fire SeriousNewsEvent event
-
-    dailyNews->subscribe(seriousNewsEventId);
-    gossipNews->subscribe(seriousNewsEventId);
-    news = "COVID-19 is still going on!";
-    seriousNewsEventHandler->tell(ls_std_test::SeriousNewsEvent(news)); // event call
-
-    expectedNews = "DailyNewsAgency: " + news;
-    ASSERT_STREQ(expectedNews.c_str(), dailyNews->getNews().c_str());
-    expectedNews = "GossipNewsAgency: " + news;
-    ASSERT_STREQ(expectedNews.c_str(), gossipNews->getNews().c_str());
-
-    dailyNews->clear();
-    gossipNews->clear();
-
-    // unsubscribe SeriousNewsEvent from GossipNewsAgency
-
-    gossipNews->unsubscribe(seriousNewsEventId);
-    seriousNewsEventHandler->tell(ls_std_test::SeriousNewsEvent(news)); // event call
-
-    expectedNews = "DailyNewsAgency: " + news;
-    ASSERT_STREQ(expectedNews.c_str(), dailyNews->getNews().c_str());
-    ASSERT_TRUE(gossipNews->getNews().empty());
-
-    dailyNews->clear();
-    gossipNews->clear();
-
-    // now let GossipNewsAgency subscribe to SeriousNewsEvent + GossipNewsEvent and fire both of them
-
-    gossipNews->subscribe(gossipNewsEventId);
-    gossipNews->subscribe(seriousNewsEventId);
-
-    news = "COVID-19 is still going on!";
-    seriousNewsEventHandler->tell(ls_std_test::SeriousNewsEvent(news));
-    expectedNews = "GossipNewsAgency: " + news;
-    ASSERT_STREQ(expectedNews.c_str(), gossipNews->getNews().c_str());
-
-    news = "ape likes banana!";
-    seriousNewsEventHandler->tell(ls_std_test::GossipNewsEvent(news));
-    expectedNews = "GossipNewsAgency: " + news;
-    ASSERT_STREQ(expectedNews.c_str(), gossipNews->getNews().c_str());
-  }
 }

+ 6 - 6
test/cases/event/EventManagerTest.cpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-27
- * Changed:         2020-11-27
+ * Changed:         2020-11-29
  *
  * */
 
@@ -69,8 +69,8 @@ namespace {
 
     // now subscribe to SeriousNewsEvent and fire SeriousNewsEvent event
 
-    dailyNews->subscribe(seriousNewsEventId);
-    gossipNews->subscribe(seriousNewsEventId);
+    eventManager->subscribe(seriousNewsEventId, dailyNews);
+    eventManager->subscribe(seriousNewsEventId, gossipNews);
     news = "COVID-19 is still going on!";
     eventManager->fire(ls_std_test::SeriousNewsEvent(news)); // event call
 
@@ -84,7 +84,7 @@ namespace {
 
     // unsubscribe SeriousNewsEvent from GossipNewsAgency
 
-    gossipNews->unsubscribe(seriousNewsEventId);
+    eventManager->unsubscribe(seriousNewsEventId, gossipNews);
     eventManager->fire(ls_std_test::SeriousNewsEvent(news)); // event call
 
     expectedNews = "DailyNewsAgency: " + news;
@@ -96,8 +96,8 @@ namespace {
 
     // now let GossipNewsAgency subscribe to SeriousNewsEvent + GossipNewsEvent and fire both of them
 
-    gossipNews->subscribe(gossipNewsEventId);
-    gossipNews->subscribe(seriousNewsEventId);
+    eventManager->subscribe(gossipNewsEventId, gossipNews);
+    eventManager->subscribe(seriousNewsEventId, gossipNews);
 
     news = "COVID-19 is still going on!";
     eventManager->fire(ls_std_test::SeriousNewsEvent(news)); // event call

+ 1 - 16
test/classes/event/DailyNewsAgency.cpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-27
- * Changed:         2020-11-28
+ * Changed:         2020-11-29
  *
  * */
 
@@ -31,21 +31,6 @@ void ls_std_test::DailyNewsAgency::listen(const ls_std::Class &_info)
   }
 }
 
-void ls_std_test::DailyNewsAgency::subscribe(const ls_std::event_id &_id)
-{
-  // TODO: check event handler existence
-
-//  std::shared_ptr<ls_std_test::DailyNewsAgency> listener = this->shared_from_this();
-  this->eventHandlers.at(_id)->addListener(this->shared_from_this());
-}
-
-void ls_std_test::DailyNewsAgency::unsubscribe(const ls_std::event_id &_id)
-{
-  // TODO: check event handler existence
-
-  this->eventHandlers.at(_id)->removeListener(this->shared_from_this());
-}
-
 void ls_std_test::DailyNewsAgency::addEventHandler(const std::shared_ptr<ls_std::EventHandler> &_eventHandler)
 {
   // TODO: check event handler existence

+ 2 - 4
test/classes/event/DailyNewsAgency.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-27
- * Changed:         2020-11-27
+ * Changed:         2020-11-29
  *
  * */
 
@@ -17,7 +17,7 @@
 #include "NewsAgency.hpp"
 
 namespace ls_std_test {
-  class DailyNewsAgency : public ls_std_test::NewsAgency, public ls_std::IEventSubscriber, public ls_std::IListener, public std::enable_shared_from_this<ls_std_test::DailyNewsAgency> {
+  class DailyNewsAgency : public ls_std_test::NewsAgency, public ls_std::IListener {
     public:
 
       DailyNewsAgency();
@@ -28,8 +28,6 @@ namespace ls_std_test {
       void clear();
       std::string getNews();
       void listen(const ls_std::Class& _info) override;
-      void subscribe(const ls_std::event_id& _id) override;
-      void unsubscribe(const ls_std::event_id& _id) override;
 
       // additional functionality
 

+ 1 - 15
test/classes/event/GossipNewsAgency.cpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-27
- * Changed:         2020-11-28
+ * Changed:         2020-11-29
  *
  * */
 
@@ -35,20 +35,6 @@ void ls_std_test::GossipNewsAgency::listen(const ls_std::Class &_info)
   }
 }
 
-void ls_std_test::GossipNewsAgency::subscribe(const ls_std::event_id &_id)
-{
-  // TODO: check event handler existence
-
-  this->eventHandlers.at(_id)->addListener(this->shared_from_this());
-}
-
-void ls_std_test::GossipNewsAgency::unsubscribe(const ls_std::event_id &_id)
-{
-  // TODO: check event handler existence
-
-  this->eventHandlers.at(_id)->removeListener(this->shared_from_this());
-}
-
 void ls_std_test::GossipNewsAgency::addEventHandler(const std::shared_ptr<ls_std::EventHandler> &_eventHandler)
 {
   // TODO: check event handler existence

+ 2 - 4
test/classes/event/GossipNewsAgency.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-27
- * Changed:         2020-11-27
+ * Changed:         2020-11-29
  *
  * */
 
@@ -17,7 +17,7 @@
 #include "NewsAgency.hpp"
 
 namespace ls_std_test {
-  class GossipNewsAgency : public ls_std_test::NewsAgency, public ls_std::IEventSubscriber, public ls_std::IListener, public std::enable_shared_from_this<ls_std_test::GossipNewsAgency> {
+  class GossipNewsAgency : public ls_std_test::NewsAgency, public ls_std::IListener {
     public:
 
       GossipNewsAgency();
@@ -28,8 +28,6 @@ namespace ls_std_test {
       void clear();
       std::string getNews();
       void listen(const ls_std::Class& _info) override;
-      void subscribe(const ls_std::event_id& _id) override;
-      void unsubscribe(const ls_std::event_id& _id) override;
 
       // additional functionality
 

BIN
test/resources/event_handling_uml.png