Skip to content

Commit

Permalink
Closes #5800
Browse files Browse the repository at this point in the history
  • Loading branch information
sebastianbergmann committed Apr 7, 2024
1 parent 8969be4 commit d56824f
Show file tree
Hide file tree
Showing 8 changed files with 140 additions and 26 deletions.
4 changes: 4 additions & 0 deletions ChangeLog-11.2.md
Expand Up @@ -8,4 +8,8 @@ All notable changes of the PHPUnit 11.2 release series are documented in this fi

* [#5799](https://github.com/sebastianbergmann/phpunit/issues/5799): `#[CoversTrait]` and `#[UsesTrait]` attributes

### Deprecated

* [#5800](https://github.com/sebastianbergmann/phpunit/issues/5800): Support for targeting traits with `#[CoversClass]` and `#[UsesClass]` attributes

[11.2.0]: https://github.com/sebastianbergmann/phpunit/compare/11.1...main
11 changes: 6 additions & 5 deletions DEPRECATIONS.md
Expand Up @@ -52,8 +52,9 @@ This functionality is currently [hard-deprecated](https://phpunit.de/backward-co

#### Miscellaneous

| Issue | Description | Since | Replacement |
|-------------------------------------------------------------------|--------------------------|--------|------------------------|
| [#4505](https://github.com/sebastianbergmann/phpunit/issues/4505) | Metadata in doc-comments | 10.3.0 | Metadata in attributes |
| [#5214](https://github.com/sebastianbergmann/phpunit/issues/5214) | `TestCase::iniSet()` | 10.3.0 | |
| [#5216](https://github.com/sebastianbergmann/phpunit/issues/5216) | `TestCase::setLocale()` | 10.3.0 | |
| Issue | Description | Since | Replacement |
|-------------------------------------------------------------------|-----------------------------------------------------------|--------|-------------------------------------|
| [#4505](https://github.com/sebastianbergmann/phpunit/issues/4505) | Metadata in doc-comments | 10.3.0 | Metadata in attributes |
| [#5214](https://github.com/sebastianbergmann/phpunit/issues/5214) | `TestCase::iniSet()` | 10.3.0 | |
| [#5216](https://github.com/sebastianbergmann/phpunit/issues/5216) | `TestCase::setLocale()` | 10.3.0 | |
| [#5800](https://github.com/sebastianbergmann/phpunit/issues/5800) | Targeting traits with `#[CoversClass]` and `#[UsesClass]` | 11.2.0 | `#[CoversClass]` and `#[UsesTrait]` |
19 changes: 19 additions & 0 deletions src/Metadata/Api/CodeCoverage.php
Expand Up @@ -16,6 +16,7 @@
use function sprintf;
use function str_starts_with;
use function trait_exists;
use PHPUnit\Event\Facade as EventFacade;
use PHPUnit\Framework\CodeCoverageException;
use PHPUnit\Framework\InvalidCoversTargetException;
use PHPUnit\Metadata\Covers;
Expand Down Expand Up @@ -293,6 +294,24 @@ private function names(CoversClass|CoversFunction|CoversMethod|CoversTrait|UsesC

assert(class_exists($names[0]) || trait_exists($names[0]));

if ($metadata->isCoversClass() && trait_exists($names[0])) {
EventFacade::emitter()->testRunnerTriggeredDeprecation(
sprintf(
'Targeting a trait such as %s with #[CoversClass] is deprecated, please refactor your test to use #[CoversTrait] instead.',
$names[0],
),
);
}

if ($metadata->isUsesClass() && trait_exists($names[0])) {
EventFacade::emitter()->testRunnerTriggeredDeprecation(
sprintf(
'Targeting a trait such as %s with #[UsesClass] is deprecated, please refactor your test to use #[UsesTrait] instead.',
$names[0],
),
);
}

$reflector = new ReflectionClass($name);

while ($reflector = $reflector->getParentClass()) {
Expand Down
23 changes: 23 additions & 0 deletions tests/end-to-end/_files/TraitTargetedWithCoversClassTest.php
@@ -0,0 +1,23 @@
<?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\DeprecatedAnnotationsTestFixture;

use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\TestCase;
use PHPUnit\TestFixture\CoveredTrait;

#[CoversClass(CoveredTrait::class)]
final class TraitTargetedWithCoversClassTest extends TestCase
{
public function testSomething(): void
{
$this->assertTrue(true);
}
}
Expand Up @@ -7,17 +7,17 @@
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace PHPUnit\TestFixture;
namespace PHPUnit\DeprecatedAnnotationsTestFixture;

use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\UsesClass;
use PHPUnit\Framework\TestCase;
use PHPUnit\TestFixture\CoveredTrait;

#[CoversClass(CoveredTrait::class)]
#[UsesClass(CoveredTrait::class)]
final class Issue5798Test extends TestCase
final class TraitTargetedWithUsesClassTest extends TestCase
{
public function testSomething(): void
{
$this->assertTrue(true);
}
}
@@ -0,0 +1,42 @@
--TEST--
The right events are emitted in the right order for a successful test that targets a trait with #[CoversClass]
--FILE--
<?php declare(strict_types=1);
$traceFile = tempnam(sys_get_temp_dir(), __FILE__);
$coverageFile = tempnam(sys_get_temp_dir(), __FILE__);

$_SERVER['argv'][] = '--do-not-cache-result';
$_SERVER['argv'][] = '--no-configuration';
$_SERVER['argv'][] = '--no-output';
$_SERVER['argv'][] = '--log-events-text';
$_SERVER['argv'][] = $traceFile;
$_SERVER['argv'][] = '--coverage-text=' . $coverageFile;
$_SERVER['argv'][] = '--coverage-filter';
$_SERVER['argv'][] = __DIR__ . '/../_files';
$_SERVER['argv'][] = __DIR__ . '/../_files/TraitTargetedWithCoversClassTest.php';

require __DIR__ . '/../../bootstrap.php';

(new PHPUnit\TextUI\Application)->run($_SERVER['argv']);

print file_get_contents($traceFile);

unlink($traceFile);
--EXPECTF--
PHPUnit Started (PHPUnit %s using %s)
Test Runner Configured
Test Suite Loaded (1 test)
Event Facade Sealed
Test Runner Started
Test Suite Sorted
Test Runner Execution Started (1 test)
Test Suite Started (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversClassTest, 1 test)
Test Preparation Started (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversClassTest::testSomething)
Test Prepared (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversClassTest::testSomething)
Test Passed (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversClassTest::testSomething)
Test Runner Triggered Deprecation (Targeting a trait such as PHPUnit\TestFixture\CoveredTrait with #[CoversClass] is deprecated, please refactor your test to use #[CoversTrait] instead.)
Test Finished (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversClassTest::testSomething)
Test Suite Finished (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithCoversClassTest, 1 test)
Test Runner Execution Finished
Test Runner Finished
PHPUnit Finished (Shell Exit Code: 0)
@@ -0,0 +1,42 @@
--TEST--
The right events are emitted in the right order for a successful test that targets a trait with #[CoversClass]
--FILE--
<?php declare(strict_types=1);
$traceFile = tempnam(sys_get_temp_dir(), __FILE__);
$coverageFile = tempnam(sys_get_temp_dir(), __FILE__);

$_SERVER['argv'][] = '--do-not-cache-result';
$_SERVER['argv'][] = '--no-configuration';
$_SERVER['argv'][] = '--no-output';
$_SERVER['argv'][] = '--log-events-text';
$_SERVER['argv'][] = $traceFile;
$_SERVER['argv'][] = '--coverage-text=' . $coverageFile;
$_SERVER['argv'][] = '--coverage-filter';
$_SERVER['argv'][] = __DIR__ . '/../_files';
$_SERVER['argv'][] = __DIR__ . '/../_files/TraitTargetedWithUsesClassTest.php';

require __DIR__ . '/../../bootstrap.php';

(new PHPUnit\TextUI\Application)->run($_SERVER['argv']);

print file_get_contents($traceFile);

unlink($traceFile);
--EXPECTF--
PHPUnit Started (PHPUnit %s using %s)
Test Runner Configured
Test Suite Loaded (1 test)
Event Facade Sealed
Test Runner Started
Test Suite Sorted
Test Runner Execution Started (1 test)
Test Suite Started (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithUsesClassTest, 1 test)
Test Preparation Started (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithUsesClassTest::testSomething)
Test Prepared (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithUsesClassTest::testSomething)
Test Passed (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithUsesClassTest::testSomething)
Test Runner Triggered Deprecation (Targeting a trait such as PHPUnit\TestFixture\CoveredTrait with #[UsesClass] is deprecated, please refactor your test to use #[UsesTrait] instead.)
Test Finished (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithUsesClassTest::testSomething)
Test Suite Finished (PHPUnit\DeprecatedAnnotationsTestFixture\TraitTargetedWithUsesClassTest, 1 test)
Test Runner Execution Finished
Test Runner Finished
PHPUnit Finished (Shell Exit Code: 0)
17 changes: 0 additions & 17 deletions tests/unit/Metadata/Api/CodeCoverageTest.php
Expand Up @@ -41,7 +41,6 @@
use PHPUnit\TestFixture\InvalidClassTargetWithAnnotationTest;
use PHPUnit\TestFixture\InvalidClassTargetWithAttributeTest;
use PHPUnit\TestFixture\InvalidFunctionTargetTest;
use PHPUnit\TestFixture\Issue5798Test;
use PHPUnit\TestFixture\MoreThanOneCoversDefaultClassAnnotationTest;
use PHPUnit\TestFixture\MoreThanOneUsesDefaultClassAnnotationTest;
use PHPUnit\TestFixture\NamespaceCoverageClassTest;
Expand Down Expand Up @@ -218,14 +217,6 @@ public static function linesToBeCoveredProvider(): array
'testSomething',
],

[
[
TEST_FILES_PATH . 'CoveredTrait.php' => range(12, 18),
],
Issue5798Test::class,
'testSomething',
],

[
[
TEST_FILES_PATH . 'CoveredTrait.php' => range(14, 17),
Expand Down Expand Up @@ -357,14 +348,6 @@ public static function linesToBeUsedProvider(): array
'testSomething',
],

[
[
TEST_FILES_PATH . 'CoveredTrait.php' => range(12, 18),
],
Issue5798Test::class,
'testSomething',
],

[
[
TEST_FILES_PATH . 'CoveredTrait.php' => range(14, 17),
Expand Down

0 comments on commit d56824f

Please sign in to comment.