From 8be2c158aa23c9c6365ffdbdaacfea5d7c057859 Mon Sep 17 00:00:00 2001 From: Mateusz Sip Date: Sat, 14 Apr 2018 21:32:38 +0200 Subject: [PATCH 1/3] NotContains expander --- src/Matcher/Pattern/Expander/NotContains.php | 55 +++++++++++++++ .../Pattern/Expander/NotContainsTest.php | 68 +++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 src/Matcher/Pattern/Expander/NotContains.php create mode 100644 tests/Matcher/Pattern/Expander/NotContainsTest.php diff --git a/src/Matcher/Pattern/Expander/NotContains.php b/src/Matcher/Pattern/Expander/NotContains.php new file mode 100644 index 00000000..ccdb36b8 --- /dev/null +++ b/src/Matcher/Pattern/Expander/NotContains.php @@ -0,0 +1,55 @@ +string = $string; + $this->ignoreCase = $ignoreCase; + } + + public function match($value) : bool + { + if (!\is_string($value)) { + $this->error = \sprintf('Not contains expander require "string", got "%s".', new StringConverter($value)); + return false; + } + + $contains = $this->ignoreCase + ? \mb_stripos($value, $this->string) + : \mb_strpos($value, $this->string); + + if ($contains !== false) { + $this->error = \sprintf("String \"%s\" contains \"%s\".", $value, $this->string); + + return false; + } + + return true; + } + + public function getError() + { + return $this->error; + } +} diff --git a/tests/Matcher/Pattern/Expander/NotContainsTest.php b/tests/Matcher/Pattern/Expander/NotContainsTest.php new file mode 100644 index 00000000..1dfdfef4 --- /dev/null +++ b/tests/Matcher/Pattern/Expander/NotContainsTest.php @@ -0,0 +1,68 @@ +assertEquals($expectedResult, $expander->match($haystack)); + } + + public static function examplesCaseSensitiveProvider() + { + return [ + ['ipsum', 'lorem ipsum', false], + ['wor', 'this is my hello world string', false], + ['lol', 'lorem ipsum', true], + ['NO', 'norbert', true] + ]; + } + + /** + * @dataProvider examplesCaseInsensitiveProvider + */ + public function test_matching_values_case_insensitive($needle, $haystack, $expectedResult) + { + $expander = new NotContains($needle, true); + $this->assertEquals($expectedResult, $expander->match($haystack)); + } + + public static function examplesCaseInsensitiveProvider() + { + return [ + ['IpSum', 'lorem ipsum', false], + ['wor', 'this is my hello WORLD string', false], + ['lol', 'LOREM ipsum', true], + ['NO', 'NORBERT', false] + ]; + } + + /** + * @dataProvider invalidCasesProvider + */ + public function test_error_when_matching_fail($string, $value, $errorMessage) + { + $expander = new NotContains($string); + $this->assertFalse($expander->match($value)); + $this->assertEquals($errorMessage, $expander->getError()); + } + + public static function invalidCasesProvider() + { + return [ + ['ipsum', 'lorem ipsum', "String \"lorem ipsum\" contains \"ipsum\"."], + ['lorem', new \DateTime(), 'Not contains expander require "string", got "\\DateTime".'], + ]; + } +} From e57b8e613de572cc4694e1733004e641cd0336a2 Mon Sep 17 00:00:00 2001 From: Mateusz Sip Date: Sat, 14 Apr 2018 21:33:01 +0200 Subject: [PATCH 2/3] More descritpive ContainsTest methods names --- tests/Matcher/Pattern/Expander/ContainsTest.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/Matcher/Pattern/Expander/ContainsTest.php b/tests/Matcher/Pattern/Expander/ContainsTest.php index f0113751..6557c7d0 100644 --- a/tests/Matcher/Pattern/Expander/ContainsTest.php +++ b/tests/Matcher/Pattern/Expander/ContainsTest.php @@ -10,15 +10,15 @@ class ContainsTest extends TestCase { /** - * @dataProvider examplesIgnoreCaseProvider + * @dataProvider examplesCaseSensitiveProvider */ - public function test_matching_values_ignore_case($needle, $haystack, $expectedResult) + public function test_matching_values_case_sensitive($needle, $haystack, $expectedResult) { $expander = new Contains($needle); $this->assertEquals($expectedResult, $expander->match($haystack)); } - public static function examplesIgnoreCaseProvider() + public static function examplesCaseSensitiveProvider() { return [ ['ipsum', 'lorem ipsum', true], @@ -29,15 +29,15 @@ public static function examplesIgnoreCaseProvider() } /** - * @dataProvider examplesProvider + * @dataProvider examplesCaseInsensitiveProvider */ - public function test_matching_values($needle, $haystack, $expectedResult) + public function test_matching_values_case_insensitive($needle, $haystack, $expectedResult) { $expander = new Contains($needle, true); $this->assertEquals($expectedResult, $expander->match($haystack)); } - public static function examplesProvider() + public static function examplesCaseInsensitiveProvider() { return [ ['IpSum', 'lorem ipsum', true], From d73101a0e98b322606c96b8a19230d99f2a0946d Mon Sep 17 00:00:00 2001 From: Mateusz Sip Date: Sat, 14 Apr 2018 21:34:39 +0200 Subject: [PATCH 3/3] documented existence of notContains expander --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 4d8a44ad..906bce47 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,7 @@ $matcher->getError(); // returns null or error message * ``startsWith($stringBeginning, $ignoreCase = false)`` * ``endsWith($stringEnding, $ignoreCase = false)`` * ``contains($string, $ignoreCase = false)`` +* ``notContains($string, $ignoreCase = false)`` * ``isDateTime()`` * ``isEmail()`` * ``isUrl()``