Viewing file: ObjectEquals.php (4.42 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\Constraint;
use function get_class; use function is_object; use PHPUnit\Framework\ActualValueIsNotAnObjectException; use PHPUnit\Framework\ComparisonMethodDoesNotAcceptParameterTypeException; use PHPUnit\Framework\ComparisonMethodDoesNotDeclareBoolReturnTypeException; use PHPUnit\Framework\ComparisonMethodDoesNotDeclareExactlyOneParameterException; use PHPUnit\Framework\ComparisonMethodDoesNotDeclareParameterTypeException; use PHPUnit\Framework\ComparisonMethodDoesNotExistException; use ReflectionNamedType; use ReflectionObject;
/** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit */ final class ObjectEquals extends Constraint { /** * @var object */ private $expected;
/** * @var string */ private $method;
public function __construct(object $object, string $method = 'equals') { $this->expected = $object; $this->method = $method; }
public function toString(): string { return 'two objects are equal'; }
/** * @throws ActualValueIsNotAnObjectException * @throws ComparisonMethodDoesNotAcceptParameterTypeException * @throws ComparisonMethodDoesNotDeclareBoolReturnTypeException * @throws ComparisonMethodDoesNotDeclareExactlyOneParameterException * @throws ComparisonMethodDoesNotDeclareParameterTypeException * @throws ComparisonMethodDoesNotExistException */ protected function matches($other): bool { if (!is_object($other)) { throw new ActualValueIsNotAnObjectException; }
$object = new ReflectionObject($other);
if (!$object->hasMethod($this->method)) { throw new ComparisonMethodDoesNotExistException( get_class($other), $this->method ); }
/** @noinspection PhpUnhandledExceptionInspection */ $method = $object->getMethod($this->method);
if (!$method->hasReturnType()) { throw new ComparisonMethodDoesNotDeclareBoolReturnTypeException( get_class($other), $this->method ); }
$returnType = $method->getReturnType();
if (!$returnType instanceof ReflectionNamedType) { throw new ComparisonMethodDoesNotDeclareBoolReturnTypeException( get_class($other), $this->method ); }
if ($returnType->allowsNull()) { throw new ComparisonMethodDoesNotDeclareBoolReturnTypeException( get_class($other), $this->method ); }
if ($returnType->getName() !== 'bool') { throw new ComparisonMethodDoesNotDeclareBoolReturnTypeException( get_class($other), $this->method ); }
if ($method->getNumberOfParameters() !== 1 || $method->getNumberOfRequiredParameters() !== 1) { throw new ComparisonMethodDoesNotDeclareExactlyOneParameterException( get_class($other), $this->method ); }
$parameter = $method->getParameters()[0];
if (!$parameter->hasType()) { throw new ComparisonMethodDoesNotDeclareParameterTypeException( get_class($other), $this->method ); }
$type = $parameter->getType();
if (!$type instanceof ReflectionNamedType) { throw new ComparisonMethodDoesNotDeclareParameterTypeException( get_class($other), $this->method ); }
$typeName = $type->getName();
if ($typeName === 'self') { $typeName = get_class($other); }
if (!$this->expected instanceof $typeName) { throw new ComparisonMethodDoesNotAcceptParameterTypeException( get_class($other), $this->method, get_class($this->expected) ); }
return $other->{$this->method}($this->expected); }
protected function failureDescription($other): string { return $this->toString(); } }
|