Skip to content

Commit

Permalink
Enhancement: Extract IncludeNameFilter
Browse files Browse the repository at this point in the history
  • Loading branch information
localheinz committed Mar 8, 2024
1 parent 697b867 commit b2bce1f
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 27 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;

Check warning on line 41 in src/Runner/Filter/ExcludeNameFilterIterator.php

View check run for this annotation

Codecov / codecov/patch

src/Runner/Filter/ExcludeNameFilterIterator.php#L41

Added line #L41 was not covered by tests
}

if ($test instanceof PhptTestCase) {
return false;

Check warning on line 45 in src/Runner/Filter/ExcludeNameFilterIterator.php

View check run for this annotation

Codecov / codecov/patch

src/Runner/Filter/ExcludeNameFilterIterator.php#L45

Added line #L45 was not covered by tests
}

return !$this->includeNameFilter->filter($test);
}
}
Expand Up @@ -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
Expand All @@ -40,31 +39,23 @@ abstract class NameFilterIterator extends RecursiveFilterIterator
private readonly ?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
/**
* @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);

Check failure on line 58 in src/Runner/Filter/IncludeNameFilter.php

View workflow job for this annotation

GitHub Actions / Type Checker

RedundantConditionGivenDocblockType

src/Runner/Filter/IncludeNameFilter.php:58:49: RedundantConditionGivenDocblockType: Docblock-defined type PHPUnit\Framework\TestCase for $test is always PHPUnit\Framework\TestCase (see https://psalm.dev/156)

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

Check failure on line 60 in src/Runner/Filter/IncludeNameFilter.php

View workflow job for this annotation

GitHub Actions / Type Checker

PossiblyUndefinedMethod

src/Runner/Filter/IncludeNameFilter.php:60:46: PossiblyUndefinedMethod: Method PHPUnit\Runner\PhptTestCase::nameWithDataSet does not exist (see https://psalm.dev/108)

Expand All @@ -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
*
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;

Check warning on line 45 in src/Runner/Filter/IncludeNameFilterIterator.php

View check run for this annotation

Codecov / codecov/patch

src/Runner/Filter/IncludeNameFilterIterator.php#L45

Added line #L45 was not covered by tests
}

return $this->includeNameFilter->filter($test);
}
}

0 comments on commit b2bce1f

Please sign in to comment.