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()`` 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/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], 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".'], + ]; + } +}