Browse Source

Implement reworked Event class

Patrick-Christopher Mattulat 9 months ago
parent
commit
b481badb22

+ 8 - 2
include/ls-std/event/reworked/Event.hpp

@@ -16,14 +16,20 @@
 
 namespace ls::std::event::reworked
 {
-  class Event : public ls::std::core::Class
+  class Event : public ls::std::core::Class // TODO: put EventManager behind abstract or base class rather than using ls::std::core::Class
   {
     public:
 
       explicit Event(const ::std::string &_name);
       ~Event() noexcept override;
 
-      [[nodiscard]] ls::std::event::reworked::Event of(const ::std::shared_ptr<ls::std::core::Class> &_manager);
+      [[nodiscard]] ::std::shared_ptr<ls::std::core::Class> getManager() const;
+      [[nodiscard]] ls::std::event::reworked::Event of(const ::std::shared_ptr<ls::std::core::Class> &_manager) const;
+      void setManager(const ::std::shared_ptr<ls::std::core::Class> &_manager);
+
+    private:
+
+      ::std::shared_ptr<ls::std::core::Class> manager{};
   };
 }
 

+ 19 - 3
source/ls-std/event/reworked/Event.cpp

@@ -7,9 +7,11 @@
 *
 * */
 
+#include "ls-std/core/evaluator/NullPointerArgumentEvaluator.hpp"
 #include <ls-std/event/reworked/Event.hpp>
 
 using ls::std::core::Class;
+using ls::std::core::NullPointerArgumentEvaluator;
 using ls::std::event::reworked::Event;
 using ::std::shared_ptr;
 using ::std::string;
@@ -19,8 +21,22 @@ Event::Event(const string &_name) : Class(_name)
 
 Event::~Event() noexcept = default;
 
-Event Event::of(const shared_ptr<Class> &_manager)
+shared_ptr<Class> Event::getManager() const
 {
-  // implement
-  return Event("tmp");
+  return this->manager;
+}
+
+Event Event::of(const shared_ptr<Class> &_manager) const
+{
+  NullPointerArgumentEvaluator(_manager).evaluate();
+  auto event = Event(this->getClassName());
+  event.setManager(_manager);
+
+  return event;
+}
+
+void Event::setManager(const shared_ptr<Class> &_manager)
+{
+  NullPointerArgumentEvaluator(_manager).evaluate();
+  this->manager = _manager;
 }

+ 60 - 0
test/cases/event/reworked/EventTest.cpp

@@ -8,9 +8,13 @@
 * */
 
 #include <gtest/gtest.h>
+#include <ls-std/ls-std-core.hpp>
 #include <ls-std/ls-std-event.hpp>
 
+using ls::std::core::IllegalArgumentException;
 using ls::std::event::reworked::Event;
+using ls::std::event::reworked::EventManager;
+using ::std::make_shared;
 using testing::Test;
 
 namespace
@@ -27,4 +31,60 @@ namespace
   {
     ASSERT_STREQ("OnClickEvent", Event("OnClickEvent").getClassName().c_str());
   }
+
+  TEST_F(EventTest, getManager)
+  {
+    ASSERT_TRUE(Event("TmpEvent").getManager() == nullptr);
+  }
+
+  TEST_F(EventTest, of)
+  {
+    auto event = Event("TmpEvent").of(make_shared<EventManager>());
+
+    ASSERT_STREQ("TmpEvent", event.getClassName().c_str());
+    ASSERT_TRUE(event.getManager() != nullptr);
+  }
+
+  TEST_F(EventTest, of_with_no_reference)
+  {
+    EXPECT_THROW(
+        {
+          try
+          {
+            auto event = Event("TmpEvent").of(nullptr);
+          }
+          catch (const IllegalArgumentException &_exception)
+          {
+            throw;
+          }
+        },
+        IllegalArgumentException);
+  }
+
+  TEST_F(EventTest, setManager)
+  {
+    auto event = Event("TmpEvent");
+    ASSERT_TRUE(event.getManager() == nullptr);
+
+    event.setManager(make_shared<EventManager>());
+    ASSERT_FALSE(event.getManager() == nullptr);
+  }
+
+  TEST_F(EventTest, setManager_with_no_reference)
+  {
+    auto event = Event("TmpEvent");
+
+    EXPECT_THROW(
+        {
+          try
+          {
+            event.setManager(nullptr);
+          }
+          catch (const IllegalArgumentException &_exception)
+          {
+            throw;
+          }
+        },
+        IllegalArgumentException);
+  }
 }