Commit 30e8f31b authored by catch's avatar catch

Issue #2950132 by mondrake, alexpott, tom_ek, Gábor Hojtsy, Pasqualle,...

Issue #2950132 by mondrake, alexpott, tom_ek, Gábor Hojtsy, Pasqualle, andypost, Mile23, larowlan: Support PHPUnit 7 optionally in Drupal 8, while keeping support for ^6.5

(cherry picked from commit bcee1df18c22a486bf92f489c195bbf9cceb0679)
parent 9a82f42a
......@@ -18,7 +18,7 @@
"jcalderonzumba/gastonjs": "^1.0.2",
"jcalderonzumba/mink-phantomjs-driver": "^0.3.1",
"mikey179/vfsstream": "^1.2",
"phpunit/phpunit": "^6.5",
"phpunit/phpunit": "^6.5 || ^7",
"phpspec/prophecy": "^1.7",
"symfony/css-selector": "^3.4.0",
"symfony/phpunit-bridge": "^3.4.3",
......@@ -73,6 +73,8 @@
"pre-install-cmd": "Drupal\\Core\\Composer\\Composer::ensureComposerVersion",
"pre-update-cmd": "Drupal\\Core\\Composer\\Composer::ensureComposerVersion",
"pre-autoload-dump": "Drupal\\Core\\Composer\\Composer::preAutoloadDump",
"drupal-phpunit-upgrade-check": "Drupal\\Core\\Composer\\Composer::upgradePHPUnit",
"drupal-phpunit-upgrade": "@composer update phpunit/phpunit symfony/phpunit-bridge phpspec/prophecy symfony/yaml --with-dependencies --no-progress",
"phpcs": "phpcs --standard=core/phpcs.xml.dist --runtime-set installed_paths $($COMPOSER_BINARY config vendor-dir)/drupal/coder/coder_sniffer --",
"phpcbf": "phpcbf --standard=core/phpcs.xml.dist --runtime-set installed_paths $($COMPOSER_BINARY config vendor-dir)/drupal/coder/coder_sniffer --"
},
......
......@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "63b940ec40ef24930a101dfce6eed82a",
"content-hash": "8ba406bd7f3522d51f0e55fe33e51aff",
"packages": [
{
"name": "asm89/stack-cors",
......@@ -4725,8 +4725,8 @@
"authors": [
{
"name": "Sebastian Bergmann",
"role": "lead",
"email": "sebastian@phpunit.de"
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
......@@ -4773,8 +4773,8 @@
"authors": [
{
"name": "Sebastian Bergmann",
"role": "lead",
"email": "sb@sebastian-bergmann.de"
"email": "sb@sebastian-bergmann.de",
"role": "lead"
}
],
"description": "FilterIterator implementation that filters files based on a list of suffixes.",
......@@ -4864,8 +4864,8 @@
"authors": [
{
"name": "Sebastian Bergmann",
"role": "lead",
"email": "sb@sebastian-bergmann.de"
"email": "sb@sebastian-bergmann.de",
"role": "lead"
}
],
"description": "Utility class for timing",
......@@ -4995,8 +4995,8 @@
"authors": [
{
"name": "Sebastian Bergmann",
"role": "lead",
"email": "sebastian@phpunit.de"
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "The PHP Unit Testing framework.",
......
......@@ -286,4 +286,46 @@ protected static function deleteRecursive($path) {
return rmdir($path) && $success;
}
/**
* Fires the drupal-phpunit-upgrade script event if necessary.
*
* @param \Composer\Script\Event $event
*/
public static function upgradePHPUnit(Event $event) {
$repository = $event->getComposer()->getRepositoryManager()->getLocalRepository();
// This is, essentially, a null constraint. We only care whether the package
// is present in the vendor directory yet, but findPackage() requires it.
$constraint = new Constraint('>', '');
$phpunit_package = $repository->findPackage('phpunit/phpunit', $constraint);
if (!$phpunit_package) {
// There is nothing to do. The user is probably installing using the
// --no-dev flag.
return;
}
// If the PHP version is 7.3 or above and PHPUnit is less than version 7
// call the drupal-phpunit-upgrade script to upgrade PHPUnit.
if (!static::upgradePHPUnitCheck($phpunit_package->getVersion())) {
$event->getComposer()
->getEventDispatcher()
->dispatchScript('drupal-phpunit-upgrade');
}
}
/**
* Determines if PHPUnit needs to be upgraded.
*
* This method is located in this file because it is possible that it is
* called before the autoloader is available.
*
* @param string $phpunit_version
* The PHPUnit version string.
*
* @return bool
* TRUE if the PHPUnit needs to be upgraded, FALSE if not.
*/
public static function upgradePHPUnitCheck($phpunit_version) {
return !(version_compare(PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION, '7.3') >= 0 && version_compare($phpunit_version, '7.0') < 0);
}
}
......@@ -85,6 +85,7 @@ public function registerTestNamespaces() {
$this->testNamespaces['Drupal\\KernelTests\\'] = [$this->root . '/core/tests/Drupal/KernelTests'];
$this->testNamespaces['Drupal\\FunctionalTests\\'] = [$this->root . '/core/tests/Drupal/FunctionalTests'];
$this->testNamespaces['Drupal\\FunctionalJavascriptTests\\'] = [$this->root . '/core/tests/Drupal/FunctionalJavascriptTests'];
$this->testNamespaces['Drupal\\TestTools\\'] = [$this->root . '/core/tests/Drupal/TestTools'];
$this->availableExtensions = [];
foreach ($this->getExtensions() as $name => $extension) {
......
......@@ -72,8 +72,8 @@ public function testNumberItem() {
$this->assertEqual($entity->field_float[0]->value, $float);
$this->assertTrue($entity->field_decimal instanceof FieldItemListInterface, 'Field implements interface.');
$this->assertTrue($entity->field_decimal[0] instanceof FieldItemInterface, 'Field item implements interface.');
$this->assertEqual($entity->field_decimal->value, $decimal);
$this->assertEqual($entity->field_decimal[0]->value, $decimal);
$this->assertEqual($entity->field_decimal->value, (float) $decimal);
$this->assertEqual($entity->field_decimal[0]->value, (float) $decimal);
// Verify changing the number value.
$new_integer = rand(11, 20);
......@@ -84,14 +84,14 @@ public function testNumberItem() {
$entity->field_float->value = $new_float;
$this->assertEqual($entity->field_float->value, $new_float);
$entity->field_decimal->value = $new_decimal;
$this->assertEqual($entity->field_decimal->value, $new_decimal);
$this->assertEqual($entity->field_decimal->value, (float) $new_decimal);
// Read changed entity and assert changed values.
$entity->save();
$entity = EntityTest::load($id);
$this->assertEqual($entity->field_integer->value, $new_integer);
$this->assertEqual($entity->field_float->value, $new_float);
$this->assertEqual($entity->field_decimal->value, $new_decimal);
$this->assertEqual($entity->field_decimal->value, (float) $new_decimal);
// Test sample item generation.
$entity = EntityTest::create();
......
......@@ -3,6 +3,7 @@
namespace Drupal\Tests\file\Functional;
use Drupal\Component\Render\FormattableMarkup;
use Drupal\TestTools\PhpUnitCompatibility\RunnerVersion;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\field\Entity\FieldConfig;
use Drupal\file\FileInterface;
......@@ -10,6 +11,13 @@
use Drupal\file\Entity\File;
use Drupal\Tests\TestFileCreationTrait;
// In order to manage different method signatures between PHPUnit versions, we
// dynamically load a compatibility trait dependent on the PHPUnit runner
// version.
if (!trait_exists(PhpunitVersionDependentFileFieldTestBaseTrait::class, FALSE)) {
class_alias("Drupal\TestTools\PhpUnitCompatibility\PhpUnit" . RunnerVersion::getMajor() . "\FileFieldTestBaseTrait", PhpunitVersionDependentFileFieldTestBaseTrait::class);
}
/**
* Provides methods specifically for testing File module's field handling.
*/
......@@ -19,6 +27,7 @@ abstract class FileFieldTestBase extends BrowserTestBase {
use TestFileCreationTrait {
getTestFiles as drupalGetTestFiles;
}
use PhpunitVersionDependentFileFieldTestBaseTrait;
/**
* {@inheritdoc}
......@@ -200,28 +209,6 @@ public function replaceNodeFile($file, $field_name, $nid, $new_revision = TRUE)
$this->drupalPostForm(NULL, $edit, t('Save'));
}
/**
* Asserts that a file exists physically on disk.
*
* Overrides PHPUnit\Framework\Assert::assertFileExists() to also work with
* file entities.
*
* @param \Drupal\File\FileInterface|string $file
* Either the file entity or the file URI.
* @param string $message
* (optional) A message to display with the assertion.
*
* @see https://www.drupal.org/node/3057326
*/
public static function assertFileExists($file, $message = NULL) {
if ($file instanceof FileInterface) {
@trigger_error('Passing a File entity as $file argument to FileFieldTestBase::assertFileExists is deprecated in drupal:8.8.0. It will be removed from drupal:9.0.0. Instead, pass the File entity URI via File::getFileUri(). See https://www.drupal.org/node/3057326', E_USER_DEPRECATED);
$file = $file->getFileUri();
}
$message = isset($message) ? $message : new FormattableMarkup('File %file exists on the disk.', ['%file' => $file]);
parent::assertFileExists($file, $message);
}
/**
* Asserts that a file exists in the database.
*/
......@@ -232,28 +219,6 @@ public function assertFileEntryExists($file, $message = NULL) {
$this->assertEqual($db_file->getFileUri(), $file->getFileUri(), $message);
}
/**
* Asserts that a file does not exist on disk.
*
* Overrides PHPUnit\Framework\Assert::assertFileNotExists() to also work
* with file entities.
*
* @param \Drupal\File\FileInterface|string $file
* Either the file entity or the file URI.
* @param string $message
* (optional) A message to display with the assertion.
*
* @see https://www.drupal.org/node/3057326
*/
public static function assertFileNotExists($file, $message = NULL) {
if ($file instanceof FileInterface) {
@trigger_error('Passing a File entity as $file argument to FileFieldTestBase::assertFileNotExists is deprecated in drupal:8.8.0. It will be removed from drupal:9.0.0. Instead, pass the File entity URI via File::getFileUri(). See https://www.drupal.org/node/3057326', E_USER_DEPRECATED);
$file = $file->getFileUri();
}
$message = isset($message) ? $message : new FormattableMarkup('File %file exists on the disk.', ['%file' => $file]);
parent::assertFileNotExists($file, $message);
}
/**
* Asserts that a file does not exist in the database.
*/
......
......@@ -4,8 +4,10 @@
use Drupal\Component\Render\FormattableMarkup;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\TestTools\PhpUnitCompatibility\RunnerVersion;
use Drupal\field\Entity\FieldConfig;
use Drupal\file\Entity\File;
use Drupal\Tests\Traits\ExpectDeprecationTrait;
/**
* Tests validation functions such as file type, max file size, max size per
......@@ -15,6 +17,8 @@
*/
class FileFieldValidateTest extends FileFieldTestBase {
use ExpectDeprecationTrait;
/**
* Tests the required property on file fields.
*/
......@@ -193,10 +197,19 @@ public function testFileRemoval() {
*
* @group legacy
*
* @expectedDeprecation Passing a File entity as $file argument to FileFieldTestBase::assertFileExists is deprecated in drupal:8.8.0. It will be removed from drupal:9.0.0. Instead, pass the File entity URI via File::getFileUri(). See https://www.drupal.org/node/3057326
* @expectedDeprecation Passing a File entity as $file argument to FileFieldTestBase::assertFileNotExists is deprecated in drupal:8.8.0. It will be removed from drupal:9.0.0. Instead, pass the File entity URI via File::getFileUri(). See https://www.drupal.org/node/3057326
* @todo the expectedDeprecation annotation does not work if tests are marked
* skipped.
* @see https://github.com/symfony/symfony/pull/25757
*/
public function testAssertFileExistsDeprecation() {
if (RunnerVersion::getMajor() == 6) {
$this->expectDeprecation('Passing a File entity as $file argument to FileFieldTestBase::assertFileExists is deprecated in drupal:8.8.0. It will be removed from drupal:9.0.0. Instead, pass the File entity URI via File::getFileUri(). See https://www.drupal.org/node/3057326');
$this->expectDeprecation('Passing a File entity as $file argument to FileFieldTestBase::assertFileNotExists is deprecated in drupal:8.8.0. It will be removed from drupal:9.0.0. Instead, pass the File entity URI via File::getFileUri(). See https://www.drupal.org/node/3057326');
}
else {
$this->markTestSkipped('This test does not work in PHPUnit 7+ since assertFileExists only accepts string arguments for $file');
}
$node_storage = $this->container->get('entity.manager')->getStorage('node');
$type_name = 'article';
$field_name = 'file_test';
......
......@@ -111,7 +111,7 @@ public function testRevisionContextualLinks() {
$this->toggleContextualTriggerVisibility('main');
$contextual_button = $page->find('css', 'main .contextual button');
$this->assertEmpty(0, $contextual_button);
$this->assertEmpty(0, $contextual_button ?: '');
}
}
......@@ -158,7 +158,7 @@ public function testNode() {
$this->assertSame('2015-01-20T04:15:00', $node->field_date->value);
$this->assertSame('2015-01-20', $node->field_date_without_time->value);
$this->assertSame('2015-01-20', $node->field_datetime_without_time->value);
$this->assertEquals('1', $node->field_float->value);
$this->assertEquals(1, $node->field_float->value);
$this->assertEquals('5', $node->field_integer->value);
$this->assertEquals('Some more text', $node->field_text_list[0]->value);
$this->assertEquals('7', $node->field_integer_list[0]->value);
......
......@@ -8,6 +8,7 @@
use Drupal\Component\FileSystem\FileSystem;
use Drupal\Component\Utility\Html;
use Drupal\Component\Utility\Timer;
use Drupal\Core\Composer\Composer;
use Drupal\Core\Database\Database;
use Drupal\Core\File\Exception\FileException;
use Drupal\Core\Test\EnvironmentCleaner;
......@@ -17,6 +18,7 @@
use Drupal\Core\Test\TestRunnerKernel;
use Drupal\Core\Test\TestDiscovery;
use PHPUnit\Framework\TestCase;
use PHPUnit\Runner\Version;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Filesystem\Filesystem as SymfonyFilesystem;
use Symfony\Component\HttpFoundation\Request;
......@@ -149,6 +151,11 @@
exit(SIMPLETEST_SCRIPT_EXIT_SUCCESS);
}
if (!Composer::upgradePHPUnitCheck(Version::id())) {
simpletest_script_print_error("PHPUnit testing framework version 7 or greater is required when running on PHP 7.3 or greater. Run the command 'composer run-script drupal-phpunit-upgrade' in order to fix this.");
exit(SIMPLETEST_SCRIPT_EXIT_FAILURE);
}
$test_list = simpletest_script_get_test_list();
// Try to allocate unlimited time to run the tests.
......@@ -483,7 +490,24 @@ function simpletest_script_init() {
exit(SIMPLETEST_SCRIPT_EXIT_FAILURE);
}
// Detect if we're in the top-level process using the private 'execute-test'
// argument. Determine if being run on drupal.org's testing infrastructure
// using the presence of 'drupalci' in the sqlite argument.
// @todo https://www.drupal.org/project/drupalci_testbot/issues/2860941 Use
// better environment variable to detect DrupalCI.
if (!$args['execute-test'] && preg_match('/drupalci/', $args['sqlite'])) {
// Update PHPUnit if needed and possible. There is a later check once the
// autoloader is in place to ensure we're on the correct version. We need to
// do this before the autoloader is in place to ensure that it is correct.
$composer = ($composer = rtrim('\\' === DIRECTORY_SEPARATOR ? preg_replace('/[\r\n].*/', '', `where.exe composer.phar`) : `which composer.phar`))
? $php . ' ' . escapeshellarg($composer)
: 'composer';
passthru("$composer run-script drupal-phpunit-upgrade-check");
}
$autoloader = require_once __DIR__ . '/../../autoload.php';
// The PHPUnit compatibility layer needs to be available to autoload tests.
$autoloader->add('Drupal\\TestTools', __DIR__ . '/../tests');
// Get URL from arguments.
if (!empty($args['url'])) {
......
......@@ -27,30 +27,6 @@ protected function assert($actual, $message = '') {
parent::assertTrue((bool) $actual, $message);
}
/**
* @see \Drupal\simpletest\TestBase::assertTrue()
*/
public static function assertTrue($actual, $message = '') {
if (is_bool($actual)) {
parent::assertTrue($actual, $message);
}
else {
parent::assertNotEmpty($actual, $message);
}
}
/**
* @see \Drupal\simpletest\TestBase::assertFalse()
*/
public static function assertFalse($actual, $message = '') {
if (is_bool($actual)) {
parent::assertFalse($actual, $message);
}
else {
parent::assertEmpty($actual, $message);
}
}
/**
* @see \Drupal\simpletest\TestBase::assertEqual()
*
......@@ -58,7 +34,7 @@ public static function assertFalse($actual, $message = '') {
* instead.
*/
protected function assertEqual($actual, $expected, $message = '') {
$this->assertEquals($expected, $actual, $message);
$this->assertEquals($expected, $actual, (string) $message);
}
/**
......@@ -68,7 +44,7 @@ protected function assertEqual($actual, $expected, $message = '') {
* self::assertNotEquals() instead.
*/
protected function assertNotEqual($actual, $expected, $message = '') {
$this->assertNotEquals($expected, $actual, $message);
$this->assertNotEquals($expected, $actual, (string) $message);
}
/**
......@@ -78,7 +54,7 @@ protected function assertNotEqual($actual, $expected, $message = '') {
* instead.
*/
protected function assertIdentical($actual, $expected, $message = '') {
$this->assertSame($expected, $actual, $message);
$this->assertSame($expected, $actual, (string) $message);
}
/**
......@@ -88,7 +64,7 @@ protected function assertIdentical($actual, $expected, $message = '') {
* self::assertNotSame() instead.
*/
protected function assertNotIdentical($actual, $expected, $message = '') {
$this->assertNotSame($expected, $actual, $message);
$this->assertNotSame($expected, $actual, (string) $message);
}
/**
......@@ -101,7 +77,7 @@ protected function assertIdenticalObject($actual, $expected, $message = '') {
// Note: ::assertSame checks whether its the same object. ::assertEquals
// though compares
$this->assertEquals($expected, $actual, $message);
$this->assertEquals($expected, $actual, (string) $message);
}
/**
......
......@@ -64,7 +64,7 @@ public function providerTestThemeRenderAndAutoescape() {
'empty string unchanged' => ['', ''],
'simple string unchanged' => ['ab', 'ab'],
'int (scalar) cast to string' => [111, '111'],
'float (scalar) cast to string' => [2.10, '2.10'],
'float (scalar) cast to string' => [2.10, '2.1'],
'> is escaped' => ['>', '&gt;'],
'Markup EM tag is unchanged' => [Markup::create('<em>hi</em>'), '<em>hi</em>'],
'Markup SCRIPT tag is unchanged' => [Markup::create('<script>alert("hi");</script>'), '<script>alert("hi");</script>'],
......
......@@ -1096,16 +1096,4 @@ public function __sleep() {
return [];
}
/**
* {@inheritdoc}
*/
public static function assertEquals($expected, $actual, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = FALSE, $ignoreCase = FALSE) {
// Cast objects implementing MarkupInterface to string instead of
// relying on PHP casting them to string depending on what they are being
// comparing with.
$expected = static::castSafeStrings($expected);
$actual = static::castSafeStrings($actual);
parent::assertEquals($expected, $actual, $message, $delta, $maxDepth, $canonicalize, $ignoreCase);
}
}
<?php
namespace Drupal\TestTools\PhpUnitCompatibility\PhpUnit6;
use PHPUnit\Framework\Test;
use PHPUnit\Framework\TestListener;
use PHPUnit\Framework\TestListenerDefaultImplementation;
/**
* Listens to PHPUnit test runs.
*
* @internal
*/
class AfterSymfonyListener implements TestListener {
use TestListenerDefaultImplementation;
/**
* {@inheritdoc}
*/
public function endTest(Test $test, $time) {
restore_error_handler();
}
}
<?php
namespace Drupal\TestTools\PhpUnitCompatibility\PhpUnit6;
use Drupal\Tests\Listeners\DeprecationListenerTrait;
use Drupal\Tests\Listeners\DrupalComponentTestListenerTrait;
use Drupal\Tests\Listeners\DrupalStandardsListenerTrait;
use PHPUnit\Framework\TestListener;
use PHPUnit\Framework\TestListenerDefaultImplementation;
use PHPUnit\Framework\Test;
/**
* Listens to PHPUnit test runs.
*
* @internal
*/
class DrupalListener implements TestListener {
use TestListenerDefaultImplementation;
use DeprecationListenerTrait;
use DrupalComponentTestListenerTrait;
use DrupalStandardsListenerTrait;
/**
* {@inheritdoc}
*/
public function startTest(Test $test) {
$this->deprecationStartTest($test);
}
/**
* {@inheritdoc}
*/
public function endTest(Test $test, $time) {
$this->deprecationEndTest($test, $time);
$this->componentEndTest($test, $time);
$this->standardsEndTest($test, $time);
}
}
<?php
namespace Drupal\TestTools\PhpUnitCompatibility\PhpUnit6;
use Drupal\Component\Render\FormattableMarkup;
use Drupal\file\FileInterface;
/**
* Makes Drupal's test API forward compatible with multiple versions of PHPUnit.
*/
trait FileFieldTestBaseTrait {
/**
* Asserts that a file exists physically on disk.
*
* Overrides PHPUnit\Framework\Assert::assertFileExists() to also work with
* file entities.
*
* @param \Drupal\File\FileInterface|string $file
* Either the file entity or the file URI.
* @param string $message
* (optional) A message to display with the assertion.
*
* @see https://www.drupal.org/node/3057326
*/
public static function assertFileExists($file, $message = NULL) {
if ($file instanceof FileInterface) {
@trigger_error('Passing a File entity as $file argument to FileFieldTestBase::assertFileExists is deprecated in drupal:8.8.0. It will be removed from drupal:9.0.0. Instead, pass the File entity URI via File::getFileUri(). See https://www.drupal.org/node/3057326', E_USER_DEPRECATED);
$file = $file->getFileUri();
}
$message = isset($message) ? $message : new FormattableMarkup('File %file exists on the disk.', ['%file' => $file]);
parent::assertFileExists($file, $message);
}
/**
* Asserts that a file does not exist on disk.
*
* Overrides PHPUnit\Framework\Assert::assertFileNotExists() to also work
* with file entities.
*
* @param \Drupal\File\FileInterface|string $file
* Either the file entity or the file URI.
* @param string $message
* (optional) A message to display with the assertion.
*
* @see https://www.drupal.org/node/3057326
*/
public static function assertFileNotExists($file, $message = NULL) {
if ($file instanceof FileInterface) {
@trigger_error('Passing a File entity as $file argument to FileFieldTestBase::assertFileNotExists is deprecated in drupal:8.8.0. It will be removed from drupal:9.0.0. Instead, pass the File entity URI via File::getFileUri(). See https://www.drupal.org/node/3057326', E_USER_DEPRECATED);
$file = $file->getFileUri();
}
$message = isset($message) ? $message : new FormattableMarkup('File %file exists on the disk.', ['%file' => $file]);
parent::assertFileNotExists($file, $message);
}
}
<?php
namespace Drupal\TestTools\PhpUnitCompatibility\PhpUnit6;
use Drupal\Tests\Listeners\HtmlOutputPrinterTrait;
use PHPUnit\Framework\TestResult;
use PHPUnit\TextUI\ResultPrinter;
/**
* Defines a class for providing html output results for functional tests.
*
* @internal
*/
class HtmlOutputPrinter extends ResultPrinter {
use HtmlOutputPrinterTrait;
/**
* {@inheritdoc}
*/
public function printResult(TestResult $result) {
parent::printResult($result);
$this->printHtmlOutput();
}
}
<?php
namespace Drupal\TestTools\PhpUnitCompatibility\PhpUnit6;
/**
* Defines a class for providing html output links in the Simpletest UI.
*/
class SimpletestUiPrinter extends HtmlOutputPrinter {
/**
* {@inheritdoc}
*/
public function write($buffer) {
$this->simpletestUiWrite($buffer);
}
}
<?php
namespace Drupal\TestTools\PhpUnitCompatibility\PhpUnit6;
/**
* Makes Drupal's test API forward compatible with multiple versions of PHPUnit.
*/
trait StubTestSuiteBaseTrait {
/**
* {@inheritdoc}
*/
public function addTestFiles($filenames) {
// We stub addTestFiles() because the parent implementation can't deal with
// vfsStream-based filesystems due to an error in
// stream_resolve_include_path(). See
// https://github.com/mikey179/vfsStream/issues/5 Here we just store the
// test file being added in $this->testFiles.
$this->testFiles = array_merge($this->testFiles, $filenames);
}
}
<?php
namespace Drupal\TestTools\PhpUnitCompatibility\PhpUnit6;
/**
* Makes Drupal's test API forward compatible with multiple versions of PHPUnit.
*/
trait TestCompatibilityTrait {
/**
* @todo deprecate this method override in
* https://www.drupal.org/project/drupal/issues/2742585
*
* @see \Drupal\simpletest\TestBase::assertTrue()
*/
public static function assertTrue($actual, $message = '') {
if (is_bool($actual)) {
parent::assertTrue($actual, $message);
}
else {
parent::assertNotEmpty($actual, $message);
}
}
/**
* @todo deprecate this method override in
* https://www.drupal.org/project/drupal/issues/2742585
*
* @see \Drupal\simpletest\TestBase::assertFalse()
*/
public static function assertFalse($actual, $message = '') {
if (is_bool($actual)) {
parent::assertFalse($actual, $message);
}
else {
parent::assertEmpty($actual, $message);
}
}
/**
* {@inheritdoc}
*/
public static function assertEquals($expected, $actual, $message = '', $delta = 0, $maxDepth = 10, $canonicalize = FALSE, $ignoreCase = FALSE) {
// Cast objects implementing MarkupInterface to string instead of