Kaynağa Gözat

Improve Event class method signatures

- improve Event class method signatures
- cover more error cases in Event class
- improve naming convention in tests for Event class
- increase test coverage for Event class
Patrick-Christopher Mattulat 3 yıl önce
ebeveyn
işleme
94c5e908cf

+ 5 - 4
include/ls_std/event/Event.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-26
- * Changed:         2021-05-01
+ * Changed:         2021-05-24
  *
  * */
 
@@ -31,13 +31,13 @@ namespace ls_std
 
       // additional functionality
 
-      void addParameter(const ls_std::event_parameter &_eventParameter);
+      bool addParameter(const ls_std::event_parameter &_eventParameter);
       void clearParameterList();
       ls_std::event_id getId();
       ls_std::event_parameter_list getParameterList();
-      void removeParameter(const ls_std::event_parameter_id &_id);
+      bool removeParameter(const ls_std::event_parameter_id &_id);
       void setId(const ls_std::event_id &_id);
-      void setSerializable(std::shared_ptr<ls_std::ISerializable> _serializable);
+      void setSerializable(const std::shared_ptr<ls_std::ISerializable> &_serializable);
 
     private:
 
@@ -46,6 +46,7 @@ namespace ls_std
       std::shared_ptr<ls_std::ISerializable> serializable{};
 
       void _assignId(const ls_std::event_id &_id);
+      void _assignSerializable(const std::shared_ptr<ls_std::ISerializable> &_serializable);
       bool _hasParameter(const ls_std::event_id &_id);
   };
 }

+ 23 - 12
source/ls_std/event/Event.cpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-26
- * Changed:         2021-05-01
+ * Changed:         2021-05-24
  *
  * */
 
@@ -35,12 +35,16 @@ void ls_std::Event::unmarshal(const ls_std::byte_field &_data)
   }
 }
 
-void ls_std::Event::addParameter(const ls_std::event_parameter &_eventParameter)
+bool ls_std::Event::addParameter(const ls_std::event_parameter &_eventParameter)
 {
+  bool wasAdded{};
+
   if (!this->_hasParameter(_eventParameter.first))
   {
-    this->parameterList.insert(_eventParameter);
+    wasAdded = this->parameterList.insert(_eventParameter).second;
   }
+
+  return wasAdded;
 }
 
 void ls_std::Event::clearParameterList()
@@ -58,12 +62,9 @@ ls_std::event_parameter_list ls_std::Event::getParameterList()
   return this->parameterList;
 }
 
-void ls_std::Event::removeParameter(const ls_std::event_parameter_id &_id)
+bool ls_std::Event::removeParameter(const ls_std::event_parameter_id &_id)
 {
-  if (this->_hasParameter(_id))
-  {
-    this->parameterList.erase(_id);
-  }
+  return this->parameterList.erase(_id) == 1;
 }
 
 void ls_std::Event::setId(const ls_std::event_id &_id)
@@ -71,6 +72,11 @@ void ls_std::Event::setId(const ls_std::event_id &_id)
   this->_assignId(_id);
 }
 
+void ls_std::Event::setSerializable(const std::shared_ptr<ls_std::ISerializable> &_serializable)
+{
+  this->_assignSerializable(_serializable);
+}
+
 void ls_std::Event::_assignId(const ls_std::event_id &_id)
 {
   if (_id.empty())
@@ -81,12 +87,17 @@ void ls_std::Event::_assignId(const ls_std::event_id &_id)
   this->id = _id;
 }
 
-bool ls_std::Event::_hasParameter(const ls_std::event_id &_id)
+void ls_std::Event::_assignSerializable(const std::shared_ptr<ls_std::ISerializable> &_serializable)
 {
-  return this->parameterList.find(_id) != this->parameterList.end();
+  if (_serializable == nullptr)
+  {
+    throw ls_std::IllegalArgumentException{};
+  }
+
+  this->serializable = _serializable;
 }
 
-void ls_std::Event::setSerializable(std::shared_ptr<ls_std::ISerializable> _serializable)
+bool ls_std::Event::_hasParameter(const ls_std::event_id &_id)
 {
-  this->serializable = std::move(_serializable);
+  return this->parameterList.find(_id) != this->parameterList.end();
 }

+ 80 - 23
test/cases/event/EventTest.cpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2020-11-26
- * Changed:         2021-05-02
+ * Changed:         2021-05-24
  *
  * */
 
@@ -24,18 +24,25 @@ namespace
 
       void TearDown() override
       {}
+
+      static ls_std::Event createSerializableTestEvent()
+      {
+        ls_std::Event event{"OPEN_DOOR_EVENT"};
+        event.addParameter(ls_std::event_parameter{"key_available", "true"});
+        event.addParameter(ls_std::event_parameter{"door_id", "16675"});
+
+        std::shared_ptr<ls_std::SerializableJsonEvent> serializable = std::make_shared<ls_std::SerializableJsonEvent>(std::make_shared<ls_std::Event>(event));
+        event.setSerializable(serializable);
+
+        return event;
+      }
   };
 
   // implementation
 
   TEST_F(EventTest, marshal)
   {
-    ls_std::Event event{"OPEN_DOOR_EVENT"};
-    event.addParameter(ls_std::event_parameter{"key_available", "true"});
-    event.addParameter(ls_std::event_parameter{"door_id", "16675"});
-
-    std::shared_ptr<ls_std::SerializableJsonEvent> serializable = std::make_shared<ls_std::SerializableJsonEvent>(std::make_shared<ls_std::Event>(event));
-    event.setSerializable(serializable);
+    ls_std::Event event = createSerializableTestEvent();
 
     ls_std::byte_field data = event.marshal();
     ASSERT_FALSE(data.empty());
@@ -64,23 +71,40 @@ namespace
 
   TEST_F(EventTest, getClassName)
   {
-    ls_std::Event event{"OPEN_DOOR_EVENT"};
+    ls_std::Event event{"TMP_ID"};
     ASSERT_STREQ("Event", event.getClassName().c_str());
   }
 
+  TEST_F(EventTest, constructor_empty_parameter)
+  {
+    EXPECT_THROW({
+                   try
+                   {
+                     ls_std::Event event{""};
+                   }
+                   catch (const ls_std::IllegalArgumentException &_exception)
+                   {
+                     throw;
+                   }
+                 }, ls_std::IllegalArgumentException);
+  }
+
   TEST_F(EventTest, addParameter)
   {
-    ls_std::Event event{"OPEN_DOOR_EVENT"};
+    ls_std::Event event{"TMP_ID"};
     ASSERT_TRUE(event.getParameterList().empty());
 
-    event.addParameter(ls_std::event_parameter("key", "yes"));
-    event.addParameter(ls_std::event_parameter("facing_door", "yes"));
+    ASSERT_TRUE(event.addParameter(ls_std::event_parameter("key", "yes")));
+    ASSERT_TRUE(event.addParameter(ls_std::event_parameter("facing_door", "yes")));
+  }
 
-    ls_std::event_parameter_list parameterList = event.getParameterList();
-    ASSERT_FALSE(parameterList.empty());
-    ASSERT_EQ(2, parameterList.size());
-    ASSERT_STREQ("yes", parameterList.at("key").c_str());
-    ASSERT_STREQ("yes", parameterList.at("facing_door").c_str());
+  TEST_F(EventTest, addParameter_element_already_exists)
+  {
+    ls_std::Event event{"TMP_ID"};
+    ASSERT_TRUE(event.getParameterList().empty());
+
+    ASSERT_TRUE(event.addParameter(ls_std::event_parameter("key", "yes")));
+    ASSERT_FALSE(event.addParameter(ls_std::event_parameter("key", "yes")));
   }
 
   TEST_F(EventTest, clearParameterList)
@@ -115,13 +139,16 @@ namespace
     event.addParameter(ls_std::event_parameter("key", "yes"));
     event.addParameter(ls_std::event_parameter("facing_door", "yes"));
 
-    ASSERT_FALSE(event.getParameterList().empty());
-    ASSERT_EQ(2, event.getParameterList().size());
-    event.removeParameter("key");
-    ASSERT_EQ(1, event.getParameterList().size());
-    event.removeParameter("facing_door");
-    ASSERT_EQ(0, event.getParameterList().size());
-    ASSERT_TRUE(event.getParameterList().empty());
+    ASSERT_TRUE(event.removeParameter("key"));
+    ASSERT_TRUE(event.removeParameter("facing_door"));
+  }
+
+  TEST_F(EventTest, removeParameter_elenent_does_not_exist)
+  {
+    ls_std::Event event{"OPEN_DOOR_EVENT"};
+
+    ASSERT_FALSE(event.removeParameter("key"));
+    ASSERT_FALSE(event.removeParameter("facing_door"));
   }
 
   TEST_F(EventTest, setId)
@@ -132,4 +159,34 @@ namespace
     event.setId("ANOTHER_EVENT");
     ASSERT_STREQ("ANOTHER_EVENT", event.getId().c_str());
   }
+
+  TEST_F(EventTest, setId_empty_parameter)
+  {
+    EXPECT_THROW({
+                   try
+                   {
+                     ls_std::Event event{"TMP_ID"};
+                     event.setId("");
+                   }
+                   catch (const ls_std::IllegalArgumentException &_exception)
+                   {
+                     throw;
+                   }
+                 }, ls_std::IllegalArgumentException);
+  }
+
+  TEST_F(EventTest, setSerializable_no_reference)
+  {
+    EXPECT_THROW({
+                   try
+                   {
+                     ls_std::Event event{"TMP_ID"};
+                     event.setSerializable(nullptr);
+                   }
+                   catch (const ls_std::IllegalArgumentException &_exception)
+                   {
+                     throw;
+                   }
+                 }, ls_std::IllegalArgumentException);
+  }
 }