You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
3.5 KiB
156 lines
3.5 KiB
<?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;
|
|
|
|
use function get_class;
|
|
use function sprintf;
|
|
use function trim;
|
|
use PHPUnit\Framework\Error\Error;
|
|
use Throwable;
|
|
|
|
/**
|
|
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
|
*/
|
|
final class TestFailure
|
|
{
|
|
/**
|
|
* @var null|Test
|
|
*/
|
|
private $failedTest;
|
|
|
|
/**
|
|
* @var Throwable
|
|
*/
|
|
private $thrownException;
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
private $testName;
|
|
|
|
/**
|
|
* Returns a description for an exception.
|
|
*/
|
|
public static function exceptionToString(Throwable $e): string
|
|
{
|
|
if ($e instanceof SelfDescribing) {
|
|
$buffer = $e->toString();
|
|
|
|
if ($e instanceof ExpectationFailedException && $e->getComparisonFailure()) {
|
|
$buffer .= $e->getComparisonFailure()->getDiff();
|
|
}
|
|
|
|
if ($e instanceof PHPTAssertionFailedError) {
|
|
$buffer .= $e->getDiff();
|
|
}
|
|
|
|
if (!empty($buffer)) {
|
|
$buffer = trim($buffer) . "\n";
|
|
}
|
|
|
|
return $buffer;
|
|
}
|
|
|
|
if ($e instanceof Error) {
|
|
return $e->getMessage() . "\n";
|
|
}
|
|
|
|
if ($e instanceof ExceptionWrapper) {
|
|
return $e->getClassName() . ': ' . $e->getMessage() . "\n";
|
|
}
|
|
|
|
return get_class($e) . ': ' . $e->getMessage() . "\n";
|
|
}
|
|
|
|
/**
|
|
* Constructs a TestFailure with the given test and exception.
|
|
*/
|
|
public function __construct(Test $failedTest, Throwable $t)
|
|
{
|
|
if ($failedTest instanceof SelfDescribing) {
|
|
$this->testName = $failedTest->toString();
|
|
} else {
|
|
$this->testName = get_class($failedTest);
|
|
}
|
|
|
|
if (!$failedTest instanceof TestCase || !$failedTest->isInIsolation()) {
|
|
$this->failedTest = $failedTest;
|
|
}
|
|
|
|
$this->thrownException = $t;
|
|
}
|
|
|
|
/**
|
|
* Returns a short description of the failure.
|
|
*/
|
|
public function toString(): string
|
|
{
|
|
return sprintf(
|
|
'%s: %s',
|
|
$this->testName,
|
|
$this->thrownException->getMessage(),
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Returns a description for the thrown exception.
|
|
*/
|
|
public function getExceptionAsString(): string
|
|
{
|
|
return self::exceptionToString($this->thrownException);
|
|
}
|
|
|
|
/**
|
|
* Returns the name of the failing test (including data set, if any).
|
|
*/
|
|
public function getTestName(): string
|
|
{
|
|
return $this->testName;
|
|
}
|
|
|
|
/**
|
|
* Returns the failing test.
|
|
*
|
|
* Note: The test object is not set when the test is executed in process
|
|
* isolation.
|
|
*
|
|
* @see Exception
|
|
*/
|
|
public function failedTest(): ?Test
|
|
{
|
|
return $this->failedTest;
|
|
}
|
|
|
|
/**
|
|
* Gets the thrown exception.
|
|
*/
|
|
public function thrownException(): Throwable
|
|
{
|
|
return $this->thrownException;
|
|
}
|
|
|
|
/**
|
|
* Returns the exception's message.
|
|
*/
|
|
public function exceptionMessage(): string
|
|
{
|
|
return $this->thrownException()->getMessage();
|
|
}
|
|
|
|
/**
|
|
* Returns true if the thrown exception
|
|
* is of type AssertionFailedError.
|
|
*/
|
|
public function isFailure(): bool
|
|
{
|
|
return $this->thrownException() instanceof AssertionFailedError;
|
|
}
|
|
}
|