From 0c51b159a7918f36446ca701624a11cbd5f4f593 Mon Sep 17 00:00:00 2001 From: Nuno Maduro Date: Mon, 1 Apr 2024 13:24:30 +0100 Subject: [PATCH] chore: fixes test suite --- .../Runner/Filter/NameFilterIterator.php | 71 ++++++++++++++++--- 1 file changed, 61 insertions(+), 10 deletions(-) diff --git a/overrides/Runner/Filter/NameFilterIterator.php b/overrides/Runner/Filter/NameFilterIterator.php index 19507dfd..597f6e74 100644 --- a/overrides/Runner/Filter/NameFilterIterator.php +++ b/overrides/Runner/Filter/NameFilterIterator.php @@ -46,13 +46,15 @@ declare(strict_types=1); namespace PHPUnit\Runner\Filter; use PHPUnit\Framework\Test; -use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestSuite; +use PHPUnit\Runner\PhptTestCase; use RecursiveFilterIterator; use RecursiveIterator; use function end; use function preg_match; +use function sprintf; +use function str_replace; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit @@ -64,14 +66,8 @@ abstract class NameFilterIterator extends RecursiveFilterIterator */ private readonly string $regularExpression; - /** - * @psalm-var ?int - */ private readonly ?int $dataSetMinimum; - /** - * @psalm-var ?int - */ private readonly ?int $dataSetMaximum; /** @@ -97,7 +93,7 @@ abstract class NameFilterIterator extends RecursiveFilterIterator return true; } - if (! $test instanceof TestCase) { + if ($test instanceof PhptTestCase) { return false; } @@ -110,13 +106,68 @@ abstract class NameFilterIterator extends RecursiveFilterIterator $accepted = $set >= $this->dataSetMinimum && $set <= $this->dataSetMaximum; } - return $accepted; + return $this->doAccept($accepted); } + abstract protected function doAccept(bool $result): bool; + /** * @psalm-param non-empty-string $filter * * @psalm-return array{regularExpression: non-empty-string, dataSetMinimum: ?int, dataSetMaximum: ?int} */ - abstract protected function prepareFilter(string $filter): array; + private function prepareFilter(string $filter): array + { + $dataSetMinimum = null; + $dataSetMaximum = null; + + if (@preg_match($filter, '') === false) { + // Handles: + // * testAssertEqualsSucceeds#4 + // * testAssertEqualsSucceeds#4-8 + if (preg_match('/^(.*?)#(\d+)(?:-(\d+))?$/', $filter, $matches)) { + if (isset($matches[3]) && $matches[2] < $matches[3]) { + $filter = sprintf( + '%s.*with data set #(\d+)$', + $matches[1], + ); + + $dataSetMinimum = (int) $matches[2]; + $dataSetMaximum = (int) $matches[3]; + } else { + $filter = sprintf( + '%s.*with data set #%s$', + $matches[1], + $matches[2], + ); + } + } // Handles: + // * testDetermineJsonError@JSON_ERROR_NONE + // * testDetermineJsonError@JSON.* + elseif (preg_match('/^(.*?)@(.+)$/', $filter, $matches)) { + $filter = sprintf( + '%s.*with data set "%s"$', + $matches[1], + $matches[2], + ); + } + + // Escape delimiters in regular expression. Do NOT use preg_quote, + // to keep magic characters. + $filter = sprintf( + '/%s/i', + str_replace( + '/', + '\\/', + $filter, + ), + ); + } + + return [ + 'regularExpression' => $filter, + 'dataSetMinimum' => $dataSetMinimum, + 'dataSetMaximum' => $dataSetMaximum, + ]; + } }