Mercurial > hg > isophonics-drupal-site
diff vendor/phpunit/phpunit-mock-objects/src/Invocation/StaticInvocation.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/Invocation/StaticInvocation.php Mon Apr 23 09:46:53 2018 +0100 @@ -0,0 +1,255 @@ +<?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\Invocation; + +use PHPUnit\Framework\MockObject\Generator; +use PHPUnit\Framework\MockObject\Invocation; +use PHPUnit\Framework\SelfDescribing; +use ReflectionObject; +use SebastianBergmann\Exporter\Exporter; + +/** + * Represents a static invocation. + */ +class StaticInvocation implements Invocation, SelfDescribing +{ + /** + * @var array + */ + private static $uncloneableExtensions = [ + 'mysqli' => true, + 'SQLite' => true, + 'sqlite3' => true, + 'tidy' => true, + 'xmlwriter' => true, + 'xsl' => true + ]; + + /** + * @var array + */ + private static $uncloneableClasses = [ + 'Closure', + 'COMPersistHelper', + 'IteratorIterator', + 'RecursiveIteratorIterator', + 'SplFileObject', + 'PDORow', + 'ZipArchive' + ]; + + /** + * @var string + */ + private $className; + + /** + * @var string + */ + private $methodName; + + /** + * @var array + */ + private $parameters; + + /** + * @var string + */ + private $returnType; + + /** + * @var bool + */ + private $isReturnTypeNullable = false; + + /** + * @param string $className + * @param string $methodName + * @param array $parameters + * @param string $returnType + * @param bool $cloneObjects + */ + public function __construct($className, $methodName, array $parameters, $returnType, $cloneObjects = false) + { + $this->className = $className; + $this->methodName = $methodName; + $this->parameters = $parameters; + + if (\strpos($returnType, '?') === 0) { + $returnType = \substr($returnType, 1); + $this->isReturnTypeNullable = true; + } + + $this->returnType = $returnType; + + if (!$cloneObjects) { + return; + } + + foreach ($this->parameters as $key => $value) { + if (\is_object($value)) { + $this->parameters[$key] = $this->cloneObject($value); + } + } + } + + public function getClassName(): string + { + return $this->className; + } + + public function getMethodName(): string + { + return $this->methodName; + } + + public function getParameters(): array + { + return $this->parameters; + } + + public function getReturnType(): string + { + return $this->returnType; + } + + public function isReturnTypeNullable(): bool + { + return $this->isReturnTypeNullable; + } + + /** + * @return mixed Mocked return value + * + * @throws \ReflectionException + * @throws \PHPUnit\Framework\MockObject\RuntimeException + * @throws \PHPUnit\Framework\Exception + */ + public function generateReturnValue() + { + if ($this->isReturnTypeNullable) { + return; + } + + switch (\strtolower($this->returnType)) { + case '': + case 'void': + return; + + case 'string': + return ''; + + case 'float': + return 0.0; + + case 'int': + return 0; + + case 'bool': + return false; + + case 'array': + return []; + + case 'object': + return new \stdClass; + + case 'callable': + case 'closure': + return function () { + }; + + case 'traversable': + case 'generator': + case 'iterable': + $generator = function () { + yield; + }; + + return $generator(); + + default: + $generator = new Generator; + + return $generator->getMock($this->returnType, [], [], '', false); + } + } + + public function toString(): string + { + $exporter = new Exporter; + + return \sprintf( + '%s::%s(%s)%s', + $this->className, + $this->methodName, + \implode( + ', ', + \array_map( + [$exporter, 'shortenedExport'], + $this->parameters + ) + ), + $this->returnType ? \sprintf(': %s', $this->returnType) : '' + ); + } + + /** + * @param object $original + * + * @return object + */ + private function cloneObject($original) + { + $cloneable = null; + $object = new ReflectionObject($original); + + // Check the blacklist before asking PHP reflection to work around + // https://bugs.php.net/bug.php?id=53967 + if ($object->isInternal() && + isset(self::$uncloneableExtensions[$object->getExtensionName()])) { + $cloneable = false; + } + + if ($cloneable === null) { + foreach (self::$uncloneableClasses as $class) { + if ($original instanceof $class) { + $cloneable = false; + + break; + } + } + } + + if ($cloneable === null) { + $cloneable = $object->isCloneable(); + } + + if ($cloneable === null && $object->hasMethod('__clone')) { + $method = $object->getMethod('__clone'); + $cloneable = $method->isPublic(); + } + + if ($cloneable === null) { + $cloneable = true; + } + + if ($cloneable) { + try { + return clone $original; + } catch (\Exception $e) { + return $original; + } + } else { + return $original; + } + } +}