Viewing file: Matcher.php (7.52 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php declare(strict_types=1); /* * This file is part of PHPUnit. * * (c) Sebastian Bergmann <sebastian@phpunit.de> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace PHPUnit\Framework\MockObject;
use function assert; use function implode; use function sprintf; use PHPUnit\Framework\ExpectationFailedException; use PHPUnit\Framework\MockObject\Rule\AnyInvokedCount; use PHPUnit\Framework\MockObject\Rule\AnyParameters; use PHPUnit\Framework\MockObject\Rule\InvocationOrder; use PHPUnit\Framework\MockObject\Rule\InvokedAtMostCount; use PHPUnit\Framework\MockObject\Rule\InvokedCount; use PHPUnit\Framework\MockObject\Rule\MethodName; use PHPUnit\Framework\MockObject\Rule\ParametersRule; use PHPUnit\Framework\MockObject\Stub\Stub; use PHPUnit\Framework\TestFailure;
/** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class Matcher { /** * @var InvocationOrder */ private $invocationRule;
/** * @var mixed */ private $afterMatchBuilderId;
/** * @var bool */ private $afterMatchBuilderIsInvoked = false;
/** * @var MethodName */ private $methodNameRule;
/** * @var ParametersRule */ private $parametersRule;
/** * @var Stub */ private $stub;
public function __construct(InvocationOrder $rule) { $this->invocationRule = $rule; }
public function hasMatchers(): bool { return !$this->invocationRule instanceof AnyInvokedCount; }
public function hasMethodNameRule(): bool { return $this->methodNameRule !== null; }
public function getMethodNameRule(): MethodName { return $this->methodNameRule; }
public function setMethodNameRule(MethodName $rule): void { $this->methodNameRule = $rule; }
public function hasParametersRule(): bool { return $this->parametersRule !== null; }
public function setParametersRule(ParametersRule $rule): void { $this->parametersRule = $rule; }
public function setStub(Stub $stub): void { $this->stub = $stub; }
public function setAfterMatchBuilderId(string $id): void { $this->afterMatchBuilderId = $id; }
/** * @throws ExpectationFailedException * @throws MatchBuilderNotFoundException * @throws MethodNameNotConfiguredException * @throws RuntimeException */ public function invoked(Invocation $invocation) { if ($this->methodNameRule === null) { throw new MethodNameNotConfiguredException; }
if ($this->afterMatchBuilderId !== null) { $matcher = $invocation->getObject() ->__phpunit_getInvocationHandler() ->lookupMatcher($this->afterMatchBuilderId);
if (!$matcher) { throw new MatchBuilderNotFoundException($this->afterMatchBuilderId); }
assert($matcher instanceof self);
if ($matcher->invocationRule->hasBeenInvoked()) { $this->afterMatchBuilderIsInvoked = true; } }
$this->invocationRule->invoked($invocation);
try { if ($this->parametersRule !== null) { $this->parametersRule->apply($invocation); } } catch (ExpectationFailedException $e) { throw new ExpectationFailedException( sprintf( "Expectation failed for %s when %s\n%s", $this->methodNameRule->toString(), $this->invocationRule->toString(), $e->getMessage(), ), $e->getComparisonFailure(), ); }
if ($this->stub) { return $this->stub->invoke($invocation); }
return $invocation->generateReturnValue(); }
/** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * @throws MatchBuilderNotFoundException * @throws MethodNameNotConfiguredException * @throws RuntimeException */ public function matches(Invocation $invocation): bool { if ($this->afterMatchBuilderId !== null) { $matcher = $invocation->getObject() ->__phpunit_getInvocationHandler() ->lookupMatcher($this->afterMatchBuilderId);
if (!$matcher) { throw new MatchBuilderNotFoundException($this->afterMatchBuilderId); }
assert($matcher instanceof self);
if (!$matcher->invocationRule->hasBeenInvoked()) { return false; } }
if ($this->methodNameRule === null) { throw new MethodNameNotConfiguredException; }
if (!$this->invocationRule->matches($invocation)) { return false; }
try { if (!$this->methodNameRule->matches($invocation)) { return false; } } catch (ExpectationFailedException $e) { throw new ExpectationFailedException( sprintf( "Expectation failed for %s when %s\n%s", $this->methodNameRule->toString(), $this->invocationRule->toString(), $e->getMessage(), ), $e->getComparisonFailure(), ); }
return true; }
/** * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException * @throws MethodNameNotConfiguredException */ public function verify(): void { if ($this->methodNameRule === null) { throw new MethodNameNotConfiguredException; }
try { $this->invocationRule->verify();
if ($this->parametersRule === null) { $this->parametersRule = new AnyParameters; }
$invocationIsAny = $this->invocationRule instanceof AnyInvokedCount; $invocationIsNever = $this->invocationRule instanceof InvokedCount && $this->invocationRule->isNever(); $invocationIsAtMost = $this->invocationRule instanceof InvokedAtMostCount;
if (!$invocationIsAny && !$invocationIsNever && !$invocationIsAtMost) { $this->parametersRule->verify(); } } catch (ExpectationFailedException $e) { throw new ExpectationFailedException( sprintf( "Expectation failed for %s when %s.\n%s", $this->methodNameRule->toString(), $this->invocationRule->toString(), TestFailure::exceptionToString($e), ), ); } }
public function toString(): string { $list = [];
if ($this->invocationRule !== null) { $list[] = $this->invocationRule->toString(); }
if ($this->methodNameRule !== null) { $list[] = 'where ' . $this->methodNameRule->toString(); }
if ($this->parametersRule !== null) { $list[] = 'and ' . $this->parametersRule->toString(); }
if ($this->afterMatchBuilderId !== null) { $list[] = 'after ' . $this->afterMatchBuilderId; }
if ($this->stub !== null) { $list[] = 'will ' . $this->stub->toString(); }
return implode(' ', $list); } }
|