Fixes filtering tests

This commit is contained in:
Nuno Maduro
2025-04-29 11:38:33 +01:00
parent db9243ca2e
commit a310796165
31 changed files with 98 additions and 58 deletions

View File

@ -45,6 +45,7 @@ declare(strict_types=1);
namespace PHPUnit\TextUI;
use Pest\Plugins\Only;
use Pest\Runner\Filter\EnsureTestCaseIsInitiatedFilter;
use PHPUnit\Event;
use PHPUnit\Framework\TestSuite;
use PHPUnit\Runner\Filter\Factory;
@ -66,6 +67,12 @@ final readonly class TestSuiteFilterProcessor
{
$factory = new Factory;
// @phpstan-ignore-next-line
(fn () => $this->filters[] = [
'className' => EnsureTestCaseIsInitiatedFilter::class,
'argument' => '',
])->call($factory);
if (! $configuration->hasFilter() &&
! $configuration->hasGroups() &&
! $configuration->hasExcludeGroups() &&
@ -73,6 +80,8 @@ final readonly class TestSuiteFilterProcessor
! $configuration->hasTestsCovering() &&
! $configuration->hasTestsUsing() &&
! Only::isEnabled()) {
$suite->injectFilter($factory);
return;
}

View File

@ -17,7 +17,7 @@ final class BootExcludeList implements Bootstrapper
*
* @var array<int, non-empty-string>
*/
private const EXCLUDE_LIST = [
private const array EXCLUDE_LIST = [
'bin',
'overrides',
'resources',

View File

@ -24,7 +24,7 @@ final class BootFiles implements Bootstrapper
*
* @var array<int, string>
*/
private const STRUCTURE = [
private const array STRUCTURE = [
'Expectations',
'Expectations.php',
'Helpers',

View File

@ -17,7 +17,7 @@ final class BootOverrides implements Bootstrapper
*
* @var array<string, string>
*/
public const FILES = [
public const array FILES = [
'53c246e5f416a39817ac81124cdd64ea8403038d01d7a202e1ffa486fbdf3fa7' => 'Runner/Filter/NameFilterIterator.php',
'77ffb7647b583bd82e37962c6fbdc4b04d3344d8a2c1ed103e625ed1ff7cb5c2' => 'Runner/ResultCache/DefaultResultCache.php',
'd0e81317889ad88c707db4b08a94cadee4c9010d05ff0a759f04e71af5efed89' => 'Runner/TestSuiteLoader.php',

View File

@ -20,7 +20,7 @@ final readonly class BootSubscribers implements Bootstrapper
*
* @var array<int, class-string<Subscriber>>
*/
private const SUBSCRIBERS = [
private const array SUBSCRIBERS = [
Subscribers\EnsureConfigurationIsAvailable::class,
Subscribers\EnsureIgnorableTestCasesAreIgnored::class,
Subscribers\EnsureKernelDumpIsFlushed::class,

View File

@ -219,9 +219,6 @@ trait Testable
{
TestSuite::getInstance()->test = $this;
// Initialize test case properties
$this->__initializeTestCase();
$method = TestSuite::getInstance()->tests->get(self::$__filename)->getMethod($this->name());
$method->setUp($this);
@ -270,7 +267,7 @@ trait Testable
/**
* Initialize test case properties from TestSuite.
*/
private function __initializeTestCase(): void
public function __initializeTestCase(): void
{
// Return if the test case has already been initialized
if (isset($this->__test)) {

View File

@ -16,7 +16,7 @@ final readonly class Help
*
* @var array<int, string>
*/
private const HELP_MESSAGES = [
private const array HELP_MESSAGES = [
'<comment>Pest Options:</comment>',
' <info>--init</info> Initialise a standard Pest configuration',
' <info>--coverage</info> Enable coverage and output to standard output',

View File

@ -22,7 +22,7 @@ final readonly class Thanks
*
* @var array<string, string>
*/
private const FUNDING_MESSAGES = [
private const array FUNDING_MESSAGES = [
'Star' => 'https://github.com/pestphp/pest',
'YouTube' => 'https://youtube.com/@nunomaduro',
'TikTok' => 'https://tiktok.com/@nunomaduro',

View File

@ -34,7 +34,7 @@ final readonly class Kernel
*
* @var array<int, class-string>
*/
private const BOOTSTRAPPERS = [
private const array BOOTSTRAPPERS = [
Bootstrappers\BootOverrides::class,
Bootstrappers\BootSubscribers::class,
Bootstrappers\BootFiles::class,

View File

@ -31,7 +31,7 @@ final readonly class Converter
/**
* The prefix for the test suite name.
*/
private const PREFIX = 'P\\';
private const string PREFIX = 'P\\';
/**
* The state generator.

View File

@ -21,7 +21,7 @@ final class Cache implements HandlesArguments
/**
* The temporary folder.
*/
private const TEMPORARY_FOLDER = __DIR__
private const string TEMPORARY_FOLDER = __DIR__
.DIRECTORY_SEPARATOR
.'..'
.DIRECTORY_SEPARATOR

View File

@ -21,7 +21,7 @@ final class Configuration implements HandlesArguments, Terminable
/**
* The base PHPUnit file.
*/
public const BASE_PHPUNIT_FILE = __DIR__
public const string BASE_PHPUNIT_FILE = __DIR__
.DIRECTORY_SEPARATOR
.'..'
.DIRECTORY_SEPARATOR

View File

@ -17,20 +17,11 @@ use Symfony\Component\Console\Output\OutputInterface;
*/
final class Coverage implements AddsOutput, HandlesArguments
{
/**
* @var string
*/
private const COVERAGE_OPTION = 'coverage';
private const string COVERAGE_OPTION = 'coverage';
/**
* @var string
*/
private const MIN_OPTION = 'min';
private const string MIN_OPTION = 'min';
/**
* @var string
*/
private const EXACTLY_OPTION = 'exactly';
private const string EXACTLY_OPTION = 'exactly';
/**
* Whether it should show the coverage or not.

View File

@ -14,12 +14,12 @@ final class Environment implements HandlesArguments
/**
* The continuous integration environment.
*/
public const CI = 'ci';
public const string CI = 'ci';
/**
* The local environment.
*/
public const LOCAL = 'local';
public const string LOCAL = 'local';
/**
* The current environment.

View File

@ -20,12 +20,12 @@ final readonly class Init implements HandlesArguments
/**
* The option the triggers the init job.
*/
private const INIT_OPTION = '--init';
private const string INIT_OPTION = '--init';
/**
* The files that will be created.
*/
private const STUBS = [
private const array STUBS = [
'phpunit.xml.stub' => 'phpunit.xml',
'Pest.php.stub' => 'tests/Pest.php',
'TestCase.php.stub' => 'tests/TestCase.php',

View File

@ -15,7 +15,7 @@ final class Only implements Terminable
/**
* The temporary folder.
*/
private const TEMPORARY_FOLDER = __DIR__
private const string TEMPORARY_FOLDER = __DIR__
.DIRECTORY_SEPARATOR
.'..'
.DIRECTORY_SEPARATOR

View File

@ -23,9 +23,9 @@ final class Parallel implements HandlesArguments
{
use HandleArguments;
private const GLOBAL_PREFIX = 'PEST_PARALLEL_GLOBAL_';
private const string GLOBAL_PREFIX = 'PEST_PARALLEL_GLOBAL_';
private const HANDLERS = [
private const array HANDLERS = [
Parallel\Handlers\Parallel::class,
Parallel\Handlers\Pest::class,
Parallel\Handlers\Laravel::class,
@ -34,7 +34,7 @@ final class Parallel implements HandlesArguments
/**
* @var string[]
*/
private const UNSUPPORTED_ARGUMENTS = ['--todo', '--todos', '--retry', '--notes', '--issue', '--pr', '--pull-request'];
private const array UNSUPPORTED_ARGUMENTS = ['--todo', '--todos', '--retry', '--notes', '--issue', '--pr', '--pull-request'];
/**
* Whether the given command line arguments indicate that the test suite should be run in parallel.

View File

@ -18,7 +18,7 @@ final class Parallel implements HandlesArguments
/**
* The list of arguments to remove.
*/
private const ARGS_TO_REMOVE = [
private const array ARGS_TO_REMOVE = [
'--parallel',
'-p',
'--no-output',

View File

@ -11,6 +11,7 @@ final class CleanConsoleOutput extends ConsoleOutput
/**
* {@inheritdoc}
*/
#[\Override]
protected function doWrite(string $message, bool $newline): void // @pest-arch-ignore-line
{
if ($this->isOpeningHeadline($message)) {

View File

@ -50,7 +50,7 @@ final class WrapperRunner implements RunnerInterface
/**
* The time to sleep between cycles.
*/
private const CYCLE_SLEEP = 10000;
private const int CYCLE_SLEEP = 10000;
/**
* The result printer.
@ -313,7 +313,6 @@ final class WrapperRunner implements RunnerInterface
$testResult = unserialize($contents);
assert($testResult instanceof TestResult);
$testResultSum = new TestResult(
(int) $testResultSum->hasTests() + (int) $testResult->hasTests(),
$testResultSum->numberOfTestsRun() + $testResult->numberOfTestsRun(),
@ -328,15 +327,25 @@ final class WrapperRunner implements RunnerInterface
array_merge_recursive($testResultSum->testTriggeredPhpunitErrorEvents(), $testResult->testTriggeredPhpunitErrorEvents()),
array_merge_recursive($testResultSum->testTriggeredPhpunitNoticeEvents(), $testResult->testTriggeredPhpunitNoticeEvents()),
array_merge_recursive($testResultSum->testTriggeredPhpunitWarningEvents(), $testResult->testTriggeredPhpunitWarningEvents()),
// @phpstan-ignore-next-line
array_merge_recursive($testResultSum->testRunnerTriggeredDeprecationEvents(), $testResult->testRunnerTriggeredDeprecationEvents()),
// @phpstan-ignore-next-line
array_merge_recursive($testResultSum->testRunnerTriggeredNoticeEvents(), $testResult->testRunnerTriggeredNoticeEvents()),
// @phpstan-ignore-next-line
array_merge_recursive($testResultSum->testRunnerTriggeredWarningEvents(), $testResult->testRunnerTriggeredWarningEvents()),
// @phpstan-ignore-next-line
array_merge_recursive($testResultSum->errors(), $testResult->errors()),
// @phpstan-ignore-next-line
array_merge_recursive($testResultSum->deprecations(), $testResult->deprecations()),
// @phpstan-ignore-next-line
array_merge_recursive($testResultSum->notices(), $testResult->notices()),
// @phpstan-ignore-next-line
array_merge_recursive($testResultSum->warnings(), $testResult->warnings()),
// @phpstan-ignore-next-line
array_merge_recursive($testResultSum->phpDeprecations(), $testResult->phpDeprecations()),
// @phpstan-ignore-next-line
array_merge_recursive($testResultSum->phpNotices(), $testResult->phpNotices()),
// @phpstan-ignore-next-line
array_merge_recursive($testResultSum->phpWarnings(), $testResult->phpWarnings()),
$testResultSum->numberOfIssuesIgnoredByBaseline() + $testResult->numberOfIssuesIgnoredByBaseline(),
);

View File

@ -34,7 +34,7 @@ final class CompactPrinter
/**
* @var array<string, array<int, string>>
*/
private const LOOKUP_TABLE = [
private const array LOOKUP_TABLE = [
'.' => ['gray', '.'],
'S' => ['yellow', 's'],
'T' => ['cyan', 't'],

View File

@ -16,7 +16,7 @@ final class Verbose implements HandlesArguments
/**
* The list of verbosity levels.
*/
private const VERBOSITY_LEVELS = ['v', 'vv', 'vvv', 'q'];
private const array VERBOSITY_LEVELS = ['v', 'vv', 'vvv', 'q'];
/**
* {@inheritDoc}

View File

@ -19,7 +19,7 @@ use function sprintf;
*/
final class DatasetsRepository
{
private const SEPARATOR = '>>';
private const string SEPARATOR = '>>';
/**
* Holds the datasets.

View File

@ -13,11 +13,11 @@ use PHPUnit\TextUI\Configuration\Configuration;
*/
final class Result
{
private const SUCCESS_EXIT = 0;
private const int SUCCESS_EXIT = 0;
private const FAILURE_EXIT = 1;
private const int FAILURE_EXIT = 1;
private const EXCEPTION_EXIT = 2;
private const int EXCEPTION_EXIT = 2;
/**
* If the exit code is different from 0.

View File

@ -0,0 +1,39 @@
<?php
declare(strict_types=1);
namespace Pest\Runner\Filter;
use Pest\Contracts\HasPrintableTestCaseName;
use PHPUnit\Framework\Test;
use RecursiveFilterIterator;
use RecursiveIterator;
/**
* @internal
*/
final class EnsureTestCaseIsInitiatedFilter extends RecursiveFilterIterator
{
/**
* @param RecursiveIterator<int, Test> $iterator
*/
public function __construct(RecursiveIterator $iterator)
{
parent::__construct($iterator);
}
/**
* {@inheritdoc}
*/
public function accept(): bool
{
$test = $this->getInnerIterator()->current();
if ($test instanceof HasPrintableTestCaseName) {
/** @phpstan-ignore-next-line */
$test->__initializeTestCase();
}
return true;
}
}

View File

@ -11,12 +11,9 @@ use Pest\Exceptions\ShouldNotHappen;
*/
final class Backtrace
{
/**
* @var string
*/
private const FILE = 'file';
private const string FILE = 'file';
private const BACKTRACE_OPTIONS = DEBUG_BACKTRACE_IGNORE_ARGS;
private const int BACKTRACE_OPTIONS = DEBUG_BACKTRACE_IGNORE_ARGS;
/**
* Returns the current test file.

View File

@ -11,9 +11,9 @@ use function Pest\testDirectory;
*/
final class DatasetInfo
{
public const DATASETS_DIR_NAME = 'Datasets';
public const string DATASETS_DIR_NAME = 'Datasets';
public const DATASETS_FILE_NAME = 'Datasets.php';
public const string DATASETS_FILE_NAME = 'Datasets.php';
public static function isInsideADatasetsDirectory(string $file): bool
{

View File

@ -13,7 +13,7 @@ use Throwable;
*/
final class ExceptionTrace
{
private const UNDEFINED_METHOD = 'Call to undefined method P\\';
private const string UNDEFINED_METHOD = 'Call to undefined method P\\';
/**
* Ensures the given closure reports the good execution context.

View File

@ -15,7 +15,7 @@ final readonly class Exporter
/**
* The maximum number of items in an array to export.
*/
private const MAX_ARRAY_ITEMS = 3;
private const int MAX_ARRAY_ITEMS = 3;
/**
* Creates a new Exporter instance.

View File

@ -13,7 +13,7 @@ use Throwable;
*/
final class HigherOrderMessage
{
public const UNDEFINED_METHOD = 'Method %s does not exist';
public const string UNDEFINED_METHOD = 'Method %s does not exist';
/**
* An optional condition that will determine if the message will be executed.

View File

@ -13,12 +13,9 @@ final class Str
* Pool of alpha-numeric characters for generating (unsafe) random strings
* from.
*/
private const POOL = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
private const string POOL = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
/**
* @var string
*/
private const PREFIX = '__pest_evaluable_';
private const string PREFIX = '__pest_evaluable_';
/**
* Create a (unsecure & non-cryptographically safe) random alpha-numeric