Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enhancement: Extract IncludeNameFilter #5722

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
35 changes: 32 additions & 3 deletions src/Runner/Filter/ExcludeNameFilterIterator.php
Expand Up @@ -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

Check failure on line 21 in src/Runner/Filter/ExcludeNameFilterIterator.php

View workflow job for this annotation

GitHub Actions / Type Checker

MissingTemplateParam

src/Runner/Filter/ExcludeNameFilterIterator.php:21:13: MissingTemplateParam: PHPUnit\Runner\Filter\ExcludeNameFilterIterator has missing template params when extending RecursiveFilterIterator, expecting 3 (see https://psalm.dev/182)
{
protected function doAccept(bool $result): bool
private IncludeNameFilter $includeNameFilter;

/**
* @psalm-param RecursiveIterator<int, Test> $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);
}
}
Expand Up @@ -13,59 +13,42 @@
use function preg_match;
use function sprintf;
use function str_replace;
use PHPUnit\Framework\Test;
use PHPUnit\Framework\TestSuite;
use PHPUnit\Runner\PhptTestCase;
use RecursiveFilterIterator;
use RecursiveIterator;
use PHPUnit\Framework\TestCase;

/**
* @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<int, Test> $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'];
$this->dataSetMinimum = $preparedFilter['dataSetMinimum'];
$this->dataSetMaximum = $preparedFilter['dataSetMaximum'];
}

public function accept(): bool
public function filter(TestCase $test): bool
{
$test = $this->getInnerIterator()->current();

if ($test instanceof TestSuite) {
return true;
}

if ($test instanceof PhptTestCase) {
return false;
}

$name = $test::class . '::' . $test->nameWithDataSet();

$accepted = @preg_match($this->regularExpression, $name, $matches) === 1;
Expand All @@ -75,11 +58,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
*
Expand Down
35 changes: 32 additions & 3 deletions src/Runner/Filter/IncludeNameFilterIterator.php
Expand Up @@ -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

Check failure on line 21 in src/Runner/Filter/IncludeNameFilterIterator.php

View workflow job for this annotation

GitHub Actions / Type Checker

MissingTemplateParam

src/Runner/Filter/IncludeNameFilterIterator.php:21:13: MissingTemplateParam: PHPUnit\Runner\Filter\IncludeNameFilterIterator has missing template params when extending RecursiveFilterIterator, expecting 3 (see https://psalm.dev/182)
{
protected function doAccept(bool $result): bool
private IncludeNameFilter $includeNameFilter;

/**
* @psalm-param RecursiveIterator<int, Test> $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);
}
}