Procházet zdrojové kódy

Add validator for section pair row

Patrick-Christopher Mattulat před 1 rokem
rodič
revize
dfb08f2d3f

+ 2 - 0
CMakeLists.txt

@@ -183,6 +183,7 @@ set(SOURCE_FILES_IO
         ${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/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/SectionPairValueValidator.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/source/ls-std/io/section-pair/serialization/SerializableSectionPairDocument.cpp
@@ -279,6 +280,7 @@ if (${LS_STD_BUILD_WITH_TESTS})
             ${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/SectionPairRowValidatorTest.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
             ${CMAKE_CURRENT_SOURCE_DIR}/test/cases/io/section-pair/model/SectionPairDocumentTest.cpp

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

@@ -3,7 +3,7 @@
 * Company:         Lynar Studios
 * E-Mail:          webmaster@lynarstudios.com
 * Created:         2023-02-19
-* Changed:         2023-02-19
+* Changed:         2023-02-20
 *
 * */
 
@@ -23,6 +23,7 @@ namespace ls::std::io
       explicit SectionPairRowSingleValueValidator(::std::string _singleValueRow);
       ~SectionPairRowSingleValueValidator() override;
 
+      [[nodiscard]] static ::std::string getValidationRegex();
       [[nodiscard]] bool isValid() override;
 
     private:

+ 38 - 0
include/ls-std/io/section-pair/validator/SectionPairRowValidator.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_ROW_VALIDATOR_HPP
+#define LS_STD_SECTION_PAIR_ROW_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 SectionPairRowValidator : public ls::std::core::Class, public ls::std::core::interface_type::IValidator
+  {
+    public:
+
+      explicit SectionPairRowValidator(::std::string _row);
+      ~SectionPairRowValidator() override;
+
+      [[nodiscard]] static ::std::string getValidationRegex();
+      [[nodiscard]] bool isValid() override;
+
+    private:
+
+      ::std::string row{};
+
+      [[nodiscard]] static ::std::string _getValidationRegex();
+  };
+}
+
+#endif

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

@@ -37,6 +37,7 @@
 #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/SectionPairRowValidator.hpp>
 #include <ls-std/io/section-pair/validator/SectionPairSectionIdUnmarshalValidator.hpp>
 #include <ls-std/io/section-pair/validator/SectionPairValueValidator.hpp>
 

+ 3 - 5
source/ls-std/io/section-pair/validator/SectionPairRowListValueValidator.cpp

@@ -34,10 +34,8 @@ bool ls::std::io::SectionPairRowListValueValidator::isValid()
 {
   ::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})*)))";
+  ::std::string lineBreak = R"(((\n{1})|(\r{1}\n{1})))";
+  ::std::string firstLine = R"(((()" + identifierRegex + R"():{1}))" + lineBreak + R"())";
 
-  return windowsValidationRegex + unixValidationRegex;
+  return R"((()" + firstLine + R"(( {2})" + valueRegex + R"()" + lineBreak + R"()){1}(( {2})" + valueRegex + R"()" + lineBreak + R"()*)))";
 }

+ 7 - 4
source/ls-std/io/section-pair/validator/SectionPairRowSingleValueValidator.cpp

@@ -17,11 +17,15 @@ ls::std::io::SectionPairRowSingleValueValidator::SectionPairRowSingleValueValida
 
 ls::std::io::SectionPairRowSingleValueValidator::~SectionPairRowSingleValueValidator() = default;
 
+::std::string ls::std::io::SectionPairRowSingleValueValidator::getValidationRegex()
+{
+  return ls::std::io::SectionPairRowSingleValueValidator::_getValidationRegex();
+}
+
 bool ls::std::io::SectionPairRowSingleValueValidator::isValid()
 {
   ::std::string validationRegex = ls::std::io::SectionPairRowSingleValueValidator::_getValidationRegex();
-  ::std::string concatenation = "(^" + validationRegex + ")|(^" + validationRegex + R"(\n{1})|(^)" + validationRegex + R"(\r{1}\n{1}))";
-  static ::std::regex singleValueRowRegex{concatenation};
+  static ::std::regex singleValueRowRegex = ::std::regex{"^" + validationRegex};
 
   return ::std::regex_match(this->singleValueRow, singleValueRowRegex);
 }
@@ -30,7 +34,6 @@ 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}()" + valueRegexConcatenation + "))";
+  return R"(()" + identifierRegex + R"()={1}()" + valueRegex + R"(){1}($|\n{1}|\r{1}\n{1}))";
 }

+ 39 - 0
source/ls-std/io/section-pair/validator/SectionPairRowValidator.cpp

