diff --git a/composer.json b/composer.json index 9b0aebfa..3449730c 100644 --- a/composer.json +++ b/composer.json @@ -23,7 +23,7 @@ "nunomaduro/termwind": "^2.1.0", "pestphp/pest-plugin": "^3.0.0", "pestphp/pest-plugin-arch": "^3.0.0", - "pestphp/pest-plugin-mutate": "^3.0.3", + "pestphp/pest-plugin-mutate": "^3.0.4", "phpunit/phpunit": "^11.3.6" }, "conflict": { diff --git a/src/Functions.php b/src/Functions.php index fca2b5a4..cdba1d0a 100644 --- a/src/Functions.php +++ b/src/Functions.php @@ -217,7 +217,7 @@ function afterAll(Closure $closure): void if (! function_exists('covers')) { /** - * Specifies which classes, or functions, a test method covers. + * Specifies which classes, or functions, a test case covers. * * @param array|string $classesOrFunctions */ @@ -243,3 +243,38 @@ function covers(array|string ...$classesOrFunctions): void } } } + +if (! function_exists('mutates')) { + /** + * Specifies which classes, enums, or traits a test case mutates. + * + * @param array|string $targets + */ + function mutates(array|string ...$targets): void + { + $filename = Backtrace::file(); + + $beforeEachCall = (new BeforeEachCall(TestSuite::getInstance(), $filename)); + $beforeEachCall->group('__pest_mutate_only'); + + /** @var MutationTestRunner $runner */ + $runner = Container::getInstance()->get(MutationTestRunner::class); + /** @var \Pest\Mutate\Repositories\ConfigurationRepository $configurationRepository */ + $configurationRepository = Container::getInstance()->get(ConfigurationRepository::class); + $everything = $configurationRepository->cliConfiguration->toArray()['everything'] ?? false; + $classes = $configurationRepository->cliConfiguration->toArray()['classes'] ?? false; + $paths = $configurationRepository->cliConfiguration->toArray()['paths'] ?? false; + + if ($runner->isEnabled() && ! $everything && ! is_array($classes) && ! is_array($paths)) { + $beforeEachCall->only('__pest_mutate_only'); + } + + /** @var ConfigurationRepository $configurationRepository */ + $configurationRepository = Container::getInstance()->get(ConfigurationRepository::class); + $paths = $configurationRepository->cliConfiguration->toArray()['paths'] ?? false; + + if (! is_array($paths)) { + $configurationRepository->globalConfiguration('default')->class(...$targets); // @phpstan-ignore-line + } + } +}