From 7acd6f0a00e74971d7f91278a188c5050b29929e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20M=C3=B6ller?= Date: Fri, 8 Mar 2024 14:13:21 +0100 Subject: [PATCH] Enhancement: Extract IncludeNameFilter --- .../Filter/ExcludeNameFilterIterator.php | 35 ++++++++++++++++-- ...lterIterator.php => IncludeNameFilter.php} | 37 +++++++------------ .../Filter/IncludeNameFilterIterator.php | 35 ++++++++++++++++-- 3 files changed, 77 insertions(+), 30 deletions(-) rename src/Runner/Filter/{NameFilterIterator.php => IncludeNameFilter.php} (80%) 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 80% rename from src/Runner/Filter/NameFilterIterator.php rename to src/Runner/Filter/IncludeNameFilter.php index 04a99a09580..101e265dc68 100644 --- a/src/Runner/Filter/NameFilterIterator.php +++ b/src/Runner/Filter/IncludeNameFilter.php @@ -9,44 +9,40 @@ */ 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 readonly class IncludeNameFilter { /** * @psalm-var non-empty-string */ - private readonly string $regularExpression; + private string $regularExpression; /** * @psalm-var ?int */ - private readonly ?int $dataSetMinimum; + private ?int $dataSetMinimum; /** * @psalm-var ?int */ - private readonly ?int $dataSetMaximum; + private ?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); } }