diff --git a/composer.json b/composer.json index 63b08d9a..e7a0e7bc 100644 --- a/composer.json +++ b/composer.json @@ -21,7 +21,7 @@ "composer/composer": "^1.9.1", "drupal/coder": "^8.3.7", "mikey179/vfsstream": "^1.6.8", - "phpunit/phpunit": "^8.4.1", + "phpunit/phpunit": "^8.4.1 || ^9", "phpspec/prophecy": "^1.7", "symfony/css-selector": "^4.4", "symfony/phpunit-bridge": "^5.1.4", @@ -93,7 +93,10 @@ "pre-update-cmd": "Drupal\\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", + "drupal-phpunit-upgrade": [ + "@composer update phpunit/phpunit --with-dependencies --no-progress", + "@composer require phpspec/prophecy-phpunit:^2 --no-progress --no-suggest" + ], "post-update-cmd": [ "Drupal\\Composer\\Composer::generateMetapackages" ], diff --git a/composer/Metapackage/DevDependencies/composer.json b/composer/Metapackage/DevDependencies/composer.json index 3c107300..a97129a6 100644 --- a/composer/Metapackage/DevDependencies/composer.json +++ b/composer/Metapackage/DevDependencies/composer.json @@ -16,7 +16,7 @@ "justinrainbow/json-schema": "^5.2", "mikey179/vfsstream": "^1.6.8", "phpspec/prophecy": "^1.7", - "phpunit/phpunit": "^8.4.1", + "phpunit/phpunit": "^8.4.1 || ^9", "symfony/browser-kit": "^4.4", "symfony/css-selector": "^4.4", "symfony/dom-crawler": "^4.4 !=4.4.5", diff --git a/core/lib/Drupal/Core/Composer/Composer.php b/core/lib/Drupal/Core/Composer/Composer.php index 6b7d5899..2f60ab9d 100644 --- a/core/lib/Drupal/Core/Composer/Composer.php +++ b/core/lib/Drupal/Core/Composer/Composer.php @@ -310,7 +310,7 @@ public static function upgradePHPUnit(Event $event) { return; } - // If the PHP version is 7.3 or above and PHPUnit is less than version 7 + // If the PHP version is 7.4 or above and PHPUnit is less than version 9 // call the drupal-phpunit-upgrade script to upgrade PHPUnit. if (!static::upgradePHPUnitCheck($phpunit_package->getVersion())) { $event->getComposer() @@ -332,7 +332,7 @@ public static function upgradePHPUnit(Event $event) { * 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); + return !(version_compare(PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION, '7.4') >= 0 && version_compare($phpunit_version, '9.0') < 0); } } diff --git a/core/modules/hal/tests/src/Kernel/EntityTranslationNormalizeTest.php b/core/modules/hal/tests/src/Kernel/EntityTranslationNormalizeTest.php index bd31f529..af1f10a2 100644 --- a/core/modules/hal/tests/src/Kernel/EntityTranslationNormalizeTest.php +++ b/core/modules/hal/tests/src/Kernel/EntityTranslationNormalizeTest.php @@ -70,8 +70,8 @@ public function testNodeTranslation() { $normalized = $this->serializer->normalize($node, $this->format); - $this->assertContains(['lang' => 'en', 'value' => $node->getTitle()], $normalized['title'], 'Original language title has been normalized.'); - $this->assertContains(['lang' => 'de', 'value' => $translation->getTitle()], $normalized['title'], 'Translation language title has been normalized.'); + $this->assertContainsEquals(['lang' => 'en', 'value' => $node->getTitle()], $normalized['title'], 'Original language title has been normalized.'); + $this->assertContainsEquals(['lang' => 'de', 'value' => $translation->getTitle()], $normalized['title'], 'Translation language title has been normalized.'); /** @var \Drupal\node\NodeInterface $denormalized_node */ $denormalized_node = $this->serializer->denormalize($normalized, 'Drupal\node\Entity\Node', $this->format); diff --git a/core/modules/migrate/tests/src/Unit/MigrateStubTest.php b/core/modules/migrate/tests/src/Unit/MigrateStubTest.php index fcf171b1..79df4170 100644 --- a/core/modules/migrate/tests/src/Unit/MigrateStubTest.php +++ b/core/modules/migrate/tests/src/Unit/MigrateStubTest.php @@ -3,6 +3,7 @@ namespace Drupal\Tests\migrate\Unit; use Drupal\Component\Plugin\Exception\PluginNotFoundException; +use Drupal\Tests\Traits\PhpUnitWarnings; use Drupal\migrate\MigrateStub; use Drupal\migrate\Plugin\MigrateDestinationInterface; use Drupal\migrate\Plugin\MigrateIdMapInterface; @@ -22,6 +23,8 @@ */ class MigrateStubTest extends TestCase { + use PhpUnitWarnings; + /** * The plugin manager prophecy. * diff --git a/core/modules/system/tests/src/Kernel/Entity/EntityReferenceSelectionReferenceableTest.php b/core/modules/system/tests/src/Kernel/Entity/EntityReferenceSelectionReferenceableTest.php index 16b98105..a4bea10b 100644 --- a/core/modules/system/tests/src/Kernel/Entity/EntityReferenceSelectionReferenceableTest.php +++ b/core/modules/system/tests/src/Kernel/Entity/EntityReferenceSelectionReferenceableTest.php @@ -126,7 +126,7 @@ public function testReferenceablesWithNoLabelKey($match, $match_operator, $limit // entity labels. // @see \Drupal\Core\Entity\EntityReferenceSelection\SelectionInterface::getReferenceableEntities() $item = is_string($item) ? Html::escape($item) : $item; - $this->assertContains($item, $referenceables[$this->bundle]); + $this->assertContainsEquals($item, $referenceables[$this->bundle]); } // Test ::countReferenceableEntities(). diff --git a/core/scripts/run-tests.sh b/core/scripts/run-tests.sh index 955eb5bf..91b47782 100755 --- a/core/scripts/run-tests.sh +++ b/core/scripts/run-tests.sh @@ -149,7 +149,7 @@ } 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."); + simpletest_script_print_error("PHPUnit testing framework version 9 or greater is required when running on PHP 7.4 or greater. Run the command 'composer run-script drupal-phpunit-upgrade' in order to fix this."); exit(SIMPLETEST_SCRIPT_EXIT_FAILURE); } diff --git a/core/tests/Drupal/BuildTests/Framework/BuildTestBase.php b/core/tests/Drupal/BuildTests/Framework/BuildTestBase.php index 7bd4f703..898aa582 100644 --- a/core/tests/Drupal/BuildTests/Framework/BuildTestBase.php +++ b/core/tests/Drupal/BuildTests/Framework/BuildTestBase.php @@ -7,6 +7,7 @@ use Behat\Mink\Mink; use Behat\Mink\Session; use Drupal\Component\FileSystem\FileSystem as DrupalFilesystem; +use Drupal\Tests\PhpUnitCompatibilityTrait; use Drupal\Tests\Traits\PhpUnitWarnings; use PHPUnit\Framework\TestCase; use Symfony\Component\Filesystem\Filesystem as SymfonyFilesystem; @@ -53,6 +54,7 @@ use ExternalCommandRequirementsTrait; use PhpUnitWarnings; + use PhpUnitCompatibilityTrait; /** * The working directory where this test will manipulate files. diff --git a/core/tests/Drupal/KernelTests/Core/Config/ConfigImporterTest.php b/core/tests/Drupal/KernelTests/Core/Config/ConfigImporterTest.php index 1e6c1b3e..e5925e81 100644 --- a/core/tests/Drupal/KernelTests/Core/Config/ConfigImporterTest.php +++ b/core/tests/Drupal/KernelTests/Core/Config/ConfigImporterTest.php @@ -612,7 +612,7 @@ public function testUnmetDependency() { 'Configuration unknown.config depends on the unknown extension that will not be installed after import.', ]; foreach ($expected as $expected_message) { - $this->assertContains($expected_message, $error_log, $expected_message); + $this->assertContainsEquals($expected_message, $error_log, $expected_message); } } @@ -658,7 +658,7 @@ public function testUnmetDependency() { 'Configuration config_test.dynamic.dotted.theme depends on themes (unknown, Seven) that will not be installed after import.', ]; foreach ($expected as $expected_message) { - $this->assertContains($expected_message, $error_log, $expected_message); + $this->assertContainsEquals($expected_message, $error_log, $expected_message); } } } diff --git a/core/tests/Drupal/KernelTests/Core/File/NameMungingTest.php b/core/tests/Drupal/KernelTests/Core/File/NameMungingTest.php index 1e97b7a8..991f9263 100644 --- a/core/tests/Drupal/KernelTests/Core/File/NameMungingTest.php +++ b/core/tests/Drupal/KernelTests/Core/File/NameMungingTest.php @@ -42,7 +42,7 @@ public function testMunging() { $munged_name = file_munge_filename($this->name, '', TRUE); $messages = \Drupal::messenger()->all(); \Drupal::messenger()->deleteAll(); - $this->assertContains(strtr('For security reasons, your upload has been renamed to %filename.', ['%filename' => $munged_name]), $messages['status'], 'Alert properly set when a file is renamed.'); + $this->assertContainsEquals(strtr('For security reasons, your upload has been renamed to %filename.', ['%filename' => $munged_name]), $messages['status'], 'Alert properly set when a file is renamed.'); $this->assertNotEqual($munged_name, $this->name, new FormattableMarkup('The new filename (%munged) has been modified from the original (%original)', ['%munged' => $munged_name, '%original' => $this->name])); } diff --git a/core/tests/Drupal/KernelTests/Core/Messenger/MessengerTest.php b/core/tests/Drupal/KernelTests/Core/Messenger/MessengerTest.php index ac305022..e244e05e 100644 --- a/core/tests/Drupal/KernelTests/Core/Messenger/MessengerTest.php +++ b/core/tests/Drupal/KernelTests/Core/Messenger/MessengerTest.php @@ -49,7 +49,7 @@ public function testRemoveSingleMessage() { // Check we only have the second one. $this->assertCount(1, $this->messenger->messagesByType(MessengerInterface::TYPE_STATUS)); - $this->assertContains('Second message with markup! (not removed).', $this->messenger->deleteByType(MessengerInterface::TYPE_STATUS)); + $this->assertContainsEquals('Second message with markup! (not removed).', $this->messenger->deleteByType(MessengerInterface::TYPE_STATUS)); } diff --git a/core/tests/Drupal/KernelTests/KernelTestBase.php b/core/tests/Drupal/KernelTests/KernelTestBase.php index ba7c5712..d880ad98 100644 --- a/core/tests/Drupal/KernelTests/KernelTestBase.php +++ b/core/tests/Drupal/KernelTests/KernelTestBase.php @@ -18,6 +18,7 @@ use Drupal\Core\Test\TestDatabase; use Drupal\Tests\ConfigTestTrait; use Drupal\Tests\RandomGeneratorTrait; +use Drupal\Tests\PhpUnitCompatibilityTrait; use Drupal\Tests\TestRequirementsTrait; use Drupal\Tests\Traits\PhpUnitWarnings; use Drupal\TestTools\Comparator\MarkupInterfaceComparator; @@ -79,6 +80,7 @@ use ConfigTestTrait; use TestRequirementsTrait; use PhpUnitWarnings; + use PhpUnitCompatibilityTrait; /** * {@inheritdoc} diff --git a/core/tests/Drupal/TestTools/PhpUnitCompatibility/PhpUnit8/TestCompatibilityTrait.php b/core/tests/Drupal/TestTools/PhpUnitCompatibility/PhpUnit8/TestCompatibilityTrait.php new file mode 100644 index 00000000..9beee7d0 --- /dev/null +++ b/core/tests/Drupal/TestTools/PhpUnitCompatibility/PhpUnit8/TestCompatibilityTrait.php @@ -0,0 +1,10 @@ +expectException(Error::class); + $this->expectError(); $op = new DiffOp(); $result = $op->reverse(); } diff --git a/core/tests/Drupal/Tests/Component/Gettext/PoStreamWriterTest.php b/core/tests/Drupal/Tests/Component/Gettext/PoStreamWriterTest.php index 39cf95d1..76be2708 100644 --- a/core/tests/Drupal/Tests/Component/Gettext/PoStreamWriterTest.php +++ b/core/tests/Drupal/Tests/Component/Gettext/PoStreamWriterTest.php @@ -4,6 +4,7 @@ use Drupal\Component\Gettext\PoItem; use Drupal\Component\Gettext\PoStreamWriter; +use Drupal\Tests\Traits\PhpUnitWarnings; use org\bovigo\vfs\vfsStream; use org\bovigo\vfs\vfsStreamFile; use PHPUnit\Framework\TestCase; @@ -14,6 +15,8 @@ */ class PoStreamWriterTest extends TestCase { + use PhpUnitWarnings; + /** * The PO writer object under test. * diff --git a/core/tests/Drupal/Tests/Component/PhpStorage/FileStorageTest.php b/core/tests/Drupal/Tests/Component/PhpStorage/FileStorageTest.php index 6230bdbd..c17b1bb5 100644 --- a/core/tests/Drupal/Tests/Component/PhpStorage/FileStorageTest.php +++ b/core/tests/Drupal/Tests/Component/PhpStorage/FileStorageTest.php @@ -4,8 +4,8 @@ use Drupal\Component\PhpStorage\FileStorage; use Drupal\Component\Utility\Random; +use Drupal\Tests\Traits\PhpUnitWarnings; use org\bovigo\vfs\vfsStreamDirectory; -use PHPUnit\Framework\Error\Warning; /** * @coversDefaultClass \Drupal\Component\PhpStorage\FileStorage @@ -14,6 +14,8 @@ */ class FileStorageTest extends PhpStorageTestBase { + use PhpUnitWarnings; + /** * Standard test settings to pass to storage instances. * @@ -99,8 +101,8 @@ public function testCreateDirectoryFailWarning() { 'bin' => 'test', ]); $code = "expectException(Warning::class); - $this->expectExceptionMessage('mkdir(): Permission Denied'); + $this->expectWarning(); + $this->expectWarningMessage('mkdir(): Permission Denied'); $storage->save('subdirectory/foo.php', $code); } diff --git a/core/tests/Drupal/Tests/Component/Plugin/PluginManagerBaseTest.php b/core/tests/Drupal/Tests/Component/Plugin/PluginManagerBaseTest.php index 954ff701..c3056878 100644 --- a/core/tests/Drupal/Tests/Component/Plugin/PluginManagerBaseTest.php +++ b/core/tests/Drupal/Tests/Component/Plugin/PluginManagerBaseTest.php @@ -5,6 +5,7 @@ use Drupal\Component\Plugin\Exception\PluginNotFoundException; use Drupal\Component\Plugin\Mapper\MapperInterface; use Drupal\Component\Plugin\PluginManagerBase; +use Drupal\Tests\Traits\PhpUnitWarnings; use PHPUnit\Framework\TestCase; /** @@ -13,6 +14,8 @@ */ class PluginManagerBaseTest extends TestCase { + use PhpUnitWarnings; + /** * A callback method for mocking FactoryInterface objects. */ diff --git a/core/tests/Drupal/Tests/Composer/Plugin/VendorHardening/ConfigTest.php b/core/tests/Drupal/Tests/Composer/Plugin/VendorHardening/ConfigTest.php index 9755278b..f800cdd5 100644 --- a/core/tests/Drupal/Tests/Composer/Plugin/VendorHardening/ConfigTest.php +++ b/core/tests/Drupal/Tests/Composer/Plugin/VendorHardening/ConfigTest.php @@ -4,6 +4,7 @@ use Composer\Package\RootPackageInterface; use Drupal\Composer\Plugin\VendorHardening\Config; +use Drupal\Tests\Traits\PhpUnitWarnings; use PHPUnit\Framework\TestCase; /** @@ -12,6 +13,8 @@ */ class ConfigTest extends TestCase { + use PhpUnitWarnings; + /** * @covers ::getPathsForPackage */ diff --git a/core/tests/Drupal/Tests/Composer/Plugin/VendorHardening/VendorHardeningPluginTest.php b/core/tests/Drupal/Tests/Composer/Plugin/VendorHardening/VendorHardeningPluginTest.php index 845356f8..79e136d8 100644 --- a/core/tests/Drupal/Tests/Composer/Plugin/VendorHardening/VendorHardeningPluginTest.php +++ b/core/tests/Drupal/Tests/Composer/Plugin/VendorHardening/VendorHardeningPluginTest.php @@ -8,6 +8,7 @@ use Composer\Package\RootPackageInterface; use Drupal\Composer\Plugin\VendorHardening\Config; use Drupal\Composer\Plugin\VendorHardening\VendorHardeningPlugin; +use Drupal\Tests\Traits\PhpUnitWarnings; use org\bovigo\vfs\vfsStream; use PHPUnit\Framework\TestCase; @@ -17,6 +18,8 @@ */ class VendorHardeningPluginTest extends TestCase { + use PhpUnitWarnings; + public function setUp(): void { parent::setUp(); vfsStream::setup('vendor', NULL, [ diff --git a/core/tests/Drupal/Tests/ComposerIntegrationTest.php b/core/tests/Drupal/Tests/ComposerIntegrationTest.php index 5cd2719b..d74cf420 100644 --- a/core/tests/Drupal/Tests/ComposerIntegrationTest.php +++ b/core/tests/Drupal/Tests/ComposerIntegrationTest.php @@ -5,6 +5,7 @@ use Drupal\Composer\Plugin\VendorHardening\Config; use Drupal\Core\Composer\Composer; use Drupal\Tests\Composer\ComposerIntegrationTrait; +use Drupal\TestTools\PhpUnitCompatibility\RunnerVersion; use Symfony\Component\Yaml\Yaml; /** @@ -260,6 +261,11 @@ public function testVendorCleanup($class, $property) { $reflection = new \ReflectionProperty($class, $property); $reflection->setAccessible(TRUE); $config = $reflection->getValue(); + // PHPUnit 9.5.3 removes 'phpunit/php-token-stream' from its dependencies. + // @todo remove the check below when PHPUnit 9 is the minimum. + if (RunnerVersion::getMajor() >= 9) { + unset($config['phpunit/php-token-stream']); + } foreach (array_keys($config) as $package) { $this->assertContains(strtolower($package), $packages); } diff --git a/core/tests/Drupal/Tests/Core/Asset/CssCollectionGrouperUnitTest.php b/core/tests/Drupal/Tests/Core/Asset/CssCollectionGrouperUnitTest.php index 7e5fe848..40efadf4 100644 --- a/core/tests/Drupal/Tests/Core/Asset/CssCollectionGrouperUnitTest.php +++ b/core/tests/Drupal/Tests/Core/Asset/CssCollectionGrouperUnitTest.php @@ -113,8 +113,8 @@ public function testGrouper() { $this->assertSame('all', $group['media']); $this->assertTrue($group['preprocess']); $this->assertCount(3, $group['items']); - $this->assertContains($css_assets['system.base.css'], $group['items']); - $this->assertContains($css_assets['js.module.css'], $group['items']); + $this->assertContainsEquals($css_assets['system.base.css'], $group['items']); + $this->assertContainsEquals($css_assets['js.module.css'], $group['items']); // Check group 2. $group = $groups[1]; @@ -123,7 +123,7 @@ public function testGrouper() { $this->assertSame('all', $group['media']); $this->assertTrue($group['preprocess']); $this->assertCount(1, $group['items']); - $this->assertContains($css_assets['field.css'], $group['items']); + $this->assertContainsEquals($css_assets['field.css'], $group['items']); // Check group 3. $group = $groups[2]; @@ -132,7 +132,7 @@ public function testGrouper() { $this->assertSame('all', $group['media']); $this->assertTrue($group['preprocess']); $this->assertCount(1, $group['items']); - $this->assertContains($css_assets['external.css'], $group['items']); + $this->assertContainsEquals($css_assets['external.css'], $group['items']); // Check group 4. $group = $groups[3]; @@ -141,7 +141,7 @@ public function testGrouper() { $this->assertSame('all', $group['media']); $this->assertTrue($group['preprocess']); $this->assertCount(1, $group['items']); - $this->assertContains($css_assets['elements.css'], $group['items']); + $this->assertContainsEquals($css_assets['elements.css'], $group['items']); // Check group 5. $group = $groups[4]; @@ -150,7 +150,7 @@ public function testGrouper() { $this->assertSame('print', $group['media']); $this->assertTrue($group['preprocess']); $this->assertCount(1, $group['items']); - $this->assertContains($css_assets['print.css'], $group['items']); + $this->assertContainsEquals($css_assets['print.css'], $group['items']); } } diff --git a/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php b/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php index 250b184d..50df652c 100644 --- a/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php +++ b/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php @@ -133,6 +133,18 @@ public static function getSkippedDeprecations() { 'AssertLegacyTrait::assertFieldByXPath() is deprecated in drupal:8.3.0 and is removed from drupal:10.0.0. Use $this->xpath() instead and check the values directly in the test. See https://www.drupal.org/node/3129738', 'AssertLegacyTrait::assertNoFieldByXPath() is deprecated in drupal:8.3.0 and is removed from drupal:10.0.0. Use $this->xpath() instead and assert that the result is empty. See https://www.drupal.org/node/3129738', 'AssertLegacyTrait::assertFieldsByValue() is deprecated in drupal:8.3.0 and is removed from drupal:10.0.0. Use iteration over the fields yourself instead and directly check the values in the test. See https://www.drupal.org/node/3129738', + // PHPUnit 9. + "The \"PHPUnit\TextUI\DefaultResultPrinter\" class is considered internal This class is not covered by the backward compatibility promise for PHPUnit. It may change without further notice. You should not use it from \"Drupal\Tests\Listeners\HtmlOutputPrinter\".", + 'assertFileNotExists() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertFileDoesNotExist() instead.', + 'PHPUnit\\Framework\\TestCase::prophesize() is deprecated and will be removed in PHPUnit 10. Please use the trait provided by phpspec/prophecy-phpunit.', + 'assertRegExp() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertMatchesRegularExpression() instead.', + 'assertNotRegExp() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertDoesNotMatchRegularExpression() instead.', + 'assertDirectoryNotExists() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertDirectoryDoesNotExist() instead.', + 'Support for using expectException() with PHPUnit\\Framework\\Error\\Warning is deprecated and will be removed in PHPUnit 10. Use expectWarning() instead.', + 'Support for using expectException() with PHPUnit\\Framework\\Error\\Error is deprecated and will be removed in PHPUnit 10. Use expectError() instead.', + 'assertDirectoryNotIsWritable() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertDirectoryIsNotWritable() instead.', + 'assertFileNotIsWritable() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertFileIsNotWritable() instead.', + 'The at() matcher has been deprecated. It will be removed in PHPUnit 10. Please refactor your test to not rely on the order in which methods are invoked.', ]; } diff --git a/core/tests/Drupal/Tests/Listeners/HtmlOutputPrinter.php b/core/tests/Drupal/Tests/Listeners/HtmlOutputPrinter.php index a3f7916e..a85c3204 100644 --- a/core/tests/Drupal/Tests/Listeners/HtmlOutputPrinter.php +++ b/core/tests/Drupal/Tests/Listeners/HtmlOutputPrinter.php @@ -2,15 +2,27 @@ namespace Drupal\Tests\Listeners; +use Drupal\TestTools\PhpUnitCompatibility\RunnerVersion; use PHPUnit\Framework\TestResult; -use PHPUnit\TextUI\ResultPrinter; + +// In order to manage different implementations across PHPUnit versions, we +// dynamically load the base ResultPrinter class dependent on the PHPUnit runner +// version. +if (!class_exists(ResultPrinterBase::class, FALSE)) { + if (RunnerVersion::getMajor() < 9) { + class_alias('PHPUnit\TextUI\ResultPrinter', ResultPrinterBase::class); + } + else { + class_alias('PHPUnit\TextUI\DefaultResultPrinter', ResultPrinterBase::class); + } +} /** * Defines a class for providing html output results for functional tests. * * @internal */ -class HtmlOutputPrinter extends ResultPrinter { +class HtmlOutputPrinter extends ResultPrinterBase { use HtmlOutputPrinterTrait; diff --git a/core/tests/Drupal/Tests/PhpUnitCompatibilityTrait.php b/core/tests/Drupal/Tests/PhpUnitCompatibilityTrait.php new file mode 100644 index 00000000..dc6aed48 --- /dev/null +++ b/core/tests/Drupal/Tests/PhpUnitCompatibilityTrait.php @@ -0,0 +1,21 @@ + 8) { + $this->markTestSkipped("In PHPUnit 9+, argument 2 passed to PHPUnit\Framework\Assert::assertContains() must be iterable."); + } + $this->expectDeprecation('Using assertContains() with string haystacks is deprecated and will not be supported in PHPUnit 9. Refactor your test to use assertStringContainsString() or assertStringContainsStringIgnoringCase() instead.'); + $this->expectDeprecation('The optional $ignoreCase parameter of assertContains() is deprecated and will be removed in PHPUnit 9.'); $this->assertContains('string', 'aaaa_string_aaa'); $this->assertContains('STRING', 'aaaa_string_aaa', '', TRUE); } /** - * @expectedDeprecation Using assertNotContains() with string haystacks is deprecated and will not be supported in PHPUnit 9. Refactor your test to use assertStringNotContainsString() or assertStringNotContainsStringIgnoringCase() instead. - * @expectedDeprecation The optional $ignoreCase parameter of assertNotContains() is deprecated and will be removed in PHPUnit 9. + * Tests assertNotContains. */ public function testAssertNotContains() { + if (RunnerVersion::getMajor() > 8) { + $this->markTestSkipped("In PHPUnit 9+, argument 2 passed to PHPUnit\Framework\Assert::assertNotContains() must be iterable."); + } + $this->expectDeprecation('Using assertNotContains() with string haystacks is deprecated and will not be supported in PHPUnit 9. Refactor your test to use assertStringNotContainsString() or assertStringNotContainsStringIgnoringCase() instead.'); + $this->expectDeprecation('The optional $ignoreCase parameter of assertNotContains() is deprecated and will be removed in PHPUnit 9.'); $this->assertNotContains('foo', 'bar'); $this->assertNotContains('FOO', 'bar', '', TRUE); } @@ -73,9 +83,13 @@ public function __construct() { } /** - * @expectedDeprecation The optional $canonicalize parameter of assertEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertEqualsCanonicalizing() instead. + * Tests assertEquals. */ public function testAssertEquals() { + if (RunnerVersion::getMajor() > 8) { + $this->markTestSkipped("In PHPUnit 9+, the \$canonicalize parameter of assertEquals() is removed."); + } + $this->expectDeprecation('The optional $canonicalize parameter of assertEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertEqualsCanonicalizing() instead.'); $this->assertEquals(['a', 'b'], ['b', 'a'], '', 0.0, 10, TRUE); } diff --git a/core/tests/Drupal/Tests/Traits/PhpUnitWarnings.php b/core/tests/Drupal/Tests/Traits/PhpUnitWarnings.php index d2e3039d..c24f1210 100644 --- a/core/tests/Drupal/Tests/Traits/PhpUnitWarnings.php +++ b/core/tests/Drupal/Tests/Traits/PhpUnitWarnings.php @@ -37,6 +37,17 @@ 'expectExceptionMessageRegExp() is deprecated in PHPUnit 8 and will be removed in PHPUnit 9.', // Warning for testing. 'Test warning for \Drupal\Tests\PhpUnitWarningsTest::testAddWarning()', + // PHPUnit 9. + 'assertFileNotExists() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertFileDoesNotExist() instead.', + 'PHPUnit\\Framework\\TestCase::prophesize() is deprecated and will be removed in PHPUnit 10. Please use the trait provided by phpspec/prophecy-phpunit.', + 'assertRegExp() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertMatchesRegularExpression() instead.', + 'assertNotRegExp() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertDoesNotMatchRegularExpression() instead.', + 'assertDirectoryNotExists() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertDirectoryDoesNotExist() instead.', + 'Support for using expectException() with PHPUnit\\Framework\\Error\\Warning is deprecated and will be removed in PHPUnit 10. Use expectWarning() instead.', + 'Support for using expectException() with PHPUnit\\Framework\\Error\\Error is deprecated and will be removed in PHPUnit 10. Use expectError() instead.', + 'assertDirectoryNotIsWritable() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertDirectoryIsNotWritable() instead.', + 'assertFileNotIsWritable() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertFileIsNotWritable() instead.', + 'The at() matcher has been deprecated. It will be removed in PHPUnit 10. Please refactor your test to not rely on the order in which methods are invoked.', ]; /** diff --git a/core/tests/Drupal/Tests/UnitTestCase.php b/core/tests/Drupal/Tests/UnitTestCase.php index 55978ba4..6d9d2e0c 100644 --- a/core/tests/Drupal/Tests/UnitTestCase.php +++ b/core/tests/Drupal/Tests/UnitTestCase.php @@ -20,6 +20,7 @@ abstract class UnitTestCase extends TestCase { use PhpUnitWarnings; + use PhpUnitCompatibilityTrait; /** * The random generator.