Browse Source

Add serializable for SectionPairRowListValue class

Patrick-Christopher Mattulat 2 năm trước cách đây
mục cha
commit
be476f7786

+ 2 - 0
CMakeLists.txt

@@ -182,6 +182,7 @@ set(SOURCE_FILES_IO
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/SectionPairRowValue.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/SectionPairRowValueArgumentEvaluator.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/SectionPairRowValueValidator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/SerializableSectionPairRowListValue.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/SerializableSectionPairRowSingleValue.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/xml/XmlAttribute.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/xml/XmlDeclaration.cpp
@@ -274,6 +275,7 @@ if (${LS_STD_BUILD_WITH_TESTS})
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/SectionPairRowTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/SectionPairRowValueArgumentEvaluatorTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/SectionPairRowValueValidatorTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/SerializableSectionPairRowListValueTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/SerializableSectionPairRowSingleValueTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/xml/XmlAttributeTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/xml/XmlDeclarationTest.cpp

+ 2 - 1
include/ls-std/io/section-pair/SectionPairRowListValue.hpp

@@ -3,7 +3,7 @@
 * Company:         Lynar Studios
 * E-Mail:          webmaster@lynarstudios.com
 * Created:         2023-02-10
-* Changed:         2023-02-10
+* Changed:         2023-02-11
 *
 * */
 
@@ -26,6 +26,7 @@ namespace ls::std::io
 
       void add(const ls::std::io::section_pair_row_value &_value);
       [[nodiscard]] ls::std::io::section_pair_row_value get(size_t _index);
+      [[nodiscard]] ::std::list<ls::std::io::section_pair_row_value> getList();
       [[nodiscard]] size_t getSize();
       [[nodiscard]] ls::std::io::SectionPairRowEnumType getType() override;
 

+ 41 - 0
include/ls-std/io/section-pair/SerializableSectionPairRowListValue.hpp

@@ -0,0 +1,41 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-11
+* Changed:         2023-02-11
+*
+* */
+
+#ifndef LS_STD_SERIALIZABLE_SECTION_PAIR_ROW_LIST_VALUE_HPP
+#define LS_STD_SERIALIZABLE_SECTION_PAIR_ROW_LIST_VALUE_HPP
+
+#include "SectionPairRowListValue.hpp"
+#include <ls-std/core/interface/ISerializable.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <memory>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SerializableSectionPairRowListValue : public ls::std::core::interface_type::ISerializable
+  {
+    public:
+
+      explicit SerializableSectionPairRowListValue(const ::std::shared_ptr<ls::std::io::SectionPairRowListValue>& _value);
+      ~SerializableSectionPairRowListValue() override;
+
+      [[nodiscard]] ::std::shared_ptr<ls::std::io::SectionPairRowListValue> getValue();
+      [[nodiscard]] ls::std::core::type::byte_field marshal() override;
+      void unmarshal(const ls::std::core::type::byte_field &_data) override;
+
+    private:
+
+      ::std::shared_ptr<ls::std::io::SectionPairRowListValue> value{};
+
+      [[nodiscard]] static ::std::string _getLine(::std::string::size_type _position, const ls::std::core::type::byte_field &_searchText);
+      void _setValue(const ::std::shared_ptr<ls::std::io::SectionPairRowListValue>& _value);
+      static void _updateSearchText(::std::string::size_type _position, ls::std::core::type::byte_field &_searchText);
+  };
+}
+
+#endif

+ 1 - 0
include/ls-std/ls-std-io.hpp

@@ -30,6 +30,7 @@
 #include <ls-std/io/section-pair/SectionPairRowValueArgumentEvaluator.hpp>
 #include <ls-std/io/section-pair/SectionPairRowValueValidator.hpp>
 #include <ls-std/io/section-pair/SectionPairTypes.hpp>
+#include <ls-std/io/section-pair/SerializableSectionPairRowListValue.hpp>
 #include <ls-std/io/section-pair/SerializableSectionPairRowSingleValue.hpp>
 
 #include <ls-std/io/xml/XmlAttribute.hpp>

