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.
162 lines
3.5 KiB
162 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\Runner;
|
|
|
|
use function is_dir;
|
|
use function is_file;
|
|
use function substr;
|
|
use PHPUnit\Framework\Exception;
|
|
use PHPUnit\Framework\TestSuite;
|
|
use ReflectionClass;
|
|
use ReflectionException;
|
|
use SebastianBergmann\FileIterator\Facade as FileIteratorFacade;
|
|
|
|
/**
|
|
* @internal This class is not covered by the backward compatibility promise for PHPUnit
|
|
*/
|
|
abstract class BaseTestRunner
|
|
{
|
|
/**
|
|
* @var int
|
|
*/
|
|
public const STATUS_UNKNOWN = -1;
|
|
|
|
/**
|
|
* @var int
|
|
*/
|
|
public const STATUS_PASSED = 0;
|
|
|
|
/**
|
|
* @var int
|
|
*/
|
|
public const STATUS_SKIPPED = 1;
|
|
|
|
/**
|
|
* @var int
|
|
*/
|
|
public const STATUS_INCOMPLETE = 2;
|
|
|
|
/**
|
|
* @var int
|
|
*/
|
|
public const STATUS_FAILURE = 3;
|
|
|
|
/**
|
|
* @var int
|
|
*/
|
|
public const STATUS_ERROR = 4;
|
|
|
|
/**
|
|
* @var int
|
|
*/
|
|
public const STATUS_RISKY = 5;
|
|
|
|
/**
|
|
* @var int
|
|
*/
|
|
public const STATUS_WARNING = 6;
|
|
|
|
/**
|
|
* @var string
|
|
*/
|
|
public const SUITE_METHODNAME = 'suite';
|
|
|
|
/**
|
|
* Returns the loader to be used.
|
|
*/
|
|
public function getLoader(): TestSuiteLoader
|
|
{
|
|
return new StandardTestSuiteLoader;
|
|
}
|
|
|
|
/**
|
|
* Returns the Test corresponding to the given suite.
|
|
* This is a template method, subclasses override
|
|
* the runFailed() and clearStatus() methods.
|
|
*
|
|
* @param string|string[] $suffixes
|
|
*
|
|
* @throws Exception
|
|
*/
|
|
public function getTest(string $suiteClassFile, $suffixes = ''): ?TestSuite
|
|
{
|
|
if (is_dir($suiteClassFile)) {
|
|
/** @var string[] $files */
|
|
$files = (new FileIteratorFacade)->getFilesAsArray(
|
|
$suiteClassFile,
|
|
$suffixes,
|
|
);
|
|
|
|
$suite = new TestSuite($suiteClassFile);
|
|
$suite->addTestFiles($files);
|
|
|
|
return $suite;
|
|
}
|
|
|
|
if (is_file($suiteClassFile) && substr($suiteClassFile, -5, 5) === '.phpt') {
|
|
$suite = new TestSuite;
|
|
$suite->addTestFile($suiteClassFile);
|
|
|
|
return $suite;
|
|
}
|
|
|
|
try {
|
|
$testClass = $this->loadSuiteClass(
|
|
$suiteClassFile,
|
|
);
|
|
} catch (\PHPUnit\Exception $e) {
|
|
$this->runFailed($e->getMessage());
|
|
|
|
return null;
|
|
}
|
|
|
|
try {
|
|
$suiteMethod = $testClass->getMethod(self::SUITE_METHODNAME);
|
|
|
|
if (!$suiteMethod->isStatic()) {
|
|
$this->runFailed(
|
|
'suite() method must be static.',
|
|
);
|
|
|
|
return null;
|
|
}
|
|
|
|
$test = $suiteMethod->invoke(null, $testClass->getName());
|
|
} catch (ReflectionException $e) {
|
|
$test = new TestSuite($testClass);
|
|
}
|
|
|
|
$this->clearStatus();
|
|
|
|
return $test;
|
|
}
|
|
|
|
/**
|
|
* Returns the loaded ReflectionClass for a suite name.
|
|
*/
|
|
protected function loadSuiteClass(string $suiteClassFile): ReflectionClass
|
|
{
|
|
return $this->getLoader()->load($suiteClassFile);
|
|
}
|
|
|
|
/**
|
|
* Clears the status message.
|
|
*/
|
|
protected function clearStatus(): void
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Override to define how to handle a failed loading of
|
|
* a test suite.
|
|
*/
|
|
abstract protected function runFailed(string $message): void;
|
|
}
|