diff --git a/src/Backtrace.php b/src/Backtrace.php new file mode 100644 index 00000000..fa339a58 --- /dev/null +++ b/src/Backtrace.php @@ -0,0 +1,84 @@ +trace = []; + } + + public function matcherCanMatch(string $name, $value, bool $result) : void + { + $this->trace[] = \sprintf( + '#%d Matcher %s %s match pattern "%s"', + $this->entriesCount(), + $name, + $result ? 'can' : 'can\'t', + new SingleLineString((string) new StringConverter($value)) + ); + } + + public function matcherEntrance(string $name, $value, $pattern) : void + { + $this->trace[] = \sprintf( + '#%d Matcher %s matching value "%s" with "%s" pattern', + $this->entriesCount(), + $name, + new SingleLineString((string) new StringConverter($value)), + new SingleLineString((string) new StringConverter($pattern)) + ); + } + + public function matcherSucceed(string $name, $value, $pattern) : void + { + $this->trace[] = \sprintf( + '#%d Matcher %s successfully matched value "%s" with "%s" pattern', + $this->entriesCount(), + $name, + new SingleLineString((string) new StringConverter($value)), + new SingleLineString((string) new StringConverter($pattern)) + ); + } + + public function matcherFailed(string $name, $value, $pattern, string $error) : void + { + $this->trace[] = \sprintf( + '#%d Matcher %s failed to match value "%s" with "%s" pattern', + $this->entriesCount(), + $name, + new SingleLineString((string) new StringConverter($value)), + new SingleLineString((string) new StringConverter($pattern)) + ); + + $this->trace[] = \sprintf( + '#%d Matcher %s error: %s', + $this->entriesCount(), + $name, + new SingleLineString($error) + ); + } + + public function __toString() : string + { + return \implode("\n", $this->trace); + } + + public function raw() : array + { + return $this->trace; + } + + private function entriesCount(): int + { + return \count($this->trace) + 1; + } +} diff --git a/src/Factory.php b/src/Factory.php index 1f8c8ee6..50e0a38a 100644 --- a/src/Factory.php +++ b/src/Factory.php @@ -6,5 +6,5 @@ interface Factory { - public function createMatcher() : Matcher; + public function createMatcher(Backtrace $backtrace = null) : Matcher; } diff --git a/src/Factory/MatcherFactory.php b/src/Factory/MatcherFactory.php index bd6c8254..d0ac5f35 100644 --- a/src/Factory/MatcherFactory.php +++ b/src/Factory/MatcherFactory.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Factory; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Factory; use Coduo\PHPMatcher\Lexer; use Coduo\PHPMatcher\Matcher; @@ -11,15 +12,17 @@ final class MatcherFactory implements Factory { - public function createMatcher() : Matcher + public function createMatcher(Backtrace $backtrace = null) : Matcher { - return new Matcher($this->buildMatchers($this->buildParser())); + $matcherBacktrace = $backtrace ? $backtrace : new Backtrace(); + + return new Matcher($this->buildMatchers($this->buildParser(), $matcherBacktrace), $matcherBacktrace); } - protected function buildMatchers(Parser $parser) : Matcher\ChainMatcher + protected function buildMatchers(Parser $parser, Backtrace $backtrace) : Matcher\ChainMatcher { - $scalarMatchers = $this->buildScalarMatchers($parser); - $arrayMatcher = $this->buildArrayMatcher($scalarMatchers, $parser); + $scalarMatchers = $this->buildScalarMatchers($parser, $backtrace); + $arrayMatcher = $this->buildArrayMatcher($scalarMatchers, $parser, $backtrace); // Matchers are registered in order of matching // 1) all scalars @@ -28,48 +31,61 @@ protected function buildMatchers(Parser $parser) : Matcher\ChainMatcher // 4) or "||" // 5) full text - $chainMatcher = new Matcher\ChainMatcher([ - $scalarMatchers, - new Matcher\JsonMatcher($arrayMatcher), - new Matcher\XmlMatcher($arrayMatcher), - $arrayMatcher, - new Matcher\OrMatcher($scalarMatchers), - new Matcher\TextMatcher($scalarMatchers, $parser), - ]); + $chainMatcher = new Matcher\ChainMatcher( + 'all', + $backtrace, + [ + $scalarMatchers, + new Matcher\JsonMatcher($arrayMatcher, $backtrace), + new Matcher\XmlMatcher($arrayMatcher, $backtrace), + $arrayMatcher, + new Matcher\OrMatcher($backtrace, $scalarMatchers), + new Matcher\TextMatcher($scalarMatchers, $backtrace, $parser), + ] + ); return $chainMatcher; } - protected function buildArrayMatcher(Matcher\ChainMatcher $scalarMatchers, Parser $parser) : Matcher\ArrayMatcher + protected function buildArrayMatcher(Matcher\ChainMatcher $scalarMatchers, Parser $parser, Backtrace $backtrace) : Matcher\ArrayMatcher { - $orMatcher = new Matcher\OrMatcher($scalarMatchers); + $orMatcher = new Matcher\OrMatcher($backtrace, $scalarMatchers); return new Matcher\ArrayMatcher( - new Matcher\ChainMatcher([ - $orMatcher, - $scalarMatchers, - new Matcher\TextMatcher($scalarMatchers, $parser) - ]), + new Matcher\ChainMatcher( + 'array', + $backtrace, + [ + $orMatcher, + $scalarMatchers, + new Matcher\TextMatcher($scalarMatchers, $backtrace, $parser) + ] + ), + $backtrace, $parser ); } - protected function buildScalarMatchers(Parser $parser) : Matcher\ChainMatcher + protected function buildScalarMatchers(Parser $parser, Backtrace $backtrace) : Matcher\ChainMatcher { - return new Matcher\ChainMatcher([ - new Matcher\CallbackMatcher(), - new Matcher\ExpressionMatcher(), - new Matcher\NullMatcher(), - new Matcher\StringMatcher($parser), - new Matcher\IntegerMatcher($parser), - new Matcher\BooleanMatcher($parser), - new Matcher\DoubleMatcher($parser), - new Matcher\NumberMatcher($parser), - new Matcher\ScalarMatcher(), - new Matcher\WildcardMatcher(), - new Matcher\UuidMatcher($parser), - new Matcher\JsonObjectMatcher($parser) - ]); + return new Matcher\ChainMatcher( + 'scalars', + $backtrace, + [ + new Matcher\CallbackMatcher($backtrace), + new Matcher\ExpressionMatcher($backtrace), + new Matcher\NullMatcher($backtrace), + new Matcher\StringMatcher($backtrace, $parser), + new Matcher\IntegerMatcher($backtrace, $parser), + new Matcher\BooleanMatcher($backtrace, $parser), + new Matcher\DoubleMatcher($backtrace, $parser), + new Matcher\NumberMatcher($backtrace, $parser), + new Matcher\ScalarMatcher($backtrace), + new Matcher\WildcardMatcher($backtrace), + new Matcher\UuidMatcher($backtrace, $parser), + new Matcher\JsonObjectMatcher($backtrace, $parser) + ] + ); } protected function buildParser() : Parser diff --git a/src/Factory/SimpleFactory.php b/src/Factory/SimpleFactory.php index 5248030e..b3b7c675 100644 --- a/src/Factory/SimpleFactory.php +++ b/src/Factory/SimpleFactory.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Factory; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Factory; use Coduo\PHPMatcher\Matcher; @@ -12,7 +13,7 @@ */ class SimpleFactory implements Factory { - public function createMatcher() : Matcher + public function createMatcher(Backtrace $backtrace = null) : Matcher { return (new MatcherFactory())->createMatcher(); } diff --git a/src/Matcher.php b/src/Matcher.php index ae0eedcc..6a521d81 100644 --- a/src/Matcher.php +++ b/src/Matcher.php @@ -8,19 +8,27 @@ final class Matcher { - private $matcher; + private $valueMatcher; - public function __construct(ValueMatcher $matcher) + private $backtrace; + + public function __construct(ValueMatcher $valueMatcher, Backtrace $backtrace) { - $this->matcher = $matcher; + $this->valueMatcher = $valueMatcher; + $this->backtrace = $backtrace; } public function match($value, $pattern) : bool { - $result = $this->matcher->match($value, $pattern); + $this->backtrace->matcherEntrance(self::class, $value, $pattern); + + $result = $this->valueMatcher->match($value, $pattern); if ($result === true) { - $this->matcher->clearError(); + $this->backtrace->matcherSucceed(self::class, $value, $pattern); + $this->valueMatcher->clearError(); + } else { + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->valueMatcher->getError()); } return $result; @@ -31,6 +39,11 @@ public function match($value, $pattern) : bool */ public function getError() : ?string { - return $this->matcher->getError(); + return $this->valueMatcher->getError(); + } + + public function backtrace(): Backtrace + { + return $this->backtrace; } } diff --git a/src/Matcher/ArrayMatcher.php b/src/Matcher/ArrayMatcher.php index 882906d2..01f0c919 100644 --- a/src/Matcher/ArrayMatcher.php +++ b/src/Matcher/ArrayMatcher.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Exception\Exception; use Coduo\PHPMatcher\Parser; use Coduo\ToString\StringConverter; @@ -18,25 +19,31 @@ final class ArrayMatcher extends Matcher const UNIVERSAL_KEY = '@*@'; private $propertyMatcher; - private $accessor; - private $parser; + private $backtrace; - public function __construct(ValueMatcher $propertyMatcher, Parser $parser) + public function __construct(ValueMatcher $propertyMatcher, Backtrace $backtrace, Parser $parser) { $this->propertyMatcher = $propertyMatcher; $this->parser = $parser; + $this->backtrace = $backtrace; } public function match($value, $pattern) : bool { + $this->backtrace->matcherEntrance(self::class, $value, $pattern); + if (parent::match($value, $pattern)) { + $this->backtrace->matcherSucceed(self::class, $value, $pattern); + return true; } if (!\is_array($value)) { $this->error = \sprintf('%s "%s" is not a valid array.', \gettype($value), new StringConverter($value)); + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); + return false; } @@ -45,9 +52,13 @@ public function match($value, $pattern) : bool } if (false === $this->iterateMatch($value, $pattern)) { + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); + return false; } + $this->backtrace->matcherSucceed(self::class, $value, $pattern); + return true; } @@ -247,9 +258,13 @@ private function allExpandersMatch($value, $pattern) : bool $typePattern = $this->parser->parse($pattern); if (!$typePattern->matchExpanders($value)) { $this->error = $typePattern->getError(); + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); + return false; } + $this->backtrace->matcherSucceed(self::class, $value, $pattern); + return true; } } diff --git a/src/Matcher/BooleanMatcher.php b/src/Matcher/BooleanMatcher.php index a5bd54b3..5d779e44 100644 --- a/src/Matcher/BooleanMatcher.php +++ b/src/Matcher/BooleanMatcher.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Parser; use Coduo\ToString\StringConverter; @@ -11,29 +12,42 @@ final class BooleanMatcher extends Matcher { const PATTERN = 'boolean'; + private $backtrace; private $parser; - public function __construct(Parser $parser) + public function __construct(Backtrace $backtrace, Parser $parser) { $this->parser = $parser; + $this->backtrace = $backtrace; } public function match($value, $pattern) : bool { + $this->backtrace->matcherEntrance(self::class, $value, $pattern); + if (!\is_bool($value)) { $this->error = \sprintf('%s "%s" is not a valid boolean.', \gettype($value), new StringConverter($value)); + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); + return false; } + $this->backtrace->matcherSucceed(self::class, $value, $pattern); + return true; } public function canMatch($pattern) : bool { if (!\is_string($pattern)) { + $this->backtrace->matcherCanMatch(self::class, $pattern, false); + return false; } - return $this->parser->hasValidSyntax($pattern) && $this->parser->parse($pattern)->is(self::PATTERN); + $result = $this->parser->hasValidSyntax($pattern) && $this->parser->parse($pattern)->is(self::PATTERN); + $this->backtrace->matcherCanMatch(self::class, $pattern, $result); + + return $result; } } diff --git a/src/Matcher/CallbackMatcher.php b/src/Matcher/CallbackMatcher.php index 91a1f00d..0cb1f011 100644 --- a/src/Matcher/CallbackMatcher.php +++ b/src/Matcher/CallbackMatcher.php @@ -4,15 +4,41 @@ namespace Coduo\PHPMatcher\Matcher; +use Coduo\PHPMatcher\Backtrace; +use Coduo\ToString\StringConverter; + final class CallbackMatcher extends Matcher { + /** + * @var Backtrace + */ + private $backtrace; + + public function __construct(Backtrace $backtrace) + { + $this->backtrace = $backtrace; + } + public function match($value, $pattern) : bool { - return (boolean) $pattern->__invoke($value); + $this->backtrace->matcherEntrance(self::class, $value, $pattern); + $result = (boolean) $pattern->__invoke($value); + + if ($result) { + $this->backtrace->matcherSucceed(self::class, $value, $pattern); + } else { + $this->error = \sprintf('Callback matcher failed for value %s', new StringConverter($value)); + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); + } + + return $result; } public function canMatch($pattern) : bool { - return \is_object($pattern) && \is_callable($pattern); + $result = \is_object($pattern) && \is_callable($pattern); + $this->backtrace->matcherCanMatch(self::class, $pattern, $result); + + return $result; } } diff --git a/src/Matcher/ChainMatcher.php b/src/Matcher/ChainMatcher.php index 52280116..75f4e88b 100644 --- a/src/Matcher/ChainMatcher.php +++ b/src/Matcher/ChainMatcher.php @@ -4,33 +4,35 @@ namespace Coduo\PHPMatcher\Matcher; +use Coduo\PHPMatcher\Backtrace; +use Coduo\PHPMatcher\Value\SingleLineString; use Coduo\ToString\StringConverter; final class ChainMatcher extends Matcher { - /** - * @var ValueMatcher[] - */ + private $name; + private $backtrace; private $matchers; /** + * @param Backtrace $backtrace * @param ValueMatcher[] $matchers */ - public function __construct(array $matchers = []) + public function __construct(string $name, Backtrace $backtrace, array $matchers = []) { + $this->backtrace = $backtrace; $this->matchers = $matchers; - } - - public function addMatcher(ValueMatcher $matcher) - { - $this->matchers[] = $matcher; + $this->name = $name; } public function match($value, $pattern) : bool { + $this->backtrace->matcherEntrance($this->matcherName(), $value, $pattern); + foreach ($this->matchers as $propertyMatcher) { if ($propertyMatcher->canMatch($pattern)) { if (true === $propertyMatcher->match($value, $pattern)) { + $this->backtrace->matcherSucceed($this->matcherName(), $value, $pattern); return true; } @@ -41,16 +43,28 @@ public function match($value, $pattern) : bool if (!isset($this->error)) { $this->error = \sprintf( 'Any matcher from chain can\'t match value "%s" to pattern "%s"', - new StringConverter($value), - new StringConverter($pattern) + new SingleLineString((string) new StringConverter($value)), + new SingleLineString((string) new StringConverter($pattern)) ); } + $this->backtrace->matcherFailed($this->matcherName(), $value, $pattern, $this->error); + return false; } public function canMatch($pattern) : bool { + $this->backtrace->matcherCanMatch($this->matcherName(), $pattern, true); + return true; } + + /** + * @return string + */ + private function matcherName(): string + { + return \sprintf('%s (%s)', self::class, $this->name); + } } diff --git a/src/Matcher/DoubleMatcher.php b/src/Matcher/DoubleMatcher.php index 4837a769..da0431ce 100644 --- a/src/Matcher/DoubleMatcher.php +++ b/src/Matcher/DoubleMatcher.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Parser; use Coduo\ToString\StringConverter; @@ -11,35 +12,50 @@ final class DoubleMatcher extends Matcher { const PATTERN = 'double'; + private $backtrace; private $parser; - public function __construct(Parser $parser) + public function __construct(Backtrace $backtrace, Parser $parser) { $this->parser = $parser; + $this->backtrace = $backtrace; } public function match($value, $pattern) : bool { + $this->backtrace->matcherEntrance(self::class, $value, $pattern); + if (!\is_double($value)) { $this->error = \sprintf('%s "%s" is not a valid double.', \gettype($value), new StringConverter($value)); + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); + return false; } $typePattern = $this->parser->parse($pattern); if (!$typePattern->matchExpanders($value)) { $this->error = $typePattern->getError(); + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); + return false; } + $this->backtrace->matcherSucceed(self::class, $value, $pattern); + return true; } public function canMatch($pattern) : bool { if (!\is_string($pattern)) { + $this->backtrace->matcherCanMatch(self::class, $pattern, false); + return false; } - return $this->parser->hasValidSyntax($pattern) && $this->parser->parse($pattern)->is(self::PATTERN); + $result = $this->parser->hasValidSyntax($pattern) && $this->parser->parse($pattern)->is(self::PATTERN); + $this->backtrace->matcherCanMatch(self::class, $pattern, $result); + + return $result; } } diff --git a/src/Matcher/ExpressionMatcher.php b/src/Matcher/ExpressionMatcher.php index a7ba9747..3cc85206 100644 --- a/src/Matcher/ExpressionMatcher.php +++ b/src/Matcher/ExpressionMatcher.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\ToString\StringConverter; use Symfony\Component\ExpressionLanguage\ExpressionLanguage; @@ -11,21 +12,38 @@ final class ExpressionMatcher extends Matcher { const MATCH_PATTERN = "/^expr\((.*?)\)$/"; + private $backtrace; + + public function __construct(Backtrace $backtrace) + { + $this->backtrace = $backtrace; + } + public function match($value, $pattern) : bool { + $this->backtrace->matcherEntrance(self::class, $value, $pattern); + $language = new ExpressionLanguage(); \preg_match(self::MATCH_PATTERN, $pattern, $matches); $expressionResult = $language->evaluate($matches[1], ['value' => $value]); if (!$expressionResult) { $this->error = \sprintf('"%s" expression fails for value "%s".', $pattern, new StringConverter($value)); - } + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); + + return false; + } else { + $this->backtrace->matcherSucceed(self::class, $value, $pattern); - return (bool) $expressionResult; + return true; + } } public function canMatch($pattern) : bool { - return \is_string($pattern) && 0 !== \preg_match(self::MATCH_PATTERN, $pattern); + $result = \is_string($pattern) && 0 !== \preg_match(self::MATCH_PATTERN, $pattern); + $this->backtrace->matcherCanMatch(self::class, $pattern, $result); + + return $result; } } diff --git a/src/Matcher/IntegerMatcher.php b/src/Matcher/IntegerMatcher.php index bbb56630..6f6b29b2 100644 --- a/src/Matcher/IntegerMatcher.php +++ b/src/Matcher/IntegerMatcher.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Parser; use Coduo\ToString\StringConverter; @@ -11,35 +12,49 @@ final class IntegerMatcher extends Matcher { const PATTERN = 'integer'; + private $backtrace; private $parser; - public function __construct(Parser $parser) + public function __construct(Backtrace $backtrace, Parser $parser) { + $this->backtrace = $backtrace; $this->parser = $parser; } public function match($value, $pattern) : bool { + $this->backtrace->matcherEntrance(self::class, $value, $pattern); + if (!\is_integer($value)) { $this->error = \sprintf('%s "%s" is not a valid integer.', \gettype($value), new StringConverter($value)); + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); return false; } $typePattern = $this->parser->parse($pattern); + if (!$typePattern->matchExpanders($value)) { $this->error = $typePattern->getError(); + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); return false; } + $this->backtrace->matcherSucceed(self::class, $value, $pattern); + return true; } public function canMatch($pattern) : bool { if (!\is_string($pattern)) { + $this->backtrace->matcherCanMatch(self::class, $pattern, false); + return false; } - return $this->parser->hasValidSyntax($pattern) && $this->parser->parse($pattern)->is(self::PATTERN); + $result = $this->parser->hasValidSyntax($pattern) && $this->parser->parse($pattern)->is(self::PATTERN); + $this->backtrace->matcherCanMatch(self::class, $pattern, $result); + + return $result; } } diff --git a/src/Matcher/JsonMatcher.php b/src/Matcher/JsonMatcher.php index f946b88f..7b3930b4 100644 --- a/src/Matcher/JsonMatcher.php +++ b/src/Matcher/JsonMatcher.php @@ -4,31 +4,43 @@ namespace Coduo\PHPMatcher\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Matcher\Pattern\Assert\Json; +use Coduo\PHPMatcher\Value\SingleLineString; use Coduo\ToString\StringConverter; final class JsonMatcher extends Matcher { private $arrayMatcher; + private $backtrace; - public function __construct(ArrayMatcher $arrayMatcher) + public function __construct(ArrayMatcher $arrayMatcher, Backtrace $backtrace) { $this->arrayMatcher = $arrayMatcher; + $this->backtrace = $backtrace; } public function match($value, $pattern) : bool { + $this->backtrace->matcherEntrance(self::class, $value, $pattern); + if (parent::match($value, $pattern)) { + $this->backtrace->matcherSucceed(self::class, $value, $pattern); + return true; } if (!Json::isValid($value)) { $this->error = \sprintf('Invalid given JSON of value. %s', Json::getErrorMessage()); + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); + return false; } if (!Json::isValidPattern($pattern)) { $this->error = \sprintf('Invalid given JSON of pattern. %s', Json::getErrorMessage()); + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); + return false; } @@ -39,18 +51,25 @@ public function match($value, $pattern) : bool if (!$match) { $this->error = \sprintf( 'Value %s does not match pattern %s', - new StringConverter($value), - new StringConverter($pattern) + new SingleLineString((string) new StringConverter($value)), + new SingleLineString((string) new StringConverter($transformedPattern)) ); + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); + return false; } + $this->backtrace->matcherSucceed(self::class, $value, $pattern); + return true; } public function canMatch($pattern) : bool { - return Json::isValidPattern($pattern); + $result = Json::isValidPattern($pattern); + $this->backtrace->matcherCanMatch(self::class, $pattern, $result); + + return $result; } } diff --git a/src/Matcher/JsonObjectMatcher.php b/src/Matcher/JsonObjectMatcher.php index 499b8b32..83a99758 100644 --- a/src/Matcher/JsonObjectMatcher.php +++ b/src/Matcher/JsonObjectMatcher.php @@ -4,28 +4,37 @@ namespace Coduo\PHPMatcher\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Matcher\Pattern\Assert\Json; use Coduo\PHPMatcher\Parser; +use Coduo\ToString\StringConverter; final class JsonObjectMatcher extends Matcher { const JSON_PATTERN = 'json'; + private $backtrace; private $parser; - public function __construct(Parser $parser) + public function __construct(Backtrace $backtrace, Parser $parser) { + $this->backtrace = $backtrace; $this->parser = $parser; } public function match($value, $pattern) : bool { if (!$this->isJsonPattern($pattern)) { + $this->error = \sprintf('%s "%s" is not a valid json.', \gettype($value), new StringConverter($value)); + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); + return false; } if (!Json::isValid($value) && !\is_null($value) && !\is_array($value)) { $this->error = \sprintf('Invalid given JSON of value. %s', Json::getErrorMessage()); + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); + return false; } @@ -33,12 +42,17 @@ public function match($value, $pattern) : bool return $this->allExpandersMatch($value, $pattern); } + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); + return false; } public function canMatch($pattern) : bool { - return \is_string($pattern) && $this->isJsonPattern($pattern); + $result = \is_string($pattern) && $this->isJsonPattern($pattern); + $this->backtrace->matcherCanMatch(self::class, $pattern, $result); + + return $result; } private function isJsonPattern($pattern) @@ -56,9 +70,12 @@ private function allExpandersMatch($value, $pattern) if (!$typePattern->matchExpanders($value)) { $this->error = $typePattern->getError(); + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); return false; } + $this->backtrace->matcherSucceed(self::class, $value, $pattern); + return true; } } diff --git a/src/Matcher/NullMatcher.php b/src/Matcher/NullMatcher.php index eee6569c..9be5e54b 100644 --- a/src/Matcher/NullMatcher.php +++ b/src/Matcher/NullMatcher.php @@ -4,22 +4,36 @@ namespace Coduo\PHPMatcher\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\ToString\StringConverter; final class NullMatcher extends Matcher { const MATCH_PATTERN = '/^@null@$/'; + private $backtrace; + + public function __construct(Backtrace $backtrace) + { + $this->backtrace = $backtrace; + } + /** * {@inheritDoc} */ public function match($value, $pattern) : bool { + $this->backtrace->matcherEntrance(self::class, $value, $pattern); + if (null !== $value) { $this->error = \sprintf('%s "%s" does not match null.', \gettype($value), new StringConverter($value)); + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); + return false; } + $this->backtrace->matcherSucceed(self::class, $value, $pattern); + return true; } @@ -28,6 +42,9 @@ public function match($value, $pattern) : bool */ public function canMatch($pattern) : bool { - return \is_null($pattern) || (\is_string($pattern) && 0 !== \preg_match(self::MATCH_PATTERN, $pattern)); + $result = \is_null($pattern) || (\is_string($pattern) && 0 !== \preg_match(self::MATCH_PATTERN, $pattern)); + $this->backtrace->matcherCanMatch(self::class, $pattern, $result); + + return $result; } } diff --git a/src/Matcher/NumberMatcher.php b/src/Matcher/NumberMatcher.php index 5606c29f..4f7f2253 100644 --- a/src/Matcher/NumberMatcher.php +++ b/src/Matcher/NumberMatcher.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Parser; use Coduo\ToString\StringConverter; @@ -11,29 +12,42 @@ final class NumberMatcher extends Matcher { const PATTERN = 'number'; + private $backtrace; private $parser; - public function __construct(Parser $parser) + public function __construct(Backtrace $backtrace, Parser $parser) { + $this->backtrace = $backtrace; $this->parser = $parser; } public function match($value, $pattern) : bool { + $this->backtrace->matcherEntrance(self::class, $value, $pattern); + if (!\is_numeric($value)) { $this->error = \sprintf('%s "%s" is not a valid number.', \gettype($value), new StringConverter($value)); + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); + return false; } + $this->backtrace->matcherSucceed(self::class, $value, $pattern); + return true; } public function canMatch($pattern) : bool { if (!\is_string($pattern)) { + $this->backtrace->matcherCanMatch(self::class, $pattern, false); + return false; } - return $this->parser->hasValidSyntax($pattern) && $this->parser->parse($pattern)->is(self::PATTERN); + $result = $this->parser->hasValidSyntax($pattern) && $this->parser->parse($pattern)->is(self::PATTERN); + $this->backtrace->matcherCanMatch(self::class, $pattern, $result); + + return $result; } } diff --git a/src/Matcher/OrMatcher.php b/src/Matcher/OrMatcher.php index 00a582b4..b2937855 100644 --- a/src/Matcher/OrMatcher.php +++ b/src/Matcher/OrMatcher.php @@ -4,28 +4,38 @@ namespace Coduo\PHPMatcher\Matcher; +use Coduo\PHPMatcher\Backtrace; + final class OrMatcher extends Matcher { const MATCH_PATTERN = "/\|\|/"; + private $backtrace; private $chainMatcher; - public function __construct(ChainMatcher $chainMatcher) + public function __construct(Backtrace $backtrace, ChainMatcher $chainMatcher) { $this->chainMatcher = $chainMatcher; + $this->backtrace = $backtrace; } public function match($value, $pattern) : bool { + $this->backtrace->matcherEntrance(self::class, $value, $pattern); + $patterns = \explode('||', $pattern); $patterns = \array_map('trim', $patterns); foreach ($patterns as $childPattern) { if ($this->matchChild($value, $childPattern)) { + $this->backtrace->matcherSucceed(self::class, $value, $pattern); + return true; } } + $this->backtrace->matcherFailed(self::class, $value, $pattern, (string) $this->error); + return false; } @@ -44,6 +54,9 @@ private function matchChild($value, $pattern) : bool public function canMatch($pattern): bool { - return \is_string($pattern) && 0 !== \preg_match_all(self::MATCH_PATTERN, $pattern, $matches); + $result = \is_string($pattern) && 0 !== \preg_match_all(self::MATCH_PATTERN, $pattern, $matches); + $this->backtrace->matcherCanMatch(self::class, $pattern, $result); + + return $result; } } diff --git a/src/Matcher/Pattern/Assert/Json.php b/src/Matcher/Pattern/Assert/Json.php index a4df1954..afd6b3ad 100644 --- a/src/Matcher/Pattern/Assert/Json.php +++ b/src/Matcher/Pattern/Assert/Json.php @@ -45,6 +45,11 @@ public static function transformPattern(string $pattern) : string ); } + public static function reformat(string $json) : string + { + return \json_encode(\json_decode($json, true)); + } + public static function getErrorMessage() { switch (\json_last_error()) { diff --git a/src/Matcher/ScalarMatcher.php b/src/Matcher/ScalarMatcher.php index 31e3aafa..93b6120b 100644 --- a/src/Matcher/ScalarMatcher.php +++ b/src/Matcher/ScalarMatcher.php @@ -4,22 +4,44 @@ namespace Coduo\PHPMatcher\Matcher; +use Coduo\PHPMatcher\Backtrace; +use Coduo\PHPMatcher\Value\SingleLineString; use Coduo\ToString\StringConverter; final class ScalarMatcher extends Matcher { + private $backtrace; + + public function __construct(Backtrace $backtrace) + { + $this->backtrace = $backtrace; + } + public function match($value, $pattern) : bool { + $this->backtrace->matcherEntrance(self::class, $value, $pattern); + if ($value !== $pattern) { - $this->error = \sprintf('"%s" does not match "%s".', new StringConverter($value), new StringConverter($pattern)); + $this->error = \sprintf( + '"%s" does not match "%s".', + new SingleLineString((string) new StringConverter($value)), + new SingleLineString((string) new StringConverter($pattern)) + ); + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); + return false; } + $this->backtrace->matcherSucceed(self::class, $value, $pattern); + return true; } public function canMatch($pattern) : bool { - return \is_scalar($pattern); + $result = \is_scalar($pattern); + $this->backtrace->matcherCanMatch(self::class, $pattern, $result); + + return $result; } } diff --git a/src/Matcher/StringMatcher.php b/src/Matcher/StringMatcher.php index 53fd8ca4..c1e12306 100644 --- a/src/Matcher/StringMatcher.php +++ b/src/Matcher/StringMatcher.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Parser; use Coduo\ToString\StringConverter; @@ -11,35 +12,51 @@ final class StringMatcher extends Matcher { const PATTERN = 'string'; + private $backtrace; private $parser; - public function __construct(Parser $parser) + public function __construct(Backtrace $backtrace, Parser $parser) { + $this->backtrace = $backtrace; $this->parser = $parser; } public function match($value, $pattern) : bool { + $this->backtrace->matcherEntrance(self::class, $value, $pattern); + if (!\is_string($value)) { $this->error = \sprintf('%s "%s" is not a valid string.', \gettype($value), new StringConverter($value)); + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); + return false; } $typePattern = $this->parser->parse($pattern); + if (!$typePattern->matchExpanders($value)) { $this->error = $typePattern->getError(); + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); + return false; } + $this->backtrace->matcherSucceed(self::class, $value, $pattern); + return true; } public function canMatch($pattern) : bool { if (!\is_string($pattern)) { + $this->backtrace->matcherCanMatch(self::class, $pattern, false); + return false; } - return $this->parser->hasValidSyntax($pattern) && $this->parser->parse($pattern)->is(self::PATTERN); + $result = $this->parser->hasValidSyntax($pattern) && $this->parser->parse($pattern)->is(self::PATTERN); + $this->backtrace->matcherCanMatch(self::class, $pattern, $result); + + return $result; } } diff --git a/src/Matcher/TextMatcher.php b/src/Matcher/TextMatcher.php index 741ccc20..61fde2c2 100644 --- a/src/Matcher/TextMatcher.php +++ b/src/Matcher/TextMatcher.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Exception\UnknownTypeException; use Coduo\PHPMatcher\Matcher\Pattern\Assert\Json; use Coduo\PHPMatcher\Matcher\Pattern\Assert\Xml; @@ -18,23 +19,14 @@ final class TextMatcher extends Matcher const PATTERN_REGEXP_PLACEHOLDER_TEMPLATE = '__PLACEHOLDER%d__'; - /** - * @var Parser - */ private $parser; - - /** - * @var ValueMatcher - */ + private $backtrace; private $matcher; - /** - * @param ValueMatcher $matcher - * @param Parser $parser - */ - public function __construct(ValueMatcher $matcher, Parser $parser) + public function __construct(ValueMatcher $matcher, Backtrace $backtrace, Parser $parser) { $this->parser = $parser; + $this->backtrace = $backtrace; $this->matcher = $matcher; } @@ -43,8 +35,12 @@ public function __construct(ValueMatcher $matcher, Parser $parser) */ public function match($value, $pattern) : bool { + $this->backtrace->matcherEntrance(self::class, $value, $pattern); + if (!\is_string($value)) { $this->error = \sprintf('%s "%s" is not a valid string.', \gettype($value), new StringConverter($value)); + $this->backtrace->matcherFailed(self::class, $value, $pattern, (string) $this->error); + return false; } @@ -55,11 +51,15 @@ public function match($value, $pattern) : bool $patternRegex = $this->replacePlaceholderWithPatternRegexes($patternRegex, $patternsReplacedWithRegex); } catch (UnknownTypeException $exception) { $this->error = \sprintf('Type pattern "%s" is not supported by TextMatcher.', $exception->getType()); + $this->backtrace->matcherFailed(self::class, $value, $pattern, (string) $this->error); + return false; } if (!\preg_match($patternRegex, $value, $matchedValues)) { $this->error = \sprintf('"%s" does not match "%s" pattern', $value, $pattern); + $this->backtrace->matcherFailed(self::class, $value, $pattern, (string) $this->error); + return false; } @@ -67,16 +67,22 @@ public function match($value, $pattern) : bool if (\count($patternsReplacedWithRegex) !== \count($matchedValues)) { $this->error = 'Unexpected TextMatcher error.'; + $this->backtrace->matcherFailed(self::class, $value, $pattern, (string) $this->error); + return false; } foreach ($patternsReplacedWithRegex as $index => $typePattern) { if (!$typePattern->matchExpanders($matchedValues[$index])) { $this->error = $typePattern->getError(); + $this->backtrace->matcherFailed(self::class, $value, $pattern, (string) $this->error); + return false; } } + $this->backtrace->matcherSucceed(self::class, $value, $pattern); + return true; } @@ -86,17 +92,26 @@ public function match($value, $pattern) : bool public function canMatch($pattern) : bool { if (!\is_string($pattern)) { + $this->backtrace->matcherCanMatch(self::class, $pattern, false); + return false; } if (Json::isValidPattern($pattern)) { + $this->backtrace->matcherCanMatch(self::class, $pattern, false); + return false; } if (Xml::isValid($pattern)) { + $this->backtrace->matcherCanMatch(self::class, $pattern, false); + return false; } + + $this->backtrace->matcherCanMatch(self::class, $pattern, true); + return true; } diff --git a/src/Matcher/UuidMatcher.php b/src/Matcher/UuidMatcher.php index fd8a3829..06b8e227 100644 --- a/src/Matcher/UuidMatcher.php +++ b/src/Matcher/UuidMatcher.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Parser; use Coduo\ToString\StringConverter; @@ -13,21 +14,27 @@ final class UuidMatcher extends Matcher const UUID_PATTERN = '[\da-f]{8}-[\da-f]{4}-[1-5][\da-f]{3}-[89ab][\da-f]{3}-[\da-f]{12}'; const UUID_FORMAT_PATTERN = '|^'.self::UUID_PATTERN.'$|'; + private $backtrace; private $parser; - public function __construct(Parser $parser) + public function __construct(Backtrace $backtrace, Parser $parser) { $this->parser = $parser; + $this->backtrace = $backtrace; } public function match($value, $pattern) : bool { + $this->backtrace->matcherEntrance(self::class, $value, $pattern); + if (!\is_string($value)) { $this->error = \sprintf( '%s "%s" is not a valid UUID: not a string.', \gettype($value), new StringConverter($value) ); + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); + return false; } @@ -37,18 +44,27 @@ public function match($value, $pattern) : bool \gettype($value), $value ); + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); + return false; } + $this->backtrace->matcherSucceed(self::class, $value, $pattern); + return true; } public function canMatch($pattern) : bool { if (!\is_string($pattern)) { + $this->backtrace->matcherCanMatch(self::class, $pattern, false); + return false; } - return $this->parser->hasValidSyntax($pattern) && $this->parser->parse($pattern)->is(self::PATTERN); + $result = $this->parser->hasValidSyntax($pattern) && $this->parser->parse($pattern)->is(self::PATTERN); + $this->backtrace->matcherCanMatch(self::class, $pattern, $result); + + return $result; } } diff --git a/src/Matcher/WildcardMatcher.php b/src/Matcher/WildcardMatcher.php index 9582a70d..cc8f8e34 100644 --- a/src/Matcher/WildcardMatcher.php +++ b/src/Matcher/WildcardMatcher.php @@ -4,17 +4,31 @@ namespace Coduo\PHPMatcher\Matcher; +use Coduo\PHPMatcher\Backtrace; + final class WildcardMatcher extends Matcher { const MATCH_PATTERN = "/^@(\*|wildcard)@$/"; - public function match($matcher, $pattern) : bool + private $backtrace; + + public function __construct(Backtrace $backtrace) { + $this->backtrace = $backtrace; + } + + public function match($value, $pattern) : bool + { + $this->backtrace->matcherSucceed(self::class, $value, $pattern); + return true; } public function canMatch($pattern) : bool { - return \is_string($pattern) && 0 !== \preg_match(self::MATCH_PATTERN, $pattern); + $result = \is_string($pattern) && 0 !== \preg_match(self::MATCH_PATTERN, $pattern); + $this->backtrace->matcherCanMatch(self::class, $pattern, $result); + + return $result; } } diff --git a/src/Matcher/XmlMatcher.php b/src/Matcher/XmlMatcher.php index 4824f2e9..85039b42 100644 --- a/src/Matcher/XmlMatcher.php +++ b/src/Matcher/XmlMatcher.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Matcher\Pattern\Assert\Xml; use Coduo\ToString\StringConverter; use LSS\XML2Array; @@ -11,19 +12,28 @@ final class XmlMatcher extends Matcher { private $arrayMatcher; + private $backtrace; - public function __construct(ArrayMatcher $arrayMatcher) + public function __construct(ArrayMatcher $arrayMatcher, Backtrace $backtrace) { $this->arrayMatcher = $arrayMatcher; + $this->backtrace = $backtrace; } public function match($value, $pattern) : bool { + $this->backtrace->matcherEntrance(self::class, $value, $pattern); + if (parent::match($value, $pattern)) { + $this->backtrace->matcherSucceed(self::class, $value, $pattern); + return true; } if (!Xml::isValid($value) || !Xml::isValid($pattern)) { + $this->error = \sprintf('Value or pattern are not valid XML\'s'); + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); + return false; } @@ -38,14 +48,21 @@ public function match($value, $pattern) : bool new StringConverter($pattern) ); + $this->backtrace->matcherFailed(self::class, $value, $pattern, $this->error); + return false; } + $this->backtrace->matcherSucceed(self::class, $value, $pattern); + return true; } public function canMatch($pattern) : bool { - return Xml::isValid($pattern); + $result = Xml::isValid($pattern); + $this->backtrace->matcherCanMatch(self::class, $pattern, $result); + + return $result; } } diff --git a/src/PHPMatcher.php b/src/PHPMatcher.php index 4088cb80..cc2dab42 100644 --- a/src/PHPMatcher.php +++ b/src/PHPMatcher.php @@ -10,8 +10,19 @@ final class PHPMatcher { public static function match($value, $pattern, string &$error = null) : bool { - $factory = new MatcherFactory(); - $matcher = $factory->createMatcher(); + $matcher = (new MatcherFactory())->createMatcher(); + + if (!$matcher->match($value, $pattern)) { + $error = $matcher->getError(); + return false; + } + + return true; + } + + public static function matchBacktrace($value, $pattern, Backtrace $backtrace, string &$error = null) : bool + { + $matcher = (new MatcherFactory())->createMatcher($backtrace); if (!$matcher->match($value, $pattern)) { $error = $matcher->getError(); diff --git a/src/PHPUnit/PHPMatcherConstraint.php b/src/PHPUnit/PHPMatcherConstraint.php index caf76cd6..b24e7097 100644 --- a/src/PHPUnit/PHPMatcherConstraint.php +++ b/src/PHPUnit/PHPMatcherConstraint.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\PHPUnit; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Factory\MatcherFactory; use Coduo\PHPMatcher\Matcher; use PHPUnit\Framework\Constraint\Constraint; @@ -14,6 +15,7 @@ final class PHPMatcherConstraint extends Constraint { private $pattern; private $matcher; + private $backtrace; private $lastValue; public function __construct($pattern) @@ -31,6 +33,7 @@ public function __construct($pattern) } $this->pattern = $pattern; + $this->backtrace = new Backtrace(); $this->matcher = $this->createMatcher(); } @@ -42,9 +45,9 @@ public function toString() : string return 'matches the pattern'; } - protected function additionalFailureDescription($other) : string + protected function failureDescription($other): string { - return $this->matcher->getError(); + return parent::failureDescription($other) . ".\nError: " . $this->matcher->getError(); } protected function matches($value) : bool @@ -54,9 +57,7 @@ protected function matches($value) : bool private function createMatcher() : Matcher { - $factory = new MatcherFactory(); - - return $factory->createMatcher(); + return (new MatcherFactory())->createMatcher($this->backtrace); } /** diff --git a/src/Value/SingleLineString.php b/src/Value/SingleLineString.php new file mode 100644 index 00000000..351dea30 --- /dev/null +++ b/src/Value/SingleLineString.php @@ -0,0 +1,35 @@ +raw = $raw; + } + + public function __toString() : string + { + $normalized = $this->raw; + + if (Json::isValid($this->raw)) { + $normalized = Json::reformat($this->raw); + } else { + if (Json::isValid(Json::transformPattern($this->raw))) { + $normalized = Json::reformat(Json::transformPattern($this->raw)); + } + } + + return \str_replace(["\r\n", "\r", "\n"], ' ', $normalized); + } +} diff --git a/tests/BacktraceTest.php b/tests/BacktraceTest.php new file mode 100644 index 00000000..254106c5 --- /dev/null +++ b/tests/BacktraceTest.php @@ -0,0 +1,207 @@ +matcher = $factory->createMatcher(); + } + + public function test_backtrace_in_failed_simple_matching() + { + $this->matcher->match(100, '@string@'); + + $this->assertSame( + <<matcher->backtrace() + ); + } + + public function test_backtrace_in_succeed_simple_matching() + { + $this->matcher->match('100', '@string@'); + + $this->assertSame( + <<matcher->backtrace() + ); + } + + public function test_backtrace_in_failed_complex_matching() + { + $this->matcher->match( + /** @lang JSON */ + '{ + "users":[ + { + "id": 131, + "firstName": "Norbert", + "lastName": "Orzechowicz", + "enabled": true, + "roles": ["ROLE_DEVELOPER"] + }, + { + "id": 132, + "firstName": "Michał", + "lastName": "Dąbrowski", + "enabled": false, + "roles": ["ROLE_DEVELOPER"] + } + ], + "prevPage": "http:\/\/example.com\/api\/users\/1?limit=2", + "nextPage": "http:\/\/example.com\/api\/users\/3?limit=2" + }', + /** @lang JSON */ + '{ + "users":[ + { + "id": "@integer@", + "firstName":"Norbert", + "lastName":"Orzechowicz", + "enabled": "@boolean@", + "roles": "@array@" + }, + { + "id": "@integer@", + "firstName": "Michał", + "lastName": "Dąbrowski", + "enabled": "expr(value == true)", + "roles": "@array@" + } + ], + "prevPage": "@string@", + "nextPage": "@string@" + }' + ); + + // Uncomment when backtrace logic changes, run tests and then commit again. + //\file_put_contents(__DIR__ . '/BacktraceTest/failed_complex_matching_expected_trace.txt', (string) $this->matcher->backtrace()); + + $this->assertSame( + \file_get_contents(__DIR__ . '/BacktraceTest/failed_complex_matching_expected_trace.txt'), + (string) $this->matcher->backtrace() + ); + } + + public function test_backtrace_in_succeed_complex_matching() + { + $this->matcher->match( + /** @lang JSON */ + '{ + "users":[ + { + "id": 131, + "firstName": "Norbert", + "lastName": "Orzechowicz", + "enabled": true, + "roles": ["ROLE_DEVELOPER"] + }, + { + "id": 132, + "firstName": "Michał", + "lastName": "Dąbrowski", + "enabled": false, + "roles": ["ROLE_DEVELOPER"] + } + ], + "prevPage": "http:\/\/example.com\/api\/users\/1?limit=2", + "nextPage": "http:\/\/example.com\/api\/users\/3?limit=2" + }', + /** @lang JSON */ + '{ + "users":[ + { + "id": "@integer@", + "firstName":"Norbert", + "lastName":"Orzechowicz", + "enabled": "@boolean@", + "roles": "@array@" + }, + { + "id": "@integer@", + "firstName": "Michał", + "lastName": "Dąbrowski", + "enabled": "expr(value == false)", + "roles": "@array@" + } + ], + "prevPage": "@string@", + "nextPage": "@string@" + }' + ); + + // Uncomment when backtrace logic changes, run tests and then commit again. + //\file_put_contents(__DIR__ . '/BacktraceTest/succeed_complex_matching_expected_trace.txt', (string) $this->matcher->backtrace()); + + $this->assertSame( + \file_get_contents(__DIR__ . '/BacktraceTest/succeed_complex_matching_expected_trace.txt'), + (string) $this->matcher->backtrace() + ); + } +} diff --git a/tests/BacktraceTest/failed_complex_matching_expected_trace.txt b/tests/BacktraceTest/failed_complex_matching_expected_trace.txt new file mode 100644 index 00000000..696f5e42 --- /dev/null +++ b/tests/BacktraceTest/failed_complex_matching_expected_trace.txt @@ -0,0 +1,276 @@ +#1 Matcher Coduo\PHPMatcher\Matcher matching value "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" with "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" pattern +#2 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (all) matching value "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" with "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" pattern +#3 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#4 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" with "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" pattern +#5 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#6 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#7 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#8 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#9 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can't match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#10 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher can't match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#11 Matcher Coduo\PHPMatcher\Matcher\DoubleMatcher can't match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#12 Matcher Coduo\PHPMatcher\Matcher\NumberMatcher can't match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#13 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher can match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#14 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher matching value "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" with "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" pattern +#15 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher failed to match value "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" with "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" pattern +#16 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher error: "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" does not match "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}". +#17 Matcher Coduo\PHPMatcher\Matcher\WildcardMatcher can't match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#18 Matcher Coduo\PHPMatcher\Matcher\UuidMatcher can't match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#19 Matcher Coduo\PHPMatcher\Matcher\JsonObjectMatcher can't match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#20 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) failed to match value "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" with "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" pattern +#21 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) error: "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" does not match "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}". +#22 Matcher Coduo\PHPMatcher\Matcher\JsonMatcher can match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#23 Matcher Coduo\PHPMatcher\Matcher\JsonMatcher matching value "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" with "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" pattern +#24 Matcher Coduo\PHPMatcher\Matcher\ArrayMatcher matching value "Array(3)" with "Array(3)" pattern +#25 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "Array(2)" +#26 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "Array(2)" with "Array(2)" pattern +#27 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "Array(2)" +#28 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "Array(2)" +#29 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "Array(2)" with "Array(2)" pattern +#30 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "Array(2)" +#31 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "Array(2)" +#32 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "Array(2)" +#33 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "Array(2)" +#34 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can't match pattern "Array(2)" +#35 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher can't match pattern "Array(2)" +#36 Matcher Coduo\PHPMatcher\Matcher\DoubleMatcher can't match pattern "Array(2)" +#37 Matcher Coduo\PHPMatcher\Matcher\NumberMatcher can't match pattern "Array(2)" +#38 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher can't match pattern "Array(2)" +#39 Matcher Coduo\PHPMatcher\Matcher\WildcardMatcher can't match pattern "Array(2)" +#40 Matcher Coduo\PHPMatcher\Matcher\UuidMatcher can't match pattern "Array(2)" +#41 Matcher Coduo\PHPMatcher\Matcher\JsonObjectMatcher can't match pattern "Array(2)" +#42 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) failed to match value "Array(2)" with "Array(2)" pattern +#43 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) error: "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" does not match "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}". +#44 Matcher Coduo\PHPMatcher\Matcher\TextMatcher can't match pattern "Array(2)" +#45 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) failed to match value "Array(2)" with "Array(2)" pattern +#46 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) error: "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" does not match "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}". +#47 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "Array(5)" +#48 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "Array(5)" with "Array(5)" pattern +#49 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "Array(5)" +#50 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "Array(5)" +#51 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "Array(5)" with "Array(5)" pattern +#52 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "Array(5)" +#53 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "Array(5)" +#54 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "Array(5)" +#55 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "Array(5)" +#56 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can't match pattern "Array(5)" +#57 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher can't match pattern "Array(5)" +#58 Matcher Coduo\PHPMatcher\Matcher\DoubleMatcher can't match pattern "Array(5)" +#59 Matcher Coduo\PHPMatcher\Matcher\NumberMatcher can't match pattern "Array(5)" +#60 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher can't match pattern "Array(5)" +#61 Matcher Coduo\PHPMatcher\Matcher\WildcardMatcher can't match pattern "Array(5)" +#62 Matcher Coduo\PHPMatcher\Matcher\UuidMatcher can't match pattern "Array(5)" +#63 Matcher Coduo\PHPMatcher\Matcher\JsonObjectMatcher can't match pattern "Array(5)" +#64 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) failed to match value "Array(5)" with "Array(5)" pattern +#65 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) error: "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" does not match "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}". +#66 Matcher Coduo\PHPMatcher\Matcher\TextMatcher can't match pattern "Array(5)" +#67 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) failed to match value "Array(5)" with "Array(5)" pattern +#68 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) error: "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" does not match "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}". +#69 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "@integer@" +#70 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "131" with "@integer@" pattern +#71 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "@integer@" +#72 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "@integer@" +#73 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "131" with "@integer@" pattern +#74 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "@integer@" +#75 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "@integer@" +#76 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "@integer@" +#77 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "@integer@" +#78 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can match pattern "@integer@" +#79 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher matching value "131" with "@integer@" pattern +#80 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher successfully matched value "131" with "@integer@" pattern +#81 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) successfully matched value "131" with "@integer@" pattern +#82 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) successfully matched value "131" with "@integer@" pattern +#83 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "Norbert" +#84 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "Norbert" with "Norbert" pattern +#85 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "Norbert" +#86 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "Norbert" +#87 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "Norbert" with "Norbert" pattern +#88 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "Norbert" +#89 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "Norbert" +#90 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "Norbert" +#91 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "Norbert" +#92 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can't match pattern "Norbert" +#93 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher can't match pattern "Norbert" +#94 Matcher Coduo\PHPMatcher\Matcher\DoubleMatcher can't match pattern "Norbert" +#95 Matcher Coduo\PHPMatcher\Matcher\NumberMatcher can't match pattern "Norbert" +#96 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher can match pattern "Norbert" +#97 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher matching value "Norbert" with "Norbert" pattern +#98 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher successfully matched value "Norbert" with "Norbert" pattern +#99 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) successfully matched value "Norbert" with "Norbert" pattern +#100 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) successfully matched value "Norbert" with "Norbert" pattern +#101 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "Orzechowicz" +#102 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "Orzechowicz" with "Orzechowicz" pattern +#103 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "Orzechowicz" +#104 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "Orzechowicz" +#105 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "Orzechowicz" with "Orzechowicz" pattern +#106 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "Orzechowicz" +#107 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "Orzechowicz" +#108 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "Orzechowicz" +#109 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "Orzechowicz" +#110 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can't match pattern "Orzechowicz" +#111 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher can't match pattern "Orzechowicz" +#112 Matcher Coduo\PHPMatcher\Matcher\DoubleMatcher can't match pattern "Orzechowicz" +#113 Matcher Coduo\PHPMatcher\Matcher\NumberMatcher can't match pattern "Orzechowicz" +#114 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher can match pattern "Orzechowicz" +#115 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher matching value "Orzechowicz" with "Orzechowicz" pattern +#116 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher successfully matched value "Orzechowicz" with "Orzechowicz" pattern +#117 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) successfully matched value "Orzechowicz" with "Orzechowicz" pattern +#118 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) successfully matched value "Orzechowicz" with "Orzechowicz" pattern +#119 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "@boolean@" +#120 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "true" with "@boolean@" pattern +#121 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "@boolean@" +#122 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "@boolean@" +#123 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "true" with "@boolean@" pattern +#124 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "@boolean@" +#125 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "@boolean@" +#126 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "@boolean@" +#127 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "@boolean@" +#128 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can't match pattern "@boolean@" +#129 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher can match pattern "@boolean@" +#130 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher matching value "true" with "@boolean@" pattern +#131 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher successfully matched value "true" with "@boolean@" pattern +#132 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) successfully matched value "true" with "@boolean@" pattern +#133 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) successfully matched value "true" with "@boolean@" pattern +#134 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "@array@" +#135 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "Array(1)" with "@array@" pattern +#136 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "@array@" +#137 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "@array@" +#138 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "Array(1)" with "@array@" pattern +#139 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "@array@" +#140 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "@array@" +#141 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "@array@" +#142 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "@array@" +#143 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can't match pattern "@array@" +#144 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher can't match pattern "@array@" +#145 Matcher Coduo\PHPMatcher\Matcher\DoubleMatcher can't match pattern "@array@" +#146 Matcher Coduo\PHPMatcher\Matcher\NumberMatcher can't match pattern "@array@" +#147 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher can match pattern "@array@" +#148 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher matching value "Array(1)" with "@array@" pattern +#149 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher failed to match value "Array(1)" with "@array@" pattern +#150 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher error: "Array(1)" does not match "@array@". +#151 Matcher Coduo\PHPMatcher\Matcher\WildcardMatcher can't match pattern "@array@" +#152 Matcher Coduo\PHPMatcher\Matcher\UuidMatcher can't match pattern "@array@" +#153 Matcher Coduo\PHPMatcher\Matcher\JsonObjectMatcher can't match pattern "@array@" +#154 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) failed to match value "Array(1)" with "@array@" pattern +#155 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) error: "Array(1)" does not match "@array@". +#156 Matcher Coduo\PHPMatcher\Matcher\TextMatcher can match pattern "@array@" +#157 Matcher Coduo\PHPMatcher\Matcher\TextMatcher matching value "Array(1)" with "@array@" pattern +#158 Matcher Coduo\PHPMatcher\Matcher\TextMatcher failed to match value "Array(1)" with "@array@" pattern +#159 Matcher Coduo\PHPMatcher\Matcher\TextMatcher error: array "Array(1)" is not a valid string. +#160 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) failed to match value "Array(1)" with "@array@" pattern +#161 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) error: array "Array(1)" is not a valid string. +#162 Matcher Coduo\PHPMatcher\Matcher\ArrayMatcher successfully matched value "Array(1)" with "@array@" pattern +#163 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "Array(5)" +#164 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "Array(5)" with "Array(5)" pattern +#165 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "Array(5)" +#166 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "Array(5)" +#167 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "Array(5)" with "Array(5)" pattern +#168 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "Array(5)" +#169 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "Array(5)" +#170 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "Array(5)" +#171 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "Array(5)" +#172 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can't match pattern "Array(5)" +#173 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher can't match pattern "Array(5)" +#174 Matcher Coduo\PHPMatcher\Matcher\DoubleMatcher can't match pattern "Array(5)" +#175 Matcher Coduo\PHPMatcher\Matcher\NumberMatcher can't match pattern "Array(5)" +#176 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher can't match pattern "Array(5)" +#177 Matcher Coduo\PHPMatcher\Matcher\WildcardMatcher can't match pattern "Array(5)" +#178 Matcher Coduo\PHPMatcher\Matcher\UuidMatcher can't match pattern "Array(5)" +#179 Matcher Coduo\PHPMatcher\Matcher\JsonObjectMatcher can't match pattern "Array(5)" +#180 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) failed to match value "Array(5)" with "Array(5)" pattern +#181 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) error: "Array(1)" does not match "@array@". +#182 Matcher Coduo\PHPMatcher\Matcher\TextMatcher can't match pattern "Array(5)" +#183 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) failed to match value "Array(5)" with "Array(5)" pattern +#184 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) error: "Array(1)" does not match "@array@". +#185 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "@integer@" +#186 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "132" with "@integer@" pattern +#187 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "@integer@" +#188 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "@integer@" +#189 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "132" with "@integer@" pattern +#190 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "@integer@" +#191 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "@integer@" +#192 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "@integer@" +#193 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "@integer@" +#194 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can match pattern "@integer@" +#195 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher matching value "132" with "@integer@" pattern +#196 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher successfully matched value "132" with "@integer@" pattern +#197 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) successfully matched value "132" with "@integer@" pattern +#198 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) successfully matched value "132" with "@integer@" pattern +#199 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "Michał" +#200 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "Michał" with "Michał" pattern +#201 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "Michał" +#202 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "Michał" +#203 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "Michał" with "Michał" pattern +#204 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "Michał" +#205 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "Michał" +#206 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "Michał" +#207 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "Michał" +#208 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can't match pattern "Michał" +#209 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher can't match pattern "Michał" +#210 Matcher Coduo\PHPMatcher\Matcher\DoubleMatcher can't match pattern "Michał" +#211 Matcher Coduo\PHPMatcher\Matcher\NumberMatcher can't match pattern "Michał" +#212 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher can match pattern "Michał" +#213 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher matching value "Michał" with "Michał" pattern +#214 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher successfully matched value "Michał" with "Michał" pattern +#215 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) successfully matched value "Michał" with "Michał" pattern +#216 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) successfully matched value "Michał" with "Michał" pattern +#217 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "Dąbrowski" +#218 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "Dąbrowski" with "Dąbrowski" pattern +#219 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "Dąbrowski" +#220 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "Dąbrowski" +#221 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "Dąbrowski" with "Dąbrowski" pattern +#222 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "Dąbrowski" +#223 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "Dąbrowski" +#224 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "Dąbrowski" +#225 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "Dąbrowski" +#226 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can't match pattern "Dąbrowski" +#227 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher can't match pattern "Dąbrowski" +#228 Matcher Coduo\PHPMatcher\Matcher\DoubleMatcher can't match pattern "Dąbrowski" +#229 Matcher Coduo\PHPMatcher\Matcher\NumberMatcher can't match pattern "Dąbrowski" +#230 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher can match pattern "Dąbrowski" +#231 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher matching value "Dąbrowski" with "Dąbrowski" pattern +#232 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher successfully matched value "Dąbrowski" with "Dąbrowski" pattern +#233 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) successfully matched value "Dąbrowski" with "Dąbrowski" pattern +#234 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) successfully matched value "Dąbrowski" with "Dąbrowski" pattern +#235 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "expr(value == true)" +#236 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "false" with "expr(value == true)" pattern +#237 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "expr(value == true)" +#238 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "expr(value == true)" +#239 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "false" with "expr(value == true)" pattern +#240 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "expr(value == true)" +#241 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can match pattern "expr(value == true)" +#242 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher matching value "false" with "expr(value == true)" pattern +#243 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher failed to match value "false" with "expr(value == true)" pattern +#244 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher error: "expr(value == true)" expression fails for value "false". +#245 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "expr(value == true)" +#246 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "expr(value == true)" +#247 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can't match pattern "expr(value == true)" +#248 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher can't match pattern "expr(value == true)" +#249 Matcher Coduo\PHPMatcher\Matcher\DoubleMatcher can't match pattern "expr(value == true)" +#250 Matcher Coduo\PHPMatcher\Matcher\NumberMatcher can't match pattern "expr(value == true)" +#251 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher can match pattern "expr(value == true)" +#252 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher matching value "false" with "expr(value == true)" pattern +#253 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher failed to match value "false" with "expr(value == true)" pattern +#254 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher error: "false" does not match "expr(value == true)". +#255 Matcher Coduo\PHPMatcher\Matcher\WildcardMatcher can't match pattern "expr(value == true)" +#256 Matcher Coduo\PHPMatcher\Matcher\UuidMatcher can't match pattern "expr(value == true)" +#257 Matcher Coduo\PHPMatcher\Matcher\JsonObjectMatcher can't match pattern "expr(value == true)" +#258 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) failed to match value "false" with "expr(value == true)" pattern +#259 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) error: "false" does not match "expr(value == true)". +#260 Matcher Coduo\PHPMatcher\Matcher\TextMatcher can match pattern "expr(value == true)" +#261 Matcher Coduo\PHPMatcher\Matcher\TextMatcher matching value "false" with "expr(value == true)" pattern +#262 Matcher Coduo\PHPMatcher\Matcher\TextMatcher failed to match value "false" with "expr(value == true)" pattern +#263 Matcher Coduo\PHPMatcher\Matcher\TextMatcher error: boolean "false" is not a valid string. +#264 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) failed to match value "false" with "expr(value == true)" pattern +#265 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) error: boolean "false" is not a valid string. +#266 Matcher Coduo\PHPMatcher\Matcher\ArrayMatcher failed to match value "Array(3)" with "Array(3)" pattern +#267 Matcher Coduo\PHPMatcher\Matcher\ArrayMatcher error: boolean "false" is not a valid string. +#268 Matcher Coduo\PHPMatcher\Matcher\JsonMatcher failed to match value "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" with "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" pattern +#269 Matcher Coduo\PHPMatcher\Matcher\JsonMatcher error: Value {"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"} does not match pattern {"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"} +#270 Matcher Coduo\PHPMatcher\Matcher\XmlMatcher can't match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#271 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#272 Matcher Coduo\PHPMatcher\Matcher\TextMatcher can't match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#273 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (all) failed to match value "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" with "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" pattern +#274 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (all) error: Value {"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"} does not match pattern {"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"} +#275 Matcher Coduo\PHPMatcher\Matcher failed to match value "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" with "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" pattern +#276 Matcher Coduo\PHPMatcher\Matcher error: Value {"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"} does not match pattern {"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == true)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"} \ No newline at end of file diff --git a/tests/BacktraceTest/succeed_complex_matching_expected_trace.txt b/tests/BacktraceTest/succeed_complex_matching_expected_trace.txt new file mode 100644 index 00000000..3f381e54 --- /dev/null +++ b/tests/BacktraceTest/succeed_complex_matching_expected_trace.txt @@ -0,0 +1,304 @@ +#1 Matcher Coduo\PHPMatcher\Matcher matching value "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" with "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" pattern +#2 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (all) matching value "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" with "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" pattern +#3 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#4 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" with "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" pattern +#5 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#6 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#7 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#8 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#9 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can't match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#10 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher can't match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#11 Matcher Coduo\PHPMatcher\Matcher\DoubleMatcher can't match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#12 Matcher Coduo\PHPMatcher\Matcher\NumberMatcher can't match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#13 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher can match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#14 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher matching value "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" with "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" pattern +#15 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher failed to match value "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" with "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" pattern +#16 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher error: "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" does not match "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}". +#17 Matcher Coduo\PHPMatcher\Matcher\WildcardMatcher can't match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#18 Matcher Coduo\PHPMatcher\Matcher\UuidMatcher can't match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#19 Matcher Coduo\PHPMatcher\Matcher\JsonObjectMatcher can't match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#20 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) failed to match value "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" with "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" pattern +#21 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) error: "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" does not match "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}". +#22 Matcher Coduo\PHPMatcher\Matcher\JsonMatcher can match pattern "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" +#23 Matcher Coduo\PHPMatcher\Matcher\JsonMatcher matching value "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" with "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" pattern +#24 Matcher Coduo\PHPMatcher\Matcher\ArrayMatcher matching value "Array(3)" with "Array(3)" pattern +#25 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "Array(2)" +#26 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "Array(2)" with "Array(2)" pattern +#27 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "Array(2)" +#28 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "Array(2)" +#29 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "Array(2)" with "Array(2)" pattern +#30 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "Array(2)" +#31 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "Array(2)" +#32 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "Array(2)" +#33 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "Array(2)" +#34 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can't match pattern "Array(2)" +#35 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher can't match pattern "Array(2)" +#36 Matcher Coduo\PHPMatcher\Matcher\DoubleMatcher can't match pattern "Array(2)" +#37 Matcher Coduo\PHPMatcher\Matcher\NumberMatcher can't match pattern "Array(2)" +#38 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher can't match pattern "Array(2)" +#39 Matcher Coduo\PHPMatcher\Matcher\WildcardMatcher can't match pattern "Array(2)" +#40 Matcher Coduo\PHPMatcher\Matcher\UuidMatcher can't match pattern "Array(2)" +#41 Matcher Coduo\PHPMatcher\Matcher\JsonObjectMatcher can't match pattern "Array(2)" +#42 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) failed to match value "Array(2)" with "Array(2)" pattern +#43 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) error: "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" does not match "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}". +#44 Matcher Coduo\PHPMatcher\Matcher\TextMatcher can't match pattern "Array(2)" +#45 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) failed to match value "Array(2)" with "Array(2)" pattern +#46 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) error: "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" does not match "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}". +#47 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "Array(5)" +#48 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "Array(5)" with "Array(5)" pattern +#49 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "Array(5)" +#50 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "Array(5)" +#51 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "Array(5)" with "Array(5)" pattern +#52 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "Array(5)" +#53 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "Array(5)" +#54 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "Array(5)" +#55 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "Array(5)" +#56 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can't match pattern "Array(5)" +#57 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher can't match pattern "Array(5)" +#58 Matcher Coduo\PHPMatcher\Matcher\DoubleMatcher can't match pattern "Array(5)" +#59 Matcher Coduo\PHPMatcher\Matcher\NumberMatcher can't match pattern "Array(5)" +#60 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher can't match pattern "Array(5)" +#61 Matcher Coduo\PHPMatcher\Matcher\WildcardMatcher can't match pattern "Array(5)" +#62 Matcher Coduo\PHPMatcher\Matcher\UuidMatcher can't match pattern "Array(5)" +#63 Matcher Coduo\PHPMatcher\Matcher\JsonObjectMatcher can't match pattern "Array(5)" +#64 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) failed to match value "Array(5)" with "Array(5)" pattern +#65 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) error: "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" does not match "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}". +#66 Matcher Coduo\PHPMatcher\Matcher\TextMatcher can't match pattern "Array(5)" +#67 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) failed to match value "Array(5)" with "Array(5)" pattern +#68 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) error: "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" does not match "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}". +#69 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "@integer@" +#70 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "131" with "@integer@" pattern +#71 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "@integer@" +#72 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "@integer@" +#73 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "131" with "@integer@" pattern +#74 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "@integer@" +#75 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "@integer@" +#76 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "@integer@" +#77 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "@integer@" +#78 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can match pattern "@integer@" +#79 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher matching value "131" with "@integer@" pattern +#80 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher successfully matched value "131" with "@integer@" pattern +#81 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) successfully matched value "131" with "@integer@" pattern +#82 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) successfully matched value "131" with "@integer@" pattern +#83 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "Norbert" +#84 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "Norbert" with "Norbert" pattern +#85 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "Norbert" +#86 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "Norbert" +#87 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "Norbert" with "Norbert" pattern +#88 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "Norbert" +#89 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "Norbert" +#90 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "Norbert" +#91 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "Norbert" +#92 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can't match pattern "Norbert" +#93 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher can't match pattern "Norbert" +#94 Matcher Coduo\PHPMatcher\Matcher\DoubleMatcher can't match pattern "Norbert" +#95 Matcher Coduo\PHPMatcher\Matcher\NumberMatcher can't match pattern "Norbert" +#96 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher can match pattern "Norbert" +#97 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher matching value "Norbert" with "Norbert" pattern +#98 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher successfully matched value "Norbert" with "Norbert" pattern +#99 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) successfully matched value "Norbert" with "Norbert" pattern +#100 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) successfully matched value "Norbert" with "Norbert" pattern +#101 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "Orzechowicz" +#102 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "Orzechowicz" with "Orzechowicz" pattern +#103 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "Orzechowicz" +#104 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "Orzechowicz" +#105 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "Orzechowicz" with "Orzechowicz" pattern +#106 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "Orzechowicz" +#107 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "Orzechowicz" +#108 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "Orzechowicz" +#109 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "Orzechowicz" +#110 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can't match pattern "Orzechowicz" +#111 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher can't match pattern "Orzechowicz" +#112 Matcher Coduo\PHPMatcher\Matcher\DoubleMatcher can't match pattern "Orzechowicz" +#113 Matcher Coduo\PHPMatcher\Matcher\NumberMatcher can't match pattern "Orzechowicz" +#114 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher can match pattern "Orzechowicz" +#115 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher matching value "Orzechowicz" with "Orzechowicz" pattern +#116 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher successfully matched value "Orzechowicz" with "Orzechowicz" pattern +#117 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) successfully matched value "Orzechowicz" with "Orzechowicz" pattern +#118 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) successfully matched value "Orzechowicz" with "Orzechowicz" pattern +#119 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "@boolean@" +#120 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "true" with "@boolean@" pattern +#121 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "@boolean@" +#122 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "@boolean@" +#123 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "true" with "@boolean@" pattern +#124 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "@boolean@" +#125 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "@boolean@" +#126 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "@boolean@" +#127 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "@boolean@" +#128 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can't match pattern "@boolean@" +#129 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher can match pattern "@boolean@" +#130 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher matching value "true" with "@boolean@" pattern +#131 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher successfully matched value "true" with "@boolean@" pattern +#132 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) successfully matched value "true" with "@boolean@" pattern +#133 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) successfully matched value "true" with "@boolean@" pattern +#134 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "@array@" +#135 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "Array(1)" with "@array@" pattern +#136 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "@array@" +#137 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "@array@" +#138 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "Array(1)" with "@array@" pattern +#139 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "@array@" +#140 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "@array@" +#141 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "@array@" +#142 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "@array@" +#143 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can't match pattern "@array@" +#144 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher can't match pattern "@array@" +#145 Matcher Coduo\PHPMatcher\Matcher\DoubleMatcher can't match pattern "@array@" +#146 Matcher Coduo\PHPMatcher\Matcher\NumberMatcher can't match pattern "@array@" +#147 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher can match pattern "@array@" +#148 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher matching value "Array(1)" with "@array@" pattern +#149 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher failed to match value "Array(1)" with "@array@" pattern +#150 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher error: "Array(1)" does not match "@array@". +#151 Matcher Coduo\PHPMatcher\Matcher\WildcardMatcher can't match pattern "@array@" +#152 Matcher Coduo\PHPMatcher\Matcher\UuidMatcher can't match pattern "@array@" +#153 Matcher Coduo\PHPMatcher\Matcher\JsonObjectMatcher can't match pattern "@array@" +#154 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) failed to match value "Array(1)" with "@array@" pattern +#155 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) error: "Array(1)" does not match "@array@". +#156 Matcher Coduo\PHPMatcher\Matcher\TextMatcher can match pattern "@array@" +#157 Matcher Coduo\PHPMatcher\Matcher\TextMatcher matching value "Array(1)" with "@array@" pattern +#158 Matcher Coduo\PHPMatcher\Matcher\TextMatcher failed to match value "Array(1)" with "@array@" pattern +#159 Matcher Coduo\PHPMatcher\Matcher\TextMatcher error: array "Array(1)" is not a valid string. +#160 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) failed to match value "Array(1)" with "@array@" pattern +#161 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) error: array "Array(1)" is not a valid string. +#162 Matcher Coduo\PHPMatcher\Matcher\ArrayMatcher successfully matched value "Array(1)" with "@array@" pattern +#163 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "Array(5)" +#164 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "Array(5)" with "Array(5)" pattern +#165 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "Array(5)" +#166 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "Array(5)" +#167 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "Array(5)" with "Array(5)" pattern +#168 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "Array(5)" +#169 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "Array(5)" +#170 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "Array(5)" +#171 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "Array(5)" +#172 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can't match pattern "Array(5)" +#173 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher can't match pattern "Array(5)" +#174 Matcher Coduo\PHPMatcher\Matcher\DoubleMatcher can't match pattern "Array(5)" +#175 Matcher Coduo\PHPMatcher\Matcher\NumberMatcher can't match pattern "Array(5)" +#176 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher can't match pattern "Array(5)" +#177 Matcher Coduo\PHPMatcher\Matcher\WildcardMatcher can't match pattern "Array(5)" +#178 Matcher Coduo\PHPMatcher\Matcher\UuidMatcher can't match pattern "Array(5)" +#179 Matcher Coduo\PHPMatcher\Matcher\JsonObjectMatcher can't match pattern "Array(5)" +#180 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) failed to match value "Array(5)" with "Array(5)" pattern +#181 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) error: "Array(1)" does not match "@array@". +#182 Matcher Coduo\PHPMatcher\Matcher\TextMatcher can't match pattern "Array(5)" +#183 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) failed to match value "Array(5)" with "Array(5)" pattern +#184 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) error: "Array(1)" does not match "@array@". +#185 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "@integer@" +#186 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "132" with "@integer@" pattern +#187 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "@integer@" +#188 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "@integer@" +#189 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "132" with "@integer@" pattern +#190 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "@integer@" +#191 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "@integer@" +#192 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "@integer@" +#193 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "@integer@" +#194 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can match pattern "@integer@" +#195 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher matching value "132" with "@integer@" pattern +#196 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher successfully matched value "132" with "@integer@" pattern +#197 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) successfully matched value "132" with "@integer@" pattern +#198 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) successfully matched value "132" with "@integer@" pattern +#199 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "Michał" +#200 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "Michał" with "Michał" pattern +#201 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "Michał" +#202 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "Michał" +#203 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "Michał" with "Michał" pattern +#204 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "Michał" +#205 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "Michał" +#206 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "Michał" +#207 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "Michał" +#208 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can't match pattern "Michał" +#209 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher can't match pattern "Michał" +#210 Matcher Coduo\PHPMatcher\Matcher\DoubleMatcher can't match pattern "Michał" +#211 Matcher Coduo\PHPMatcher\Matcher\NumberMatcher can't match pattern "Michał" +#212 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher can match pattern "Michał" +#213 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher matching value "Michał" with "Michał" pattern +#214 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher successfully matched value "Michał" with "Michał" pattern +#215 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) successfully matched value "Michał" with "Michał" pattern +#216 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) successfully matched value "Michał" with "Michał" pattern +#217 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "Dąbrowski" +#218 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "Dąbrowski" with "Dąbrowski" pattern +#219 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "Dąbrowski" +#220 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "Dąbrowski" +#221 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "Dąbrowski" with "Dąbrowski" pattern +#222 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "Dąbrowski" +#223 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "Dąbrowski" +#224 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "Dąbrowski" +#225 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "Dąbrowski" +#226 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can't match pattern "Dąbrowski" +#227 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher can't match pattern "Dąbrowski" +#228 Matcher Coduo\PHPMatcher\Matcher\DoubleMatcher can't match pattern "Dąbrowski" +#229 Matcher Coduo\PHPMatcher\Matcher\NumberMatcher can't match pattern "Dąbrowski" +#230 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher can match pattern "Dąbrowski" +#231 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher matching value "Dąbrowski" with "Dąbrowski" pattern +#232 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher successfully matched value "Dąbrowski" with "Dąbrowski" pattern +#233 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) successfully matched value "Dąbrowski" with "Dąbrowski" pattern +#234 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) successfully matched value "Dąbrowski" with "Dąbrowski" pattern +#235 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "expr(value == false)" +#236 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "false" with "expr(value == false)" pattern +#237 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "expr(value == false)" +#238 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "expr(value == false)" +#239 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "false" with "expr(value == false)" pattern +#240 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "expr(value == false)" +#241 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can match pattern "expr(value == false)" +#242 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher matching value "false" with "expr(value == false)" pattern +#243 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher successfully matched value "false" with "expr(value == false)" pattern +#244 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) successfully matched value "false" with "expr(value == false)" pattern +#245 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) successfully matched value "false" with "expr(value == false)" pattern +#246 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "@array@" +#247 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "Array(1)" with "@array@" pattern +#248 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "@array@" +#249 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "@array@" +#250 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "Array(1)" with "@array@" pattern +#251 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "@array@" +#252 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "@array@" +#253 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "@array@" +#254 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can't match pattern "@array@" +#255 Matcher Coduo\PHPMatcher\Matcher\IntegerMatcher can't match pattern "@array@" +#256 Matcher Coduo\PHPMatcher\Matcher\BooleanMatcher can't match pattern "@array@" +#257 Matcher Coduo\PHPMatcher\Matcher\DoubleMatcher can't match pattern "@array@" +#258 Matcher Coduo\PHPMatcher\Matcher\NumberMatcher can't match pattern "@array@" +#259 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher can match pattern "@array@" +#260 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher matching value "Array(1)" with "@array@" pattern +#261 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher failed to match value "Array(1)" with "@array@" pattern +#262 Matcher Coduo\PHPMatcher\Matcher\ScalarMatcher error: "Array(1)" does not match "@array@". +#263 Matcher Coduo\PHPMatcher\Matcher\WildcardMatcher can't match pattern "@array@" +#264 Matcher Coduo\PHPMatcher\Matcher\UuidMatcher can't match pattern "@array@" +#265 Matcher Coduo\PHPMatcher\Matcher\JsonObjectMatcher can't match pattern "@array@" +#266 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) failed to match value "Array(1)" with "@array@" pattern +#267 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) error: "Array(1)" does not match "@array@". +#268 Matcher Coduo\PHPMatcher\Matcher\TextMatcher can match pattern "@array@" +#269 Matcher Coduo\PHPMatcher\Matcher\TextMatcher matching value "Array(1)" with "@array@" pattern +#270 Matcher Coduo\PHPMatcher\Matcher\TextMatcher failed to match value "Array(1)" with "@array@" pattern +#271 Matcher Coduo\PHPMatcher\Matcher\TextMatcher error: array "Array(1)" is not a valid string. +#272 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) failed to match value "Array(1)" with "@array@" pattern +#273 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) error: array "Array(1)" is not a valid string. +#274 Matcher Coduo\PHPMatcher\Matcher\ArrayMatcher successfully matched value "Array(1)" with "@array@" pattern +#275 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "@string@" +#276 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "http://example.com/api/users/1?limit=2" with "@string@" pattern +#277 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "@string@" +#278 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "@string@" +#279 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "http://example.com/api/users/1?limit=2" with "@string@" pattern +#280 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "@string@" +#281 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "@string@" +#282 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "@string@" +#283 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can match pattern "@string@" +#284 Matcher Coduo\PHPMatcher\Matcher\StringMatcher matching value "http://example.com/api/users/1?limit=2" with "@string@" pattern +#285 Matcher Coduo\PHPMatcher\Matcher\StringMatcher successfully matched value "http://example.com/api/users/1?limit=2" with "@string@" pattern +#286 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) successfully matched value "http://example.com/api/users/1?limit=2" with "@string@" pattern +#287 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) successfully matched value "http://example.com/api/users/1?limit=2" with "@string@" pattern +#288 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) can match pattern "@string@" +#289 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) matching value "http://example.com/api/users/3?limit=2" with "@string@" pattern +#290 Matcher Coduo\PHPMatcher\Matcher\OrMatcher can't match pattern "@string@" +#291 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) can match pattern "@string@" +#292 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) matching value "http://example.com/api/users/3?limit=2" with "@string@" pattern +#293 Matcher Coduo\PHPMatcher\Matcher\CallbackMatcher can't match pattern "@string@" +#294 Matcher Coduo\PHPMatcher\Matcher\ExpressionMatcher can't match pattern "@string@" +#295 Matcher Coduo\PHPMatcher\Matcher\NullMatcher can't match pattern "@string@" +#296 Matcher Coduo\PHPMatcher\Matcher\StringMatcher can match pattern "@string@" +#297 Matcher Coduo\PHPMatcher\Matcher\StringMatcher matching value "http://example.com/api/users/3?limit=2" with "@string@" pattern +#298 Matcher Coduo\PHPMatcher\Matcher\StringMatcher successfully matched value "http://example.com/api/users/3?limit=2" with "@string@" pattern +#299 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (scalars) successfully matched value "http://example.com/api/users/3?limit=2" with "@string@" pattern +#300 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (array) successfully matched value "http://example.com/api/users/3?limit=2" with "@string@" pattern +#301 Matcher Coduo\PHPMatcher\Matcher\ArrayMatcher successfully matched value "Array(3)" with "Array(3)" pattern +#302 Matcher Coduo\PHPMatcher\Matcher\JsonMatcher successfully matched value "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" with "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" pattern +#303 Matcher Coduo\PHPMatcher\Matcher\ChainMatcher (all) successfully matched value "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" with "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" pattern +#304 Matcher Coduo\PHPMatcher\Matcher successfully matched value "{"users":[{"id":131,"firstName":"Norbert","lastName":"Orzechowicz","enabled":true,"roles":["ROLE_DEVELOPER"]},{"id":132,"firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":false,"roles":["ROLE_DEVELOPER"]}],"prevPage":"http:\/\/example.com\/api\/users\/1?limit=2","nextPage":"http:\/\/example.com\/api\/users\/3?limit=2"}" with "{"users":[{"id":"@integer@","firstName":"Norbert","lastName":"Orzechowicz","enabled":"@boolean@","roles":"@array@"},{"id":"@integer@","firstName":"Micha\u0142","lastName":"D\u0105browski","enabled":"expr(value == false)","roles":"@array@"}],"prevPage":"@string@","nextPage":"@string@"}" pattern \ No newline at end of file diff --git a/tests/Matcher/ArrayMatcherTest.php b/tests/Matcher/ArrayMatcherTest.php index 114b1e56..64292044 100644 --- a/tests/Matcher/ArrayMatcherTest.php +++ b/tests/Matcher/ArrayMatcherTest.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Tests\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Lexer; use Coduo\PHPMatcher\Matcher; use Coduo\PHPMatcher\Parser; @@ -20,18 +21,23 @@ public function setUp() : void { $parser = new Parser(new Lexer(), new Parser\ExpanderInitializer()); $this->matcher = new Matcher\ArrayMatcher( - new Matcher\ChainMatcher([ - new Matcher\CallbackMatcher(), - new Matcher\ExpressionMatcher(), - new Matcher\NullMatcher(), - new Matcher\StringMatcher($parser), - new Matcher\IntegerMatcher($parser), - new Matcher\BooleanMatcher($parser), - new Matcher\DoubleMatcher($parser), - new Matcher\NumberMatcher($parser), - new Matcher\ScalarMatcher(), - new Matcher\WildcardMatcher(), - ]), + new Matcher\ChainMatcher( + self::class, + $backtrace = new Backtrace(), + [ + new Matcher\CallbackMatcher($backtrace), + new Matcher\ExpressionMatcher($backtrace), + new Matcher\NullMatcher($backtrace), + new Matcher\StringMatcher($backtrace, $parser), + new Matcher\IntegerMatcher($backtrace, $parser), + new Matcher\BooleanMatcher($backtrace, $parser), + new Matcher\DoubleMatcher($backtrace, $parser), + new Matcher\NumberMatcher($backtrace, $parser), + new Matcher\ScalarMatcher($backtrace), + new Matcher\WildcardMatcher($backtrace), + ] + ), + $backtrace, $parser ); } @@ -55,9 +61,14 @@ public function test_negative_match_arrays($value, $pattern) public function test_negative_match_when_cant_find_matcher_that_can_match_array_element() { $matcher = new Matcher\ArrayMatcher( - new Matcher\ChainMatcher([ - new Matcher\WildcardMatcher() - ]), + new Matcher\ChainMatcher( + self::class, + $backtrace = new Backtrace(), + [ + new Matcher\WildcardMatcher($backtrace) + ] + ), + $backtrace, $parser = new Parser(new Lexer(), new Parser\ExpanderInitializer()) ); diff --git a/tests/Matcher/BooleanMatcherTest.php b/tests/Matcher/BooleanMatcherTest.php index 7f685f22..1020ec5a 100644 --- a/tests/Matcher/BooleanMatcherTest.php +++ b/tests/Matcher/BooleanMatcherTest.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Tests\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Lexer; use Coduo\PHPMatcher\Parser; use Coduo\PHPMatcher\Matcher\BooleanMatcher; @@ -18,7 +19,7 @@ class BooleanMatcherTest extends TestCase public function setUp() : void { - $this->matcher = new BooleanMatcher(new Parser(new Lexer(), new Parser\ExpanderInitializer())); + $this->matcher = new BooleanMatcher(new Backtrace(), new Parser(new Lexer(), new Parser\ExpanderInitializer())); } /** diff --git a/tests/Matcher/CallbackMatcherTest.php b/tests/Matcher/CallbackMatcherTest.php index 0dccb947..4fffc31e 100644 --- a/tests/Matcher/CallbackMatcherTest.php +++ b/tests/Matcher/CallbackMatcherTest.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Tests\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Matcher\CallbackMatcher; use PHPUnit\Framework\TestCase; @@ -11,7 +12,7 @@ class CallbackMatcherTest extends TestCase { public function test_positive_can_match() { - $matcher = new CallbackMatcher(); + $matcher = new CallbackMatcher(new Backtrace()); $this->assertTrue($matcher->canMatch(function () { return true; })); @@ -19,14 +20,14 @@ public function test_positive_can_match() public function test_negative_can_match() { - $matcher = new CallbackMatcher(); + $matcher = new CallbackMatcher(new Backtrace()); $this->assertFalse($matcher->canMatch(new \DateTime())); $this->assertFalse($matcher->canMatch('SIN')); } public function test_positive_matches() { - $matcher = new CallbackMatcher(); + $matcher = new CallbackMatcher(new Backtrace()); $this->assertTrue($matcher->match(2, function ($value) { return true; })); @@ -37,7 +38,7 @@ public function test_positive_matches() public function test_negative_matches() { - $matcher = new CallbackMatcher(); + $matcher = new CallbackMatcher(new Backtrace()); $this->assertFalse($matcher->match(2, function ($value) { return false; })); diff --git a/tests/Matcher/ChainMatcherTest.php b/tests/Matcher/ChainMatcherTest.php index 68924107..4b04e277 100644 --- a/tests/Matcher/ChainMatcherTest.php +++ b/tests/Matcher/ChainMatcherTest.php @@ -4,8 +4,11 @@ namespace Coduo\PHPMatcher\Tests\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Matcher\ArrayMatcher; use Coduo\PHPMatcher\Matcher\ChainMatcher; +use Coduo\PHPMatcher\Matcher\ValueMatcher; +use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class ChainMatcherTest extends TestCase @@ -16,24 +19,28 @@ class ChainMatcherTest extends TestCase private $matcher; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var MockObject */ private $firstMatcher; /** - * @var \PHPUnit_Framework_MockObject_MockObject + * @var MockObject */ private $secondMatcher; public function setUp() : void { - $this->firstMatcher = $this->createMock('Coduo\PHPMatcher\Matcher\ValueMatcher'); - $this->secondMatcher = $this->createMock('Coduo\PHPMatcher\Matcher\ValueMatcher'); - - $this->matcher = new ChainMatcher([ - $this->firstMatcher, - $this->secondMatcher - ]); + $this->firstMatcher = $this->createMock(ValueMatcher::class); + $this->secondMatcher = $this->createMock(ValueMatcher::class); + + $this->matcher = new ChainMatcher( + self::class, + new Backtrace(), + [ + $this->firstMatcher, + $this->secondMatcher + ] + ); } public function test_only_one_matcher_can_match_but_none_matchers_match() diff --git a/tests/Matcher/DoubleMatcherTest.php b/tests/Matcher/DoubleMatcherTest.php index 0c043818..8bb7b311 100644 --- a/tests/Matcher/DoubleMatcherTest.php +++ b/tests/Matcher/DoubleMatcherTest.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Tests\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Lexer; use Coduo\PHPMatcher\Matcher\DoubleMatcher; use Coduo\PHPMatcher\Parser; @@ -18,7 +19,7 @@ class DoubleMatcherTest extends TestCase public function setUp() : void { - $this->matcher = new DoubleMatcher(new Parser(new Lexer(), new Parser\ExpanderInitializer())); + $this->matcher = new DoubleMatcher(new Backtrace(), new Parser(new Lexer(), new Parser\ExpanderInitializer())); } /** diff --git a/tests/Matcher/ExpressionMatcherTest.php b/tests/Matcher/ExpressionMatcherTest.php index 9a4b10dc..199d657c 100644 --- a/tests/Matcher/ExpressionMatcherTest.php +++ b/tests/Matcher/ExpressionMatcherTest.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Tests\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Matcher\ExpressionMatcher; use PHPUnit\Framework\TestCase; @@ -14,7 +15,7 @@ class ExpressionMatcherTest extends TestCase */ public function test_positive_can_matches($pattern) { - $matcher = new ExpressionMatcher(); + $matcher = new ExpressionMatcher(new Backtrace()); $this->assertTrue($matcher->canMatch($pattern)); } @@ -23,7 +24,7 @@ public function test_positive_can_matches($pattern) */ public function test_negative_can_matches($pattern) { - $matcher = new ExpressionMatcher(); + $matcher = new ExpressionMatcher(new Backtrace()); $this->assertFalse($matcher->canMatch($pattern)); } @@ -32,7 +33,7 @@ public function test_negative_can_matches($pattern) */ public function test_positive_match($value, $pattern) { - $matcher = new ExpressionMatcher(); + $matcher = new ExpressionMatcher(new Backtrace()); $this->assertTrue($matcher->match($value, $pattern)); } @@ -41,7 +42,7 @@ public function test_positive_match($value, $pattern) */ public function test_negative_match($value, $pattern) { - $matcher = new ExpressionMatcher(); + $matcher = new ExpressionMatcher(new Backtrace()); $this->assertFalse($matcher->match($value, $pattern)); } @@ -50,7 +51,7 @@ public function test_negative_match($value, $pattern) */ public function test_negative_match_description($value, $pattern, $error) { - $matcher = new ExpressionMatcher(); + $matcher = new ExpressionMatcher(new Backtrace()); $matcher->match($value, $pattern); $this->assertEquals($error, $matcher->getError()); } @@ -60,7 +61,7 @@ public function test_negative_match_description($value, $pattern, $error) */ public function test_positive_regex_matches($value, $pattern) { - $matcher = new ExpressionMatcher(); + $matcher = new ExpressionMatcher(new Backtrace()); $this->assertTrue($matcher->match($value, $pattern)); } @@ -69,7 +70,7 @@ public function test_positive_regex_matches($value, $pattern) */ public function test_negative_regex_matches($value, $pattern) { - $matcher = new ExpressionMatcher(); + $matcher = new ExpressionMatcher(new Backtrace()); $this->assertFalse($matcher->match($value, $pattern)); } diff --git a/tests/Matcher/IntegerMatcherTest.php b/tests/Matcher/IntegerMatcherTest.php index 5291bc14..5e361394 100644 --- a/tests/Matcher/IntegerMatcherTest.php +++ b/tests/Matcher/IntegerMatcherTest.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Tests\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Lexer; use Coduo\PHPMatcher\Matcher\IntegerMatcher; use Coduo\PHPMatcher\Parser; @@ -18,7 +19,7 @@ class IntegerMatcherTest extends TestCase public function setUp() : void { - $this->matcher = new IntegerMatcher(new Parser(new Lexer(), new Parser\ExpanderInitializer())); + $this->matcher = new IntegerMatcher(new Backtrace(), new Parser(new Lexer(), new Parser\ExpanderInitializer())); } /** diff --git a/tests/Matcher/JsonMatcherTest.php b/tests/Matcher/JsonMatcherTest.php index d727e23d..5c615e08 100644 --- a/tests/Matcher/JsonMatcherTest.php +++ b/tests/Matcher/JsonMatcherTest.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Tests\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Lexer; use Coduo\PHPMatcher\Matcher; use Coduo\PHPMatcher\Parser; @@ -19,20 +20,25 @@ class JsonMatcherTest extends TestCase public function setUp() : void { $parser = new Parser(new Lexer(), new Parser\ExpanderInitializer()); - $scalarMatchers = new Matcher\ChainMatcher([ - new Matcher\CallbackMatcher(), - new Matcher\ExpressionMatcher(), - new Matcher\NullMatcher(), - new Matcher\StringMatcher($parser), - new Matcher\IntegerMatcher($parser), - new Matcher\BooleanMatcher($parser), - new Matcher\DoubleMatcher($parser), - new Matcher\NumberMatcher($parser), - new Matcher\ScalarMatcher(), - new Matcher\WildcardMatcher(), - ]); + $scalarMatchers = new Matcher\ChainMatcher( + self::class, + $backtrace = new Backtrace(), + [ + new Matcher\CallbackMatcher($backtrace), + new Matcher\ExpressionMatcher($backtrace), + new Matcher\NullMatcher($backtrace), + new Matcher\StringMatcher($backtrace, $parser), + new Matcher\IntegerMatcher($backtrace, $parser), + new Matcher\BooleanMatcher($backtrace, $parser), + new Matcher\DoubleMatcher($backtrace, $parser), + new Matcher\NumberMatcher($backtrace, $parser), + new Matcher\ScalarMatcher($backtrace), + new Matcher\WildcardMatcher($backtrace), + ] + ); $this->matcher = new Matcher\JsonMatcher( - new Matcher\ArrayMatcher($scalarMatchers, $parser) + new Matcher\ArrayMatcher($scalarMatchers, $backtrace, $parser), + $backtrace ); } diff --git a/tests/Matcher/JsonObjectMatcherTest.php b/tests/Matcher/JsonObjectMatcherTest.php index 3975884c..ab3d35ed 100644 --- a/tests/Matcher/JsonObjectMatcherTest.php +++ b/tests/Matcher/JsonObjectMatcherTest.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Tests\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Lexer; use Coduo\PHPMatcher\Matcher\JsonObjectMatcher; use Coduo\PHPMatcher\Parser; @@ -18,7 +19,7 @@ final class JsonObjectMatcherTest extends TestCase public function setUp() : void { - $this->matcher = new JsonObjectMatcher(new Parser(new Lexer(), new Parser\ExpanderInitializer())); + $this->matcher = new JsonObjectMatcher(new Backtrace(), new Parser(new Lexer(), new Parser\ExpanderInitializer())); } /** diff --git a/tests/Matcher/NullMatcherTest.php b/tests/Matcher/NullMatcherTest.php index 5ca6bc1e..657e47ee 100644 --- a/tests/Matcher/NullMatcherTest.php +++ b/tests/Matcher/NullMatcherTest.php @@ -4,8 +4,7 @@ namespace Coduo\PHPMatcher\Tests\Matcher; -use Coduo\PHPMatcher\Lexer; -use Coduo\PHPMatcher\Parser; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Matcher\NullMatcher; use PHPUnit\Framework\TestCase; @@ -18,7 +17,7 @@ class NullMatcherTest extends TestCase public function setUp() : void { - $this->matcher = new NullMatcher(new Parser(new Lexer(), new Parser\ExpanderInitializer())); + $this->matcher = new NullMatcher(new Backtrace()); } /** diff --git a/tests/Matcher/NumberMatcherTest.php b/tests/Matcher/NumberMatcherTest.php index 80df0bfb..59a02f31 100644 --- a/tests/Matcher/NumberMatcherTest.php +++ b/tests/Matcher/NumberMatcherTest.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Tests\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Lexer; use Coduo\PHPMatcher\Parser; use Coduo\PHPMatcher\Matcher\NumberMatcher; @@ -18,7 +19,7 @@ class NumberMatcherTest extends TestCase public function setUp() : void { - $this->matcher = new NumberMatcher(new Parser(new Lexer(), new Parser\ExpanderInitializer())); + $this->matcher = new NumberMatcher(new Backtrace(), new Parser(new Lexer(), new Parser\ExpanderInitializer())); } /** diff --git a/tests/Matcher/ScalarMatcherTest.php b/tests/Matcher/ScalarMatcherTest.php index 50587310..22e26c56 100644 --- a/tests/Matcher/ScalarMatcherTest.php +++ b/tests/Matcher/ScalarMatcherTest.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Tests\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Matcher\ScalarMatcher; use PHPUnit\Framework\TestCase; @@ -14,7 +15,7 @@ class ScalarMatcherTest extends TestCase */ public function test_positive_can_matches($pattern) { - $matcher = new ScalarMatcher(); + $matcher = new ScalarMatcher(new Backtrace()); $this->assertTrue($matcher->canMatch($pattern)); } @@ -23,7 +24,7 @@ public function test_positive_can_matches($pattern) */ public function test_negative_can_matches($pattern) { - $matcher = new ScalarMatcher(); + $matcher = new ScalarMatcher(new Backtrace()); $this->assertFalse($matcher->canMatch($pattern)); } @@ -32,7 +33,7 @@ public function test_negative_can_matches($pattern) */ public function test_positive_matches($value, $pattern) { - $matcher = new ScalarMatcher(); + $matcher = new ScalarMatcher(new Backtrace()); $this->assertTrue($matcher->match($value, $pattern)); } @@ -41,7 +42,7 @@ public function test_positive_matches($value, $pattern) */ public function test_negative_matches($value, $pattern) { - $matcher = new ScalarMatcher(); + $matcher = new ScalarMatcher(new Backtrace()); $this->assertFalse($matcher->match($value, $pattern)); } @@ -50,7 +51,7 @@ public function test_negative_matches($value, $pattern) */ public function test_negative_match_description($value, $pattern, $error) { - $matcher = new ScalarMatcher(); + $matcher = new ScalarMatcher(new Backtrace()); $matcher->match($value, $pattern); $this->assertEquals($error, $matcher->getError()); } diff --git a/tests/Matcher/StringMatcherTest.php b/tests/Matcher/StringMatcherTest.php index c1da867a..42d8d09e 100644 --- a/tests/Matcher/StringMatcherTest.php +++ b/tests/Matcher/StringMatcherTest.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Tests\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Lexer; use Coduo\PHPMatcher\Matcher\StringMatcher; use Coduo\PHPMatcher\Parser; @@ -18,8 +19,7 @@ class StringMatcherTest extends TestCase public function setUp() : void { - $parser = new Parser(new Lexer(), new Parser\ExpanderInitializer()); - $this->matcher = new StringMatcher($parser); + $this->matcher = new StringMatcher(new Backtrace(), new Parser(new Lexer(), new Parser\ExpanderInitializer())); } /** * @dataProvider positiveCanMatchData diff --git a/tests/Matcher/TextMatcherTest.php b/tests/Matcher/TextMatcherTest.php index d013baaa..18c6bbd8 100644 --- a/tests/Matcher/TextMatcherTest.php +++ b/tests/Matcher/TextMatcherTest.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Tests\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Lexer; use Coduo\PHPMatcher\Matcher; use Coduo\PHPMatcher\Parser; @@ -19,23 +20,32 @@ class TextMatcherTest extends TestCase public function setUp() : void { $parser = new Parser(new Lexer(), new Parser\ExpanderInitializer()); - $scalarMatchers = new Matcher\ChainMatcher([ - new Matcher\CallbackMatcher(), - new Matcher\ExpressionMatcher(), - new Matcher\NullMatcher(), - new Matcher\StringMatcher($parser), - new Matcher\IntegerMatcher($parser), - new Matcher\BooleanMatcher($parser), - new Matcher\DoubleMatcher($parser), - new Matcher\NumberMatcher($parser), - new Matcher\ScalarMatcher(), - new Matcher\WildcardMatcher(), - ]); + $scalarMatchers = new Matcher\ChainMatcher( + self::class, + $backtrace = new Backtrace(), + [ + new Matcher\CallbackMatcher($backtrace), + new Matcher\ExpressionMatcher($backtrace), + new Matcher\NullMatcher($backtrace), + new Matcher\StringMatcher($backtrace, $parser), + new Matcher\IntegerMatcher($backtrace, $parser), + new Matcher\BooleanMatcher($backtrace, $parser), + new Matcher\DoubleMatcher($backtrace, $parser), + new Matcher\NumberMatcher($backtrace, $parser), + new Matcher\ScalarMatcher($backtrace), + new Matcher\WildcardMatcher($backtrace), + ] + ); $this->matcher = new Matcher\TextMatcher( - new Matcher\ChainMatcher([ - $scalarMatchers, - new Matcher\ArrayMatcher($scalarMatchers, $parser) - ]), + new Matcher\ChainMatcher( + self::class, + $backtrace, + [ + $scalarMatchers, + new Matcher\ArrayMatcher($scalarMatchers, $backtrace, $parser) + ] + ), + $backtrace, $parser ); } diff --git a/tests/Matcher/UuidMatcherTest.php b/tests/Matcher/UuidMatcherTest.php index d07b2225..eefc456c 100644 --- a/tests/Matcher/UuidMatcherTest.php +++ b/tests/Matcher/UuidMatcherTest.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Tests\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Lexer; use Coduo\PHPMatcher\Parser; use Coduo\PHPMatcher\Matcher\UuidMatcher; @@ -18,7 +19,7 @@ class UuidMatcherTest extends TestCase public function setUp() : void { - $this->matcher = new UuidMatcher(new Parser(new Lexer(), new Parser\ExpanderInitializer())); + $this->matcher = new UuidMatcher(new Backtrace(), new Parser(new Lexer(), new Parser\ExpanderInitializer())); } /** * @dataProvider positiveCanMatchData diff --git a/tests/Matcher/WildcardMatcherTest.php b/tests/Matcher/WildcardMatcherTest.php index 5703111d..52c8e97d 100644 --- a/tests/Matcher/WildcardMatcherTest.php +++ b/tests/Matcher/WildcardMatcherTest.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Tests\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Matcher\WildcardMatcher; use PHPUnit\Framework\TestCase; @@ -15,7 +16,7 @@ class WildcardMatcherTest extends TestCase */ public function test_positive_match($pattern) { - $matcher = new WildcardMatcher(); + $matcher = new WildcardMatcher(new Backtrace()); $this->assertTrue($matcher->match('*', $pattern)); } @@ -24,13 +25,13 @@ public function test_positive_match($pattern) */ public function test_positive_can_match($pattern) { - $matcher = new WildcardMatcher(); + $matcher = new WildcardMatcher(new Backtrace()); $this->assertTrue($matcher->canMatch($pattern)); } public function test_negative_can_match() { - $matcher = new WildcardMatcher(); + $matcher = new WildcardMatcher(new Backtrace()); $this->assertFalse($matcher->canMatch('*')); } diff --git a/tests/Matcher/XmlMatcherTest.php b/tests/Matcher/XmlMatcherTest.php index 88234b3f..e41cb500 100644 --- a/tests/Matcher/XmlMatcherTest.php +++ b/tests/Matcher/XmlMatcherTest.php @@ -4,6 +4,7 @@ namespace Coduo\PHPMatcher\Tests\Matcher; +use Coduo\PHPMatcher\Backtrace; use Coduo\PHPMatcher\Lexer; use Coduo\PHPMatcher\Matcher; use Coduo\PHPMatcher\Parser; @@ -19,21 +20,26 @@ class XmlMatcherTest extends TestCase public function setUp() : void { $parser = new Parser(new Lexer(), new Parser\ExpanderInitializer()); - $scalarMatchers = new Matcher\ChainMatcher([ - new Matcher\CallbackMatcher(), - new Matcher\ExpressionMatcher(), - new Matcher\NullMatcher(), - new Matcher\StringMatcher($parser), - new Matcher\IntegerMatcher($parser), - new Matcher\BooleanMatcher($parser), - new Matcher\DoubleMatcher($parser), - new Matcher\NumberMatcher($parser), - new Matcher\ScalarMatcher(), - new Matcher\WildcardMatcher(), - ]); + $scalarMatchers = new Matcher\ChainMatcher( + self::class, + $backtrace = new Backtrace(), + [ + new Matcher\CallbackMatcher($backtrace), + new Matcher\ExpressionMatcher($backtrace), + new Matcher\NullMatcher($backtrace), + new Matcher\StringMatcher($backtrace, $parser), + new Matcher\IntegerMatcher($backtrace, $parser), + new Matcher\BooleanMatcher($backtrace, $parser), + new Matcher\DoubleMatcher($backtrace, $parser), + new Matcher\NumberMatcher($backtrace, $parser), + new Matcher\ScalarMatcher($backtrace), + new Matcher\WildcardMatcher($backtrace), + ] + ); $this->matcher = new Matcher\XmlMatcher( - new Matcher\ArrayMatcher($scalarMatchers, $parser) + new Matcher\ArrayMatcher($scalarMatchers, $backtrace, $parser), + $backtrace ); } diff --git a/tests/PHPUnit/PHPMatcherConstraintTest.php b/tests/PHPUnit/PHPMatcherConstraintTest.php index bdfbe648..4cf2288b 100644 --- a/tests/PHPUnit/PHPMatcherConstraintTest.php +++ b/tests/PHPUnit/PHPMatcherConstraintTest.php @@ -5,13 +5,15 @@ namespace Coduo\PHPMatcher\Tests\PHPUnit; use Coduo\PHPMatcher\PHPUnit\PHPMatcherConstraint; +use PHPUnit\Framework\AssertionFailedError; +use PHPUnit\Framework\Constraint\Constraint; use PHPUnit\Framework\TestCase; class PHPMatcherConstraintTest extends TestCase { public function test_it_is_a_phpunit_constraint() { - $this->assertInstanceOf('PHPUnit\Framework\Constraint\Constraint', new PHPMatcherConstraint('@string@')); + $this->assertInstanceOf(Constraint::class, new PHPMatcherConstraint('@string@')); } public function test_it_returns_true_if_a_value_matches_the_pattern() @@ -30,7 +32,7 @@ public function test_it_returns_false_if_a_value_does_not_match_the_pattern() public function test_it_sets_a_failure_description_if_not_given() { - $this->expectException(\PHPUnit\Framework\AssertionFailedError::class); + $this->expectException(AssertionFailedError::class); $this->expectExceptionMessage('Failed asserting that 42 matches the pattern'); $constraint = new PHPMatcherConstraint('@string@'); @@ -40,7 +42,7 @@ public function test_it_sets_a_failure_description_if_not_given() public function test_it_sets_additional_failure_description() { - $this->expectException(\PHPUnit\Framework\AssertionFailedError::class); + $this->expectException(AssertionFailedError::class); $this->expectExceptionMessage('integer "42" is not a valid string'); $constraint = new PHPMatcherConstraint('@string@');