Browse Source

Add validator for section pair list value row

Patrick-Christopher Mattulat 1 year ago
parent
commit
577e706d10

+ 2 - 0
CMakeLists.txt

@@ -180,6 +180,7 @@ set(SOURCE_FILES_IO
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/model/SectionPairRowValue.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/model/SectionPairSection.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/validator/SectionPairIdentifierValidator.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/validator/SectionPairRowListValueValidator.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/validator/SectionPairRowSingleValueValidator.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/SectionPairValueValidator.cpp
@@ -274,6 +275,7 @@ if (${LS_STD_BUILD_WITH_TESTS})
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/evaluator/SectionPairRowSingleValueArgumentEvaluatorTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/evaluator/SectionPairValueArgumentEvaluatorTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/validator/SectionPairIdentifierValidatorTest.cpp
+            ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/validator/SectionPairRowListValueValidatorTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/validator/SectionPairRowSingleValueValidatorTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/validator/SectionPairSectionIdUnmarshalValidatorTest.cpp
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/validator/SectionPairValueValidatorTest.cpp

+ 37 - 0
include/ls-std/io/section-pair/validator/SectionPairRowListValueValidator.hpp

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

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

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2023-02-11
- * Changed:         2023-02-19
+ * Changed:         2023-02-20
  *
  * */
 
@@ -34,6 +34,7 @@
 #include <ls-std/io/section-pair/type/SectionPairDocumentTypes.hpp>
 #include <ls-std/io/section-pair/type/SectionPairSectionTypes.hpp>
 #include <ls-std/io/section-pair/validator/SectionPairIdentifierValidator.hpp>
+#include <ls-std/io/section-pair/validator/SectionPairRowListValueValidator.hpp>
 #include <ls-std/io/section-pair/validator/SectionPairRowSingleValueValidator.hpp>
 #include <ls-std/io/section-pair/validator/SectionPairSectionIdUnmarshalValidator.hpp>
 #include <ls-std/io/section-pair/validator/SectionPairValueValidator.hpp>

+ 43 - 0
source/ls-std/io/section-pair/validator/SectionPairRowListValueValidator.cpp

@@ -0,0 +1,43 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-19
+* Changed:         2023-02-20
+*
+* */
+
+#include <ls-std/io/section-pair/validator/SectionPairIdentifierValidator.hpp>
+#include <ls-std/io/section-pair/validator/SectionPairRowListValueValidator.hpp>
+#include <ls-std/io/section-pair/validator/SectionPairValueValidator.hpp>
+#include <regex>
+
+ls::std::io::SectionPairRowListValueValidator::SectionPairRowListValueValidator(::std::string _listValueRow) : ls::std::core::Class("SectionPairRowListValueValidator"), listValueRow(::std::move(_listValueRow))
+{}
+
+ls::std::io::SectionPairRowListValueValidator::~SectionPairRowListValueValidator() = default;
+
+::std::string ls::std::io::SectionPairRowListValueValidator::getValidationRegex()
+{
+  return ls::std::io::SectionPairRowListValueValidator::_getValidationRegex();
+}
+
+bool ls::std::io::SectionPairRowListValueValidator::isValid()
+{
+  ::std::string validationRegex = ls::std::io::SectionPairRowListValueValidator::_getValidationRegex();
+  static ::std::regex listValueRowRegex = ::std::regex{"^" + validationRegex};
+
+  return ::std::regex_match(this->listValueRow, listValueRowRegex);
+}
+
+::std::string ls::std::io::SectionPairRowListValueValidator::_getValidationRegex()
+{
+  ::std::string identifierRegex = ls::std::io::SectionPairIdentifierValidator::getValidationRegex();
+  ::std::string valueRegex = ls::std::io::SectionPairValueValidator::getValidationRegex();
+  ::std::string windowsFirstLine = R"(((()" + identifierRegex + R"():{1})\r{1}\n{1}))";
+  ::std::string unixFirstLine = R"(((()" + identifierRegex + R"():{1})\n{1}))";
+  ::std::string windowsValidationRegex = R"((()" + windowsFirstLine + R"(( {2})" + valueRegex + R"(\r{1}\n{1})){1}(( {2})" + valueRegex + R"(\r{1}\n{1})*)))";
+  ::std::string unixValidationRegex = R"(|(()" + unixFirstLine + R"(( {2})" + valueRegex + R"(\n{1})){1}(( {2})" + valueRegex + R"(\n{1})*)))";
+
+  return windowsValidationRegex + unixValidationRegex;
+}

+ 3 - 2
source/ls-std/io/section-pair/validator/SectionPairRowSingleValueValidator.cpp

@@ -3,7 +3,7 @@
 * Company:         Lynar Studios
 * E-Mail:          webmaster@lynarstudios.com
 * Created:         2023-02-19
-* Changed:         2023-02-19
+* Changed:         2023-02-20
 *
 * */
 
@@ -30,6 +30,7 @@ bool ls::std::io::SectionPairRowSingleValueValidator::isValid()
 {
   ::std::string identifierRegex = ls::std::io::SectionPairIdentifierValidator::getValidationRegex();
   ::std::string valueRegex = ls::std::io::SectionPairValueValidator::getValidationRegex();
+  ::std::string valueRegexConcatenation = "(" + valueRegex + ")|(" + valueRegex + "\\n{1})|(" + valueRegex + "\\r{1}\\n{1})";
 
-  return "((" + identifierRegex + R"()={1}()" + valueRegex + "))";
+  return "((" + identifierRegex + R"()={1}()" + valueRegexConcatenation + "))";
 }

+ 2 - 3
source/ls-std/io/section-pair/validator/SectionPairValueValidator.cpp

@@ -3,7 +3,7 @@
 * Company:         Lynar Studios
 * E-Mail:          webmaster@lynarstudios.com
 * Created:         2023-02-09
-* Changed:         2023-02-19
+* Changed:         2023-02-20
 *
 * */
 
@@ -18,8 +18,7 @@ ls::std::io::SectionPairValueValidator::~SectionPairValueValidator() = default;
 
 ::std::string ls::std::io::SectionPairValueValidator::getValidationRegex()
 {
-  ::std::string validationRegex = ls::std::io::SectionPairValueValidator::_getValidationRegex();
-  return "(" + validationRegex + ")|(" + validationRegex + "\\n{1})|(" + validationRegex + "\\r{1}\\n{1})";
+  return ls::std::io::SectionPairValueValidator::_getValidationRegex();
 }
 
 bool ls::std::io::SectionPairValueValidator::isValid()

+ 76 - 0
test/cases/io/section-pair/validator/SectionPairRowListValueValidatorTest.cpp

@@ -0,0 +1,76 @@
+/*
+* Author:          Patrick-Christopher Mattulat
+* Company:         Lynar Studios
+* E-Mail:          webmaster@lynarstudios.com
+* Created:         2023-02-19
+* Changed:         2023-02-20
+*
+* */
+
+#include <gtest/gtest.h>
+#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;
+
+namespace
+{
+  class SectionPairRowListValueValidatorTest : public ::testing::Test
+  {
+    protected:
+
+      SectionPairRowListValueValidatorTest() = default;
+      ~SectionPairRowListValueValidatorTest() override = default;
+
+      void SetUp() override
+      {}
+
+      void TearDown() override
+      {}
+  };
+
+  class SectionPairRowListValueValidatorIsValidTest : public ::testing::TestWithParam<string>
+  {
+    protected:
+
+      SectionPairRowListValueValidatorIsValidTest() = default;
+      ~SectionPairRowListValueValidatorIsValidTest() override = default;
+  };
+
+  class SectionPairRowListValueValidatorNotValidTest : public ::testing::TestWithParam<string>
+  {
+    protected:
+
+      SectionPairRowListValueValidatorNotValidTest() = default;
+      ~SectionPairRowListValueValidatorNotValidTest() override = default;
+  };
+
+  TEST_F(SectionPairRowListValueValidatorTest, getClassName)
+  {
+    ASSERT_STREQ("SectionPairRowListValueValidator", SectionPairRowListValueValidator{"tmp-key"}.getClassName().c_str());
+  }
+
+  TEST_F(SectionPairRowListValueValidatorTest, getValidationRegex)
+  {
+    string expected = R"(((((([a-z]([a-z0-9-]){1,15}):{1})\r{1}\n{1})( {2}[a-zA-Z0-9\-_#!?\[\]\{\}\(\)\$ۤ<>+:;., \*\/"]{1,32}\r{1}\n{1})){1}(( {2}[a-zA-Z0-9\-_#!?\[\]\{\}\(\)\$ۤ<>+:;., \*\/"]{1,32}\r{1}\n{1})*))|((((([a-z]([a-z0-9-]){1,15}):{1})\n{1})( {2}[a-zA-Z0-9\-_#!?\[\]\{\}\(\)\$ۤ<>+:;., \*\/"]{1,32}\n{1})){1}(( {2}[a-zA-Z0-9\-_#!?\[\]\{\}\(\)\$ۤ<>+:;., \*\/"]{1,32}\n{1})*)))";
+    string actual = SectionPairRowListValueValidator::getValidationRegex();
+
+    ASSERT_STREQ(expected.c_str(), actual.c_str());
+  }
+
+  TEST_P(SectionPairRowListValueValidatorIsValidTest, isValid)
+  {
+    ASSERT_TRUE(SectionPairRowListValueValidator{GetParam()}.isValid());
+  }
+
+  TEST_P(SectionPairRowListValueValidatorNotValidTest, isValid_not_valid)
+  {
+    ASSERT_FALSE(SectionPairRowListValueValidator{GetParam()}.isValid());
+  }
+
+  INSTANTIATE_TEST_SUITE_P(SectionPairRowListValueValidatorTest, SectionPairRowListValueValidatorIsValidTest, ::testing::Values("colors:\n  blue\n  red\n", "colors:\r\n  blue\r\n  green\r\n  yellow\r\n"));
+  INSTANTIATE_TEST_SUITE_P(SectionPairRowListValueValidatorTest, SectionPairRowListValueValidatorNotValidTest, ::testing::Values("colors:\nblue", "colors:\r\n hello!"));
+}

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

@@ -3,7 +3,7 @@
 * Company:         Lynar Studios
 * E-Mail:          webmaster@lynarstudios.com
 * Created:         2023-02-09
-* Changed:         2023-02-19
+* Changed:         2023-02-20
 *
 * */
 
@@ -55,7 +55,7 @@ namespace
 
   TEST_F(SectionPairValueValidatorTest, getValidationRegex)
   {
-    string expected = R"(([a-zA-Z0-9\-_#!?\[\]\{\}\(\)\$ۤ<>+:;., \*\/"]{1,32})|([a-zA-Z0-9\-_#!?\[\]\{\}\(\)\$ۤ<>+:;., \*\/"]{1,32}\n{1})|([a-zA-Z0-9\-_#!?\[\]\{\}\(\)\$ۤ<>+:;., \*\/"]{1,32}\r{1}\n{1}))";
+    string expected = R"([a-zA-Z0-9\-_#!?\[\]\{\}\(\)\$ۤ<>+:;., \*\/"]{1,32})";
     string actual = SectionPairValueValidator::getValidationRegex();
 
     ASSERT_STREQ(expected.c_str(), actual.c_str());