@@ -0,0 +1,39 @@
+/*
+* 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/SectionPairRowListValueValidator.hpp>
+#include <ls-std/io/section-pair/validator/SectionPairRowSingleValueValidator.hpp>
+#include <ls-std/io/section-pair/validator/SectionPairRowValidator.hpp>
+#include <regex>
+
+ls::std::io::SectionPairRowValidator::SectionPairRowValidator(::std::string _row) : ls::std::core::Class("SectionPairRowValidator"), row(::std::move(_row))
+{}
+
+ls::std::io::SectionPairRowValidator::~SectionPairRowValidator() = default;
+
+::std::string ls::std::io::SectionPairRowValidator::getValidationRegex()
+{
+  return ls::std::io::SectionPairRowValidator::_getValidationRegex();
+}
+
+bool ls::std::io::SectionPairRowValidator::isValid()
+{
+  ::std::string validationRegex = ls::std::io::SectionPairRowValidator::_getValidationRegex();
+  static ::std::regex sectionPairRowRegex = ::std::regex{R"(^()" + validationRegex + R"())"};
+
+  return ::std::regex_match(this->row, sectionPairRowRegex);
+}
+
+::std::string ls::std::io::SectionPairRowValidator::_getValidationRegex()
+{
+  ::std::string listValueRowRegex = ls::std::io::SectionPairRowListValueValidator::getValidationRegex();
+  ::std::string singleValueRowRegex = ls::std::io::SectionPairRowSingleValueValidator::getValidationRegex();
+
+  return R"(()" + singleValueRowRegex + R"()|()" + listValueRowRegex + R"())";
+}

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

@@ -50,12 +50,12 @@ namespace
 
   TEST_F(SectionPairRowListValueValidatorTest, getClassName)
   {
-    ASSERT_STREQ("SectionPairRowListValueValidator", SectionPairRowListValueValidator{"tmp-key"}.getClassName().c_str());
+    ASSERT_STREQ("SectionPairRowListValueValidator", SectionPairRowListValueValidator{"empty"}.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 expected = R"(((((([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})))*)))";
     string actual = SectionPairRowListValueValidator::getValidationRegex();
 
     ASSERT_STREQ(expected.c_str(), actual.c_str());

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

@@ -50,7 +50,13 @@ namespace
 
   TEST_F(SectionPairRowSingleValueValidatorTest, getClassName)
   {
-    ASSERT_STREQ("SectionPairRowSingleValueValidator", SectionPairRowSingleValueValidator{"tmp-key"}.getClassName().c_str());
+    ASSERT_STREQ("SectionPairRowSingleValueValidator", SectionPairRowSingleValueValidator{"empty"}.getClassName().c_str());
+  }
+
+  TEST_F(SectionPairRowSingleValueValidatorTest, getValidationRegex)
+  {
+    ::std::string expected = R"(([a-z]([a-z0-9-]){1,15})={1}([a-zA-Z0-9\-_#!?\[\]\{\}\(\)\$ۤ<>+:;., \*\/"]{1,32}){1}($|\n{1}|\r{1}\n{1}))";
+    ASSERT_STREQ(expected.c_str(), SectionPairRowSingleValueValidator::getValidationRegex().c_str());
   }
 
   TEST_P(SectionPairRowSingleValueValidatorTest_ValidArgumentTest, isValid)

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

@@ -0,0 +1,74 @@
+/*
+* 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/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 SectionPairRowValidatorTest : public ::testing::Test
+  {
+    protected:
+
+      SectionPairRowValidatorTest() = default;
+      ~SectionPairRowValidatorTest() override = default;
+
+      void SetUp() override
+      {}
+
+      void TearDown() override
+      {}
+  };
+
+  class SectionPairRowValidatorTest_ValidArgumentTest : public ::testing::TestWithParam<string>
+  {
+    protected:
+
+      SectionPairRowValidatorTest_ValidArgumentTest() = default;
+      ~SectionPairRowValidatorTest_ValidArgumentTest() override = default;
+  };
+
+  class SectionPairRowValidatorTest_InvalidArgumentTest : public ::testing::TestWithParam<string>
+  {
+    protected:
+
+      SectionPairRowValidatorTest_InvalidArgumentTest() = default;
+      ~SectionPairRowValidatorTest_InvalidArgumentTest() override = default;
+  };
+
+  TEST_F(SectionPairRowValidatorTest, getClassName)
+  {
+    ASSERT_STREQ("SectionPairRowValidator", SectionPairRowValidator{"empty"}.getClassName().c_str());
+  }
+
+  TEST_F(SectionPairRowValidatorTest, getValidationRegex)
+  {
+    ::std::string expected = R"((([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(), SectionPairRowValidator::getValidationRegex().c_str());
+  }
+
+  TEST_P(SectionPairRowValidatorTest_ValidArgumentTest, isValid)
+  {
+    ASSERT_TRUE(SectionPairRowValidator{GetParam()}.isValid());
+  }
+
+  TEST_P(SectionPairRowValidatorTest_InvalidArgumentTest, isValid_not_valid)
+  {
+    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(InvalidArgumentTest, SectionPairRowValidatorTest_InvalidArgumentTest, ::testing::Values("color blue", "a row\nand so on"));
+}

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

@@ -50,7 +50,7 @@ namespace
 
   TEST_F(SectionPairValueValidatorTest, getClassName)
   {
-    ASSERT_STREQ("SectionPairValueValidator", SectionPairValueValidator{"any value"}.getClassName().c_str());
+    ASSERT_STREQ("SectionPairValueValidator", SectionPairValueValidator{"empty"}.getClassName().c_str());
   }
 
   TEST_F(SectionPairValueValidatorTest, getValidationRegex)