wiki.techinc.nl/tests/phpunit/suites/SuiteEventsTrait.php
libraryupgrader 5357695270 build: Updating dependencies
composer:
* mediawiki/mediawiki-codesniffer: 36.0.0 → 37.0.0
  The following sniffs now pass and were enabled:
  * Generic.ControlStructures.InlineControlStructure
  * MediaWiki.PHPUnit.AssertCount.NotUsed

npm:
* svgo: 2.3.0 → 2.3.1
  * https://npmjs.com/advisories/1754 (CVE-2021-33587)

Change-Id: I2a9bbee2fecbf7259876d335f565ece4b3622426
2021-07-22 03:36:05 +00:00

92 lines
2.5 KiB
PHP

<?php
use PHPUnit\Framework\SkippedTestError;
use PHPUnit\Framework\SkippedTestSuiteError;
use PHPUnit\Framework\SyntheticError;
use PHPUnit\Framework\TestResult;
/**
* Trait that returns to PHPUnit test suites the support for setUp/tearDown events that
* was removed in PHPUnit 8.
*
* @since 1.35
*/
trait SuiteEventsTrait {
/**
* @inheritDoc
*/
public function run( TestResult $result = null ): TestResult {
// setUp / tearDown handling based on code in TestSuite::run()
// (except in the parent only beforeClass / afterClass are run)
if ( $result === null ) {
$result = $this->createResult();
}
$calls = 0;
if ( is_callable( [ $this, 'setUp' ] ) ) {
$calls++;
try {
$this->setUp();
} catch ( SkippedTestSuiteError $error ) {
$result->startTestSuite( $this );
foreach ( $this->tests() as $test ) {
$result->startTest( $test );
$result->addFailure( $test, $error, 0 );
$result->endTest( $test, 0 );
}
$result->endTestSuite( $this );
return $result;
} catch ( \Throwable $t ) {
$errorAdded = false;
$result->startTestSuite( $this );
foreach ( $this->tests() as $test ) {
if ( $result->shouldStop() ) {
break;
}
$result->startTest( $test );
if ( !$errorAdded ) {
$result->addError( $test, $t, 0 );
$errorAdded = true;
} else {
$result->addFailure(
$test,
new SkippedTestError( 'Test skipped because of an error in setUp method' ),
0
);
}
$result->endTest( $test, 0 );
}
$result->endTestSuite( $this );
return $result;
}
}
$result = parent::run( $result );
if ( is_callable( [ $this, 'tearDown' ] ) ) {
$calls++;
try {
$this->tearDown();
} catch ( \Throwable $t ) {
$message = "Exception in tearDown" . \PHP_EOL . $t->getMessage();
$error = new SyntheticError( $message, 0, $t->getFile(), $t->getLine(), $t->getTrace() );
$placeholderTest = clone $this->testAt( 0 );
$placeholderTest->setName( 'tearDown' );
// Unlike in parent implementation, $result->endTestSuite() has
// already been invoked by parent::run, so we need to reopen
// the test suite
$result->startTestSuite( $this );
$result->startTest( $placeholderTest );
$result->addFailure( $placeholderTest, $error, 0 );
$result->endTest( $placeholderTest, 0 );
$result->endTestSuite( $this );
}
}
if ( !$calls ) {
throw new LogicException(
get_class( $this )
. " uses neither setUp() nor tearDown(), so it doesn't need SuiteEventsTrait"
);
}
return $result;
}
}