Procházet zdrojové kódy

Add validator for SectionPairSection class

Patrick-Christopher Mattulat před 2 roky
rodič
revize
d2345b82cc

+ 2 - 0
CMakeLists.txt

@@ -186,6 +186,7 @@ set(SOURCE_FILES_IO
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/validator/SectionPairRowSingleValueValidator.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/validator/SectionPairRowValidator.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/validator/SectionPairSectionIdUnmarshalValidator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/validator/SectionPairSectionValidator.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/validator/SectionPairValueValidator.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/serialization/SerializableSectionPairDocument.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/serialization/SerializableSectionPairParameter.cpp
@@ -284,6 +285,7 @@ if (${LS_STD_BUILD_WITH_TESTS})
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/validator/SectionPairRowSingleValueValidatorTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/validator/SectionPairRowValidatorTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/validator/SectionPairSectionIdUnmarshalValidatorTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/validator/SectionPairSectionValidatorTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/validator/SectionPairValueValidatorTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/model/SectionPairDocumentTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/model/SectionPairRowListValueTest.cpp

+ 38 - 0
include/ls-std/io/section-pair/validator/SectionPairSectionValidator.hpp

@@ -0,0 +1,38 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-20
+* Changed:         2023-02-20
+*
+* */
+
+#ifndef LS_STD_SECTION_PAIR_SECTION_VALIDATOR_HPP
+#define LS_STD_SECTION_PAIR_SECTION_VALIDATOR_HPP
+
+#include <ls-std/core/Class.hpp>
+#include <ls-std/core/interface/IValidator.hpp>
+#include <ls-std/os/dynamic-goal.hpp>
+#include <string>
+
+namespace ls::std::io
+{
+  class LS_STD_DYNAMIC_GOAL SectionPairSectionValidator : public ls::std::core::Class, public ls::std::core::interface_type::IValidator
+  {
+    public:
+
+      explicit SectionPairSectionValidator(::std::string _section);
+      ~SectionPairSectionValidator() override;
+
+      [[nodiscard]] static ::std::string getValidationRegex();
+      [[nodiscard]] bool isValid() override;
+
+    private:
+
+      ::std::string section{};
+
+      [[nodiscard]] static ::std::string _getValidationRegex();
+  };
+}
+
+#endif

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

@@ -40,6 +40,7 @@
 #include <ls-std/io/section-pair/validator/SectionPairRowSingleValueValidator.hpp>
 #include <ls-std/io/section-pair/validator/SectionPairRowValidator.hpp>
 #include <ls-std/io/section-pair/validator/SectionPairSectionIdUnmarshalValidator.hpp>
+#include <ls-std/io/section-pair/validator/SectionPairSectionValidator.hpp>
 #include <ls-std/io/section-pair/validator/SectionPairValueValidator.hpp>
 
 #include <ls-std/io/xml/XmlAttribute.hpp>

+ 42 - 0
source/ls-std/io/section-pair/validator/SectionPairSectionValidator.cpp

@@ -0,0 +1,42 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-20
+* Changed:         2023-02-20
+*
+* */
+
+#include <ls-std/io/section-pair/validator/SectionPairRowValidator.hpp>
+#include <ls-std/io/section-pair/validator/SectionPairSectionValidator.hpp>
+#include <regex>
+#include <string>
+
+ls::std::io::SectionPairSectionValidator::SectionPairSectionValidator(::std::string _section) : ls::std::core::Class("SectionPairSectionValidator"), section(::std::move(_section))
+{}
+
+ls::std::io::SectionPairSectionValidator::~SectionPairSectionValidator() = default;
+
+::std::string ls::std::io::SectionPairSectionValidator::getValidationRegex()
+{
+  return ls::std::io::SectionPairSectionValidator::_getValidationRegex();
+}
+
+bool ls::std::io::SectionPairSectionValidator::isValid()
+{
+  ::std::string validationRegex = ls::std::io::SectionPairSectionValidator::_getValidationRegex();
+  static ::std::regex sectionRegex = ::std::regex{"^" + validationRegex};
+
+  return ::std::regex_match(this->section, sectionRegex);
+}
+
+::std::string ls::std::io::SectionPairSectionValidator::_getValidationRegex()
+{
+  ::std::string newLine = R"(((\n)|(\r\n)))";
+  ::std::string sectionHeader = newLine + R"(\[{1}([a-z]([a-z0-9-]){1,15})\]{1}()" + newLine + R"({2}))";
+  ::std::string row = ls::std::io::SectionPairRowValidator::getValidationRegex();
+  ::std::string atLeastOneRow = R"((()" + row + R"(){1}))";
+  ::std::string optionalRows = R"((()" + row + R"()*))";
+
+  return sectionHeader + atLeastOneRow + optionalRows;
+}

+ 1 - 1
test/cases/io/section-pair/validator/SectionPairRowValidatorTest.cpp

@@ -69,6 +69,6 @@ namespace
     ASSERT_FALSE(SectionPairRowValidator{GetParam()}.isValid());
   }
 
-  INSTANTIATE_TEST_SUITE_P(ValidArgumentTest, SectionPairRowValidatorTest_ValidArgumentTest, ::testing::Values("favourite-color=blue\n", "color=red\r\n", "colors:\n  red\n  blue\n", "colors:\r\n  red\r\n  yellow\r\n"));
+  INSTANTIATE_TEST_SUITE_P(ValidArgumentTest, SectionPairRowValidatorTest_ValidArgumentTest, ::testing::Values("favourite-color=blue\n", "color=red\r\n", "colors:\n  red\n  blue\n", "colors:\r\n  red\r\n  yellow\r\n", "graphics-card=GTX 720\n"));
   INSTANTIATE_TEST_SUITE_P(InvalidArgumentTest, SectionPairRowValidatorTest_InvalidArgumentTest, ::testing::Values("color blue", "a row\nand so on"));
 }

+ 77 - 0
test/cases/io/section-pair/validator/SectionPairSectionValidatorTest.cpp

@@ -0,0 +1,77 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-20
+* Changed:         2023-02-20
+*
+* */
+
+#include <gtest/gtest.h>
+#include <ls-std-io-test.hpp>
+#include <ls-std/ls-std-core.hpp>
+#include <ls-std/ls-std-io.hpp>
+#include <string>
+
+using namespace ls::std::core;
+using namespace ls::std::io;
+using namespace ::std;
+using namespace test::io;
+
+namespace
+{
+  class SectionPairSectionValidatorTest : public ::testing::Test
+  {
+    protected:
+
+      SectionPairSectionValidatorTest() = default;
+      ~SectionPairSectionValidatorTest() override = default;
+
+      void SetUp() override
+      {}
+
+      void TearDown() override
+      {}
+  };
+
+  class SectionPairSectionValidatorTest_ValidArgumentTest : public ::testing::TestWithParam<string>
+  {
+    protected:
+
+      SectionPairSectionValidatorTest_ValidArgumentTest() = default;
+      ~SectionPairSectionValidatorTest_ValidArgumentTest() override = default;
+  };
+
+  class SectionPairSectionValidatorTest_InvalidArgumentTest : public ::testing::TestWithParam<string>
+  {
+    protected:
+
+      SectionPairSectionValidatorTest_InvalidArgumentTest() = default;
+      ~SectionPairSectionValidatorTest_InvalidArgumentTest() override = default;
+  };
+
+  TEST_F(SectionPairSectionValidatorTest, getClassName)
+  {
+    ASSERT_STREQ("SectionPairSectionValidator", SectionPairSectionValidator{"empty"}.getClassName().c_str());
+  }
+
+  TEST_F(SectionPairSectionValidatorTest, getValidationRegex)
+  {
+    string expected =
+        R"(((\n)|(\r\n))\[{1}([a-z]([a-z0-9-]){1,15})\]{1}(((\n)|(\r\n)){2})(((([a-z]([a-z0-9-]){1,15})={1}([a-zA-Z0-9\-_#!?\[\]\{\}\(\)\$ۤ<>+:;., \*\/"]{1,32}){1}($|\n{1}|\r{1}\n{1}))|(((((([a-z]([a-z0-9-]){1,15}):{1})((\n{1})|(\r{1}\n{1})))( {2}[a-zA-Z0-9\-_#!?\[\]\{\}\(\)\$ۤ<>+:;., \*\/"]{1,32}((\n{1})|(\r{1}\n{1})))){1}(( {2}[a-zA-Z0-9\-_#!?\[\]\{\}\(\)\$ۤ<>+:;., \*\/"]{1,32}((\n{1})|(\r{1}\n{1})))*)))){1})(((([a-z]([a-z0-9-]){1,15})={1}([a-zA-Z0-9\-_#!?\[\]\{\}\(\)\$ۤ<>+:;., \*\/"]{1,32}){1}($|\n{1}|\r{1}\n{1}))|(((((([a-z]([a-z0-9-]){1,15}):{1})((\n{1})|(\r{1}\n{1})))( {2}[a-zA-Z0-9\-_#!?\[\]\{\}\(\)\$ۤ<>+:;., \*\/"]{1,32}((\n{1})|(\r{1}\n{1})))){1}(( {2}[a-zA-Z0-9\-_#!?\[\]\{\}\(\)\$ۤ<>+:;., \*\/"]{1,32}((\n{1})|(\r{1}\n{1})))*))))*))";
+    ASSERT_STREQ(expected.c_str(), SectionPairSectionValidator::getValidationRegex().c_str());
+  }
+
+  TEST_P(SectionPairSectionValidatorTest_ValidArgumentTest, isValid)
+  {
+    ASSERT_TRUE(SectionPairSectionValidator{GetParam()}.isValid());
+  }
+
+  TEST_P(SectionPairSectionValidatorTest_InvalidArgumentTest, isValid_not_valid)
+  {
+    ASSERT_FALSE(SectionPairSectionValidator{GetParam()}.isValid());
+  }
+
+  INSTANTIATE_TEST_SUITE_P(ValidArgumentTest, SectionPairSectionValidatorTest_ValidArgumentTest, ::testing::Values(SectionPairSectionProvider::createSerializedSectionWithTomExample(NewLine::getUnixNewLine()), SectionPairSectionProvider::createSerializedSectionWithTomExample(NewLine::getWindowsNewLine())));
+  INSTANTIATE_TEST_SUITE_P(InvalidArgumentTest, SectionPairSectionValidatorTest_InvalidArgumentTest, ::testing::Values("[general]\nage=22"));
+}

+ 1 - 1
test/cases/io/section-pair/validator/SectionPairValueValidatorTest.cpp

@@ -73,4 +73,4 @@ namespace
 
   INSTANTIATE_TEST_SUITE_P(ValidArgumentTest, SectionPairValueValidatorTest_ValidArgumentTest, ::testing::Values("blue is my favourite color!", "Age", "Tom", "\"Tom\"", "Hello!" + NewLine::getUnixNewLine(), "Hello!" + NewLine::getWindowsNewLine()));
   INSTANTIATE_TEST_SUITE_P(InvalidArgumentTest, SectionPairValueValidatorTest_InvalidArgumentTest, ::testing::Values("1+2=3", "\\escape"));
-}
+}

+ 5 - 5
test/classes/io/section-pair/SectionPairSectionProvider.hpp

@@ -3,7 +3,7 @@
 * Company:         Lynar Studios
 * E-Mail:          webmaster@lynarstudios.com
 * Created:         2023-02-15
-* Changed:         2023-02-17
+* Changed:         2023-02-20
 *
 * */
 
@@ -24,10 +24,10 @@ namespace test::io
       SectionPairSectionProvider();
       ~SectionPairSectionProvider();
 
-      static ::std::shared_ptr<ls::std::io::SectionPairSection> createSectionWithSandraExample();
-      static ::std::shared_ptr<ls::std::io::SectionPairSection> createSectionWithTomExample();
-      static ls::std::core::type::byte_field createSerializedSectionWithSandraExample(const ::std::string &_newLine);
-      static ls::std::core::type::byte_field createSerializedSectionWithTomExample(const ::std::string &_newLine);
+      [[nodiscard]] static ::std::shared_ptr<ls::std::io::SectionPairSection> createSectionWithSandraExample();
+      [[nodiscard]] static ::std::shared_ptr<ls::std::io::SectionPairSection> createSectionWithTomExample();
+      [[nodiscard]] static ls::std::core::type::byte_field createSerializedSectionWithSandraExample(const ::std::string &_newLine);
+      [[nodiscard]] static ls::std::core::type::byte_field createSerializedSectionWithTomExample(const ::std::string &_newLine);
   };
 }