diff --git a/src/Runner/Filter/ExcludeNameFilterIterator.php b/src/Runner/Filter/ExcludeNameFilterIterator.php index f099b129a1e..fd8598abb56 100644 --- a/src/Runner/Filter/ExcludeNameFilterIterator.php +++ b/src/Runner/Filter/ExcludeNameFilterIterator.php @@ -9,13 +9,42 @@ */ namespace PHPUnit\Runner\Filter; +use PHPUnit\Framework\Test; +use PHPUnit\Framework\TestSuite; +use PHPUnit\Runner\PhptTestCase; +use RecursiveFilterIterator; +use RecursiveIterator; + /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ -final class ExcludeNameFilterIterator extends NameFilterIterator +final class ExcludeNameFilterIterator extends RecursiveFilterIterator { - protected function doAccept(bool $result): bool + private IncludeNameFilter $includeNameFilter; + + /** + * @psalm-param RecursiveIterator $iterator + * @psalm-param non-empty-string $filter + */ + public function __construct(RecursiveIterator $iterator, string $filter) { - return !$result; + parent::__construct($iterator); + + $this->includeNameFilter = new IncludeNameFilter($filter); + } + + public function accept(): bool + { + $test = $this->getInnerIterator()->current(); + + if ($test instanceof TestSuite) { + return true; + } + + if ($test instanceof PhptTestCase) { + return false; + } + + return !$this->includeNameFilter->filter($test); } } diff --git a/src/Runner/Filter/NameFilterIterator.php b/src/Runner/Filter/IncludeNameFilter.php similarity index 83% rename from src/Runner/Filter/NameFilterIterator.php rename to src/Runner/Filter/IncludeNameFilter.php index 04a99a09580..5666c18f30a 100644 --- a/src/Runner/Filter/NameFilterIterator.php +++ b/src/Runner/Filter/IncludeNameFilter.php @@ -9,20 +9,19 @@ */ namespace PHPUnit\Runner\Filter; +use function assert; use function end; use function preg_match; use function sprintf; use function str_replace; use PHPUnit\Framework\Test; -use PHPUnit\Framework\TestSuite; +use PHPUnit\Framework\TestCase; use PHPUnit\Runner\PhptTestCase; -use RecursiveFilterIterator; -use RecursiveIterator; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ -abstract class NameFilterIterator extends RecursiveFilterIterator +final class IncludeNameFilter { /** * @psalm-var non-empty-string @@ -40,13 +39,10 @@ abstract class NameFilterIterator extends RecursiveFilterIterator private readonly ?int $dataSetMaximum; /** - * @psalm-param RecursiveIterator $iterator * @psalm-param non-empty-string $filter */ - public function __construct(RecursiveIterator $iterator, string $filter) + public function __construct(string $filter) { - parent::__construct($iterator); - $preparedFilter = $this->prepareFilter($filter); $this->regularExpression = $preparedFilter['regularExpression']; @@ -54,17 +50,12 @@ public function __construct(RecursiveIterator $iterator, string $filter) $this->dataSetMaximum = $preparedFilter['dataSetMaximum']; } - public function accept(): bool + /** + * @param PhptTestCase|TestCase $test + */ + public function filter(Test $test): bool { - $test = $this->getInnerIterator()->current(); - - if ($test instanceof TestSuite) { - return true; - } - - if ($test instanceof PhptTestCase) { - return false; - } + assert($test instanceof PhptTestCase || $test instanceof TestCase); $name = $test::class . '::' . $test->nameWithDataSet(); @@ -75,11 +66,9 @@ public function accept(): bool $accepted = $set >= $this->dataSetMinimum && $set <= $this->dataSetMaximum; } - return $this->doAccept($accepted); + return $accepted; } - abstract protected function doAccept(bool $result): bool; - /** * @psalm-param non-empty-string $filter * diff --git a/src/Runner/Filter/IncludeNameFilterIterator.php b/src/Runner/Filter/IncludeNameFilterIterator.php index 569dacb6a94..89a3ccb1c43 100644 --- a/src/Runner/Filter/IncludeNameFilterIterator.php +++ b/src/Runner/Filter/IncludeNameFilterIterator.php @@ -9,13 +9,42 @@ */ namespace PHPUnit\Runner\Filter; +use PHPUnit\Framework\Test; +use PHPUnit\Framework\TestSuite; +use PHPUnit\Runner\PhptTestCase; +use RecursiveFilterIterator; +use RecursiveIterator; + /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ -final class IncludeNameFilterIterator extends NameFilterIterator +final class IncludeNameFilterIterator extends RecursiveFilterIterator { - protected function doAccept(bool $result): bool + private IncludeNameFilter $includeNameFilter; + + /** + * @psalm-param RecursiveIterator $iterator + * @psalm-param non-empty-string $filter + */ + public function __construct(RecursiveIterator $iterator, string $filter) { - return $result; + parent::__construct($iterator); + + $this->includeNameFilter = new IncludeNameFilter($filter); + } + + public function accept(): bool + { + $test = $this->getInnerIterator()->current(); + + if ($test instanceof TestSuite) { + return true; + } + + if ($test instanceof PhptTestCase) { + return false; + } + + return $this->includeNameFilter->filter($test); } }