Skip to content

Commit

Permalink
Enhancement: Extract IncludeNameFilter
Browse files Browse the repository at this point in the history
  • Loading branch information
localheinz authored and sebastianbergmann committed Mar 10, 2024
1 parent fd3f0bf commit b944719
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 33 deletions.
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);
}
}

0 comments on commit b944719

Please sign in to comment.