Browse Source

Reduce complexity of SectionPairIdentifierValidator

Patrick-Christopher Mattulat 2 years ago
parent
commit
66f4d0a9f2

+ 4 - 1
include/ls-std/io/section-pair/validator/SectionPairIdentifierValidator.hpp

@@ -3,7 +3,7 @@
 * Company:         Lynar Studios
 * E-Mail:          webmaster@lynarstudios.com
 * Created:         2023-02-09
-* Changed:         2023-02-11
+* Changed:         2023-02-18
 *
 * */
 
@@ -25,11 +25,14 @@ namespace ls::std::io
       explicit SectionPairIdentifierValidator(ls::std::io::section_pair_identifier _identifier);
       ~SectionPairIdentifierValidator() override;
 
+      [[nodiscard]] static ::std::string getValidationRegex();
       [[nodiscard]] bool isValid() override;
 
     private:
 
       ls::std::io::section_pair_identifier identifier{};
+
+      [[nodiscard]] static ::std::string _getValidationRegex();
   };
 }
 

+ 13 - 11
source/ls-std/io/section-pair/validator/SectionPairIdentifierValidator.cpp

@@ -3,28 +3,30 @@
 * Company:         Lynar Studios
 * E-Mail:          webmaster@lynarstudios.com
 * Created:         2023-02-09
-* Changed:         2023-02-11
+* Changed:         2023-02-18
 *
 * */
 
 #include <ls-std/io/section-pair/validator/SectionPairIdentifierValidator.hpp>
+#include <regex>
 
 ls::std::io::SectionPairIdentifierValidator::SectionPairIdentifierValidator(ls::std::io::section_pair_identifier _identifier) : ls::std::core::Class("SectionPairIdentifierValidator"), identifier(::std::move(_identifier))
 {}
 
 ls::std::io::SectionPairIdentifierValidator::~SectionPairIdentifierValidator() = default;
 
-bool ls::std::io::SectionPairIdentifierValidator::isValid()
+::std::string ls::std::io::SectionPairIdentifierValidator::getValidationRegex()
 {
-  bool startsWithValidCharacter{}, containsValidCharacters{}, doesNotExceedMaxSize{};
+  return ls::std::io::SectionPairIdentifierValidator::_getValidationRegex();
+}
 
-  if (!this->identifier.empty())
-  {
-    size_t foundPosition = this->identifier.find_first_not_of("abcdefghijklmnopqrstuvwxyz-0123456789");
-    startsWithValidCharacter = ls::std::io::section_pair_identifier{this->identifier[0]}.find_first_not_of("abcdefghijklmnopqrstuvwxyz") == ::std::string::npos;
-    containsValidCharacters = foundPosition == ls::std::io::section_pair_identifier::npos;
-    doesNotExceedMaxSize = this->identifier.size() <= 16;
-  }
+bool ls::std::io::SectionPairIdentifierValidator::isValid()
+{
+  static ::std::regex identifierRegex("^" + ls::std::io::SectionPairIdentifierValidator::_getValidationRegex());
+  return ::std::regex_match(this->identifier, identifierRegex);
+}
 
-  return startsWithValidCharacter && containsValidCharacters && doesNotExceedMaxSize;
+::std::string ls::std::io::SectionPairIdentifierValidator::_getValidationRegex()
+{
+  return R"([a-z]([a-z0-9-]){1,15})";
 }

+ 30 - 13
test/cases/io/section-pair/validator/SectionPairIdentifierValidatorTest.cpp

@@ -3,13 +3,14 @@
 * Company:         Lynar Studios
 * E-Mail:          webmaster@lynarstudios.com
 * Created:         2023-02-09
-* Changed:         2023-02-11
+* Changed:         2023-02-18
 *
 * */
 
 #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;
@@ -31,26 +32,42 @@ namespace
       {}
   };
 
+  class SectionPairIdentifierValidatorIsValidTest : public ::testing::TestWithParam<string>
+  {
+    protected:
+
+      SectionPairIdentifierValidatorIsValidTest() = default;
+      ~SectionPairIdentifierValidatorIsValidTest() override = default;
+  };
+
+  class SectionPairIdentifierValidatorIsNotValidTest : public ::testing::TestWithParam<string>
+  {
+    protected:
+
+      SectionPairIdentifierValidatorIsNotValidTest() = default;
+      ~SectionPairIdentifierValidatorIsNotValidTest() override = default;
+  };
+
   TEST_F(SectionPairIdentifierValidatorTest, getClassName)
   {
     ASSERT_STREQ("SectionPairIdentifierValidator", SectionPairIdentifierValidator{"tmp-key"}.getClassName().c_str());
   }
 
-  TEST_F(SectionPairIdentifierValidatorTest, isValid)
+  TEST_F(SectionPairIdentifierValidatorTest, getValidationRegex)
   {
-    ASSERT_TRUE(SectionPairIdentifierValidator{"color"}.isValid());
-    ASSERT_TRUE(SectionPairIdentifierValidator{"favourite-color"}.isValid());
-    ASSERT_TRUE(SectionPairIdentifierValidator{"age"}.isValid());
-    ASSERT_TRUE(SectionPairIdentifierValidator{"name"}.isValid());
+    ASSERT_STREQ(R"([a-z]([a-z0-9-]){1,15})", SectionPairIdentifierValidator{"tmp-key"}.getValidationRegex().c_str());
   }
 
-  TEST_F(SectionPairIdentifierValidatorTest, isValid_not_valid)
+  TEST_P(SectionPairIdentifierValidatorIsValidTest, isValid)
   {
-    ASSERT_FALSE(SectionPairIdentifierValidator{"_color"}.isValid());
-    ASSERT_FALSE(SectionPairIdentifierValidator{"8color"}.isValid());
-    ASSERT_FALSE(SectionPairIdentifierValidator{"colOr"}.isValid());
-    ASSERT_FALSE(SectionPairIdentifierValidator{"color:"}.isValid());
-    ASSERT_FALSE(SectionPairIdentifierValidator{"-color"}.isValid());
-    ASSERT_FALSE(SectionPairIdentifierValidator{"color-is-valid-but-too-long"}.isValid());
+    ASSERT_TRUE(SectionPairIdentifierValidator{GetParam()}.isValid());
   }
+
+  TEST_P(SectionPairIdentifierValidatorIsNotValidTest, isValid_not_valid)
+  {
+    ASSERT_FALSE(SectionPairIdentifierValidator{GetParam()}.isValid());
+  }
+
+  INSTANTIATE_TEST_SUITE_P(SectionPairIdentifierValidatorTest, SectionPairIdentifierValidatorIsValidTest, ::testing::Values("color", "favourite-color", "age", "name"));
+  INSTANTIATE_TEST_SUITE_P(SectionPairIdentifierValidatorTest, SectionPairIdentifierValidatorIsNotValidTest, ::testing::Values("_color", "8color", "colOr", "color:", "-color", "color-is-valid-but-too-long"));
 }