Mercurial > hg > isophonics-drupal-site
diff vendor/phpunit/phpunit-mock-objects/src/Builder/InvocationMocker.php @ 14:1fec387a4317
Update Drupal core to 8.5.2 via Composer
author | Chris Cannam |
---|---|
date | Mon, 23 Apr 2018 09:46:53 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/phpunit/phpunit-mock-objects/src/Builder/InvocationMocker.php Mon Apr 23 09:46:53 2018 +0100 @@ -0,0 +1,299 @@ +<?php +/* + * This file is part of the phpunit-mock-objects package. + * + * (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\Builder; + +use PHPUnit\Framework\Constraint\Constraint; +use PHPUnit\Framework\MockObject\Matcher; +use PHPUnit\Framework\MockObject\Matcher\Invocation; +use PHPUnit\Framework\MockObject\RuntimeException; +use PHPUnit\Framework\MockObject\Stub; +use PHPUnit\Framework\MockObject\Stub\MatcherCollection; + +/** + * Builder for mocked or stubbed invocations. + * + * Provides methods for building expectations without having to resort to + * instantiating the various matchers manually. These methods also form a + * more natural way of reading the expectation. This class should be together + * with the test case PHPUnit\Framework\MockObject\TestCase. + */ +class InvocationMocker implements MethodNameMatch +{ + /** + * @var MatcherCollection + */ + private $collection; + + /** + * @var Matcher + */ + private $matcher; + + /** + * @var string[] + */ + private $configurableMethods = []; + + /** + * @param MatcherCollection $collection + * @param Invocation $invocationMatcher + * @param array $configurableMethods + */ + public function __construct(MatcherCollection $collection, Invocation $invocationMatcher, array $configurableMethods) + { + $this->collection = $collection; + $this->matcher = new Matcher($invocationMatcher); + + $this->collection->addMatcher($this->matcher); + + $this->configurableMethods = $configurableMethods; + } + + /** + * @return Matcher + */ + public function getMatcher() + { + return $this->matcher; + } + + /** + * @param mixed $id + * + * @return InvocationMocker + */ + public function id($id) + { + $this->collection->registerId($id, $this); + + return $this; + } + + /** + * @param Stub $stub + * + * @return InvocationMocker + */ + public function will(Stub $stub) + { + $this->matcher->setStub($stub); + + return $this; + } + + /** + * @param mixed $value + * @param mixed $nextValues, ... + * + * @return InvocationMocker + */ + public function willReturn($value, ...$nextValues) + { + if (\count($nextValues) === 0) { + $stub = new Stub\ReturnStub($value); + } else { + $stub = new Stub\ConsecutiveCalls( + \array_merge([$value], $nextValues) + ); + } + + return $this->will($stub); + } + + /** + * @param mixed $reference + * + * @return InvocationMocker + */ + public function willReturnReference(&$reference) + { + $stub = new Stub\ReturnReference($reference); + + return $this->will($stub); + } + + /** + * @param array $valueMap + * + * @return InvocationMocker + */ + public function willReturnMap(array $valueMap) + { + $stub = new Stub\ReturnValueMap($valueMap); + + return $this->will($stub); + } + + /** + * @param mixed $argumentIndex + * + * @return InvocationMocker + */ + public function willReturnArgument($argumentIndex) + { + $stub = new Stub\ReturnArgument($argumentIndex); + + return $this->will($stub); + } + + /** + * @param callable $callback + * + * @return InvocationMocker + */ + public function willReturnCallback($callback) + { + $stub = new Stub\ReturnCallback($callback); + + return $this->will($stub); + } + + /** + * @return InvocationMocker + */ + public function willReturnSelf() + { + $stub = new Stub\ReturnSelf; + + return $this->will($stub); + } + + /** + * @param mixed $values, ... + * + * @return InvocationMocker + */ + public function willReturnOnConsecutiveCalls(...$values) + { + $stub = new Stub\ConsecutiveCalls($values); + + return $this->will($stub); + } + + /** + * @param \Exception $exception + * + * @return InvocationMocker + */ + public function willThrowException(\Exception $exception) + { + $stub = new Stub\Exception($exception); + + return $this->will($stub); + } + + /** + * @param mixed $id + * + * @return InvocationMocker + */ + public function after($id) + { + $this->matcher->setAfterMatchBuilderId($id); + + return $this; + } + + /** + * @param array ...$arguments + * + * @return InvocationMocker + * + * @throws RuntimeException + */ + public function with(...$arguments) + { + $this->canDefineParameters(); + + $this->matcher->setParametersMatcher(new Matcher\Parameters($arguments)); + + return $this; + } + + /** + * @param array ...$arguments + * + * @return InvocationMocker + * + * @throws RuntimeException + */ + public function withConsecutive(...$arguments) + { + $this->canDefineParameters(); + + $this->matcher->setParametersMatcher(new Matcher\ConsecutiveParameters($arguments)); + + return $this; + } + + /** + * @return InvocationMocker + * + * @throws RuntimeException + */ + public function withAnyParameters() + { + $this->canDefineParameters(); + + $this->matcher->setParametersMatcher(new Matcher\AnyParameters); + + return $this; + } + + /** + * @param Constraint|string $constraint + * + * @return InvocationMocker + * + * @throws RuntimeException + */ + public function method($constraint) + { + if ($this->matcher->hasMethodNameMatcher()) { + throw new RuntimeException( + 'Method name matcher is already defined, cannot redefine' + ); + } + + if (\is_string($constraint) && !\in_array(\strtolower($constraint), $this->configurableMethods)) { + throw new RuntimeException( + \sprintf( + 'Trying to configure method "%s" which cannot be configured because it does not exist, has not been specified, is final, or is static', + $constraint + ) + ); + } + + $this->matcher->setMethodNameMatcher(new Matcher\MethodName($constraint)); + + return $this; + } + + /** + * Validate that a parameters matcher can be defined, throw exceptions otherwise. + * + * @throws RuntimeException + */ + private function canDefineParameters() + { + if (!$this->matcher->hasMethodNameMatcher()) { + throw new RuntimeException( + 'Method name matcher is not defined, cannot define parameter ' . + 'matcher without one' + ); + } + + if ($this->matcher->hasParametersMatcher()) { + throw new RuntimeException( + 'Parameter matcher is already defined, cannot redefine' + ); + } + } +}