+ 6 - 1
source/ls-std/io/section-pair/SectionPairRowListValue.cpp

@@ -3,7 +3,7 @@
 * Company:         Lynar Studios
 * E-Mail:          webmaster@lynarstudios.com
 * Created:         2023-02-10
-* Changed:         2023-02-10
+* Changed:         2023-02-11
 *
 * */
 
@@ -44,6 +44,11 @@ ls::std::io::section_pair_row_value ls::std::io::SectionPairRowListValue::get(si
   return value;
 }
 
+::std::list<ls::std::io::section_pair_row_value> ls::std::io::SectionPairRowListValue::getList()
+{
+  return this->values;
+}
+
 size_t ls::std::io::SectionPairRowListValue::getSize()
 {
   return this->values.size();

+ 86 - 0
source/ls-std/io/section-pair/SerializableSectionPairRowListValue.cpp

@@ -0,0 +1,86 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-11
+* Changed:         2023-02-11
+*
+* */
+
+#include <ls-std/core/evaluator/EmptyStringArgumentEvaluator.hpp>
+#include <ls-std/core/evaluator/NullPointerArgumentEvaluator.hpp>
+#include <ls-std/io/NewLine.hpp>
+#include <ls-std/io/section-pair/SerializableSectionPairRowListValue.hpp>
+
+ls::std::io::SerializableSectionPairRowListValue::SerializableSectionPairRowListValue(const ::std::shared_ptr<ls::std::io::SectionPairRowListValue> &_value)
+{
+  this->_setValue(_value);
+}
+
+ls::std::io::SerializableSectionPairRowListValue::~SerializableSectionPairRowListValue() = default;
+
+::std::shared_ptr<ls::std::io::SectionPairRowListValue> ls::std::io::SerializableSectionPairRowListValue::getValue()
+{
+  return this->value;
+}
+
+ls::std::core::type::byte_field ls::std::io::SerializableSectionPairRowListValue::marshal()
+{
+  ls::std::core::type::byte_field data{};
+
+  for (const auto &_value : this->value->getList())
+  {
+    data += "  " + _value + ls::std::io::NewLine::get();
+  }
+
+  return data;
+}
+
+void ls::std::io::SerializableSectionPairRowListValue::unmarshal(const ls::std::core::type::byte_field &_data)
+{
+  ls::std::core::EmptyStringArgumentEvaluator{_data}.evaluate(); // TODO necessary? evaluators should be used outside of serializable
+  ls::std::core::type::byte_field searchText = _data;
+
+  while (!searchText.empty() && searchText != ls::std::io::NewLine::get())
+  {
+    ::std::string::size_type positionOfNewLine = searchText.find(ls::std::io::NewLine::get());
+    ::std::string line = ls::std::io::SerializableSectionPairRowListValue::_getLine(positionOfNewLine, searchText);
+    line = line.substr(2);
+    this->value->add(line);
+    ls::std::io::SerializableSectionPairRowListValue::_updateSearchText(positionOfNewLine, searchText);
+  }
+}
+
+::std::string ls::std::io::SerializableSectionPairRowListValue::_getLine(::std::string::size_type _position, const ls::std::core::type::byte_field &_searchText)
+{
+  ::std::string line{};
+
+  if (_position != ::std::string::npos)
+  {
+    line = _searchText.substr(0, _position + (ls::std::io::NewLine::get().size() - 1));
+  }
+  else
+  {
+    line = _searchText;
+  }
+
+  return line;
+}
+
+void ls::std::io::SerializableSectionPairRowListValue::_setValue(const ::std::shared_ptr<ls::std::io::SectionPairRowListValue> &_value)
+{
+  ls::std::core::NullPointerArgumentEvaluator{_value}.evaluate();
+  this->value = _value;
+}
+
+void ls::std::io::SerializableSectionPairRowListValue::_updateSearchText(::std::string::size_type _position, ls::std::core::type::byte_field &_searchText)
+{
+  if (_position != ::std::string::npos)
+  {
+    _searchText = _searchText.substr(_position + ls::std::io::NewLine::get().size());
+  }
+  else
+  {
+    _searchText = "";
+  }
+}

+ 7 - 1
test/cases/io/section-pair/SectionPairRowListValueTest.cpp

@@ -3,7 +3,7 @@
 * Company:         Lynar Studios
 * E-Mail:          webmaster@lynarstudios.com
 * Created:         2023-02-10
-* Changed:         2023-02-10
+* Changed:         2023-02-11
 *
 * */
 
@@ -99,6 +99,12 @@ namespace
         IndexOutOfBoundsException);
   }
 
+  TEST_F(SectionPairRowListValueTest, getList)
+  {
+    SectionPairRowListValue list{};
+    ASSERT_TRUE(list.getList().empty());
+  }
+
   TEST_F(SectionPairRowListValueTest, getSize)
   {
     SectionPairRowListValue list{};

+ 102 - 0
test/cases/io/section-pair/SerializableSectionPairRowListValueTest.cpp

@@ -0,0 +1,102 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-11
+* Changed:         2023-02-11
+*
+* */
+
+#include <gtest/gtest.h>
+#include <ls-std/ls-std-core.hpp>
+#include <ls-std/ls-std-io.hpp>
+#include <memory>
+
+using namespace ls::std::core;
+using namespace ls::std::io;
+using namespace ::std;
+
+namespace
+{
+  class SerializableSectionPairRowListValueTest : public ::testing::Test
+  {
+    protected:
+
+      SerializableSectionPairRowListValueTest() = default;
+      ~SerializableSectionPairRowListValueTest() override = default;
+
+      void SetUp() override
+      {}
+
+      void TearDown() override
+      {}
+  };
+
+  TEST_F(SerializableSectionPairRowListValueTest, constructor_no_reference)
+  {
+    EXPECT_THROW(
+        {
+          try
+          {
+            SerializableSectionPairRowListValue serializable(nullptr);
+          }
+          catch (const IllegalArgumentException &_exception)
+          {
+            throw;
+          }
+        },
+        IllegalArgumentException);
+  }
+
+  TEST_F(SerializableSectionPairRowListValueTest, getValue)
+  {
+    shared_ptr<SectionPairRowListValue> value = make_shared<SectionPairRowListValue>();
+    SerializableSectionPairRowListValue serializable(value);
+
+    ASSERT_TRUE(value == serializable.getValue());
+  }
+
+  TEST_F(SerializableSectionPairRowListValueTest, marshal)
+  {
+    shared_ptr<SectionPairRowListValue> value = make_shared<SectionPairRowListValue>();
+    value->add("Drumming");
+    value->add("Reading");
+    value->add("Coding");
+    SerializableSectionPairRowListValue serializable(value);
+
+    ::std::string expected = "  Drumming" + NewLine::get() + "  Reading" + NewLine::get() + "  Coding" + NewLine::get();
+
+    ASSERT_STREQ(expected.c_str(), serializable.marshal().c_str());
+  }
+
+  TEST_F(SerializableSectionPairRowListValueTest, unmarshal)
+  {
+    shared_ptr<SectionPairRowListValue> value = make_shared<SectionPairRowListValue>();
+    SerializableSectionPairRowListValue serializable(value);
+    ::std::string serializedListValue = "  Drumming" + NewLine::get() + "  Reading" + NewLine::get() + "  Coding" + NewLine::get();
+    serializable.unmarshal(serializedListValue);
+
+    ASSERT_EQ(3, value->getSize());
+    ASSERT_STREQ("Drumming", value->get(0).c_str());
+    ASSERT_STREQ("Reading", value->get(1).c_str());
+    ASSERT_STREQ("Coding", value->get(2).c_str());
+  }
+
+  TEST_F(SerializableSectionPairRowListValueTest, unmarshal_empty_string)
+  {
+    SerializableSectionPairRowListValue serializable(make_shared<SectionPairRowListValue>());
+
+    EXPECT_THROW(
+        {
+          try
+          {
+            serializable.unmarshal("");
+          }
+          catch (const IllegalArgumentException &_exception)
+          {
+            throw;
+          }
+        },
+        IllegalArgumentException);
+  }
+}