diff --git a/src/ArchPresets/AbstractPreset.php b/src/ArchPresets/AbstractPreset.php new file mode 100644 index 00000000..b270a023 --- /dev/null +++ b/src/ArchPresets/AbstractPreset.php @@ -0,0 +1,54 @@ + $userNamespaces + * @param array $expectations + */ + final public function __construct(// @phpstan-ignore-line + protected array $userNamespaces, + protected array $expectations = [], + ) { + // + } + + /** + * Executes the arch preset. + * + * @internal + */ + abstract public function execute(): void; + + /** + * Ignores the given "targets" or "dependencies". + * + * @param array|string $targetsOrDependencies + */ + final public function ignoring(array|string $targetsOrDependencies): void + { + $this->expectations = array_map( + fn (ArchExpectation $expectation): \Pest\Arch\Contracts\ArchExpectation => $expectation->ignoring($targetsOrDependencies), + $this->expectations, + ); + } + + /** + * Flushes the expectations. + */ + final public function flush(): void + { + $this->expectations = []; + } +} diff --git a/src/ArchPresets/Base.php b/src/ArchPresets/Base.php index cfa9455f..f2a98a87 100644 --- a/src/ArchPresets/Base.php +++ b/src/ArchPresets/Base.php @@ -4,24 +4,17 @@ declare(strict_types=1); namespace Pest\ArchPresets; -use Pest\Arch\Contracts\ArchExpectation; -use Pest\Contracts\ArchPreset; -use Pest\PendingCalls\TestCall; - /** * @internal */ -final class Base implements ArchPreset +final class Base extends AbstractPreset { /** - * Boots the arch preset. - * - * @param array $baseNamespace + * Executes the arch preset. */ - public function boot(TestCall $testCall, array $baseNamespace): TestCall|ArchExpectation + public function execute(): void { - return $testCall // @phpstan-ignore-line - ->expect(['dd', 'dump', 'ray', 'die', 'var_dump', 'sleep', 'eval', 'ini_set']) + $this->expectations[] = expect(['dd', 'dump', 'ray', 'die', 'var_dump', 'sleep', 'eval', 'ini_set']) ->not ->toBeUsed(); } diff --git a/src/ArchPresets/Strict.php b/src/ArchPresets/Strict.php index 9d93b7ed..23891c4e 100644 --- a/src/ArchPresets/Strict.php +++ b/src/ArchPresets/Strict.php @@ -4,25 +4,19 @@ declare(strict_types=1); namespace Pest\ArchPresets; -use Pest\Arch\Contracts\ArchExpectation; -use Pest\Contracts\ArchPreset; -use Pest\PendingCalls\TestCall; - /** * @internal */ -final class Strict implements ArchPreset +final class Strict extends AbstractPreset { /** - * Boots the arch preset. - * - * @param array $baseNamespaces + * Executes the arch preset. */ - public function boot(TestCall $testCall, array $baseNamespaces): TestCall|ArchExpectation + public function execute(): void { - return $testCall // @phpstan-ignore-line - ->expect($baseNamespaces) - ->each - ->toUseStrictTypes(); + foreach ($this->userNamespaces as $namespace) { + $this->expectations[] = expect($namespace) + ->toUseStrictTypes(); + } } } diff --git a/src/Contracts/ArchPreset.php b/src/Contracts/ArchPreset.php index 24a250d3..6f5a0fca 100644 --- a/src/Contracts/ArchPreset.php +++ b/src/Contracts/ArchPreset.php @@ -4,18 +4,9 @@ declare(strict_types=1); namespace Pest\Contracts; -use Pest\Arch\Contracts\ArchExpectation; -use Pest\PendingCalls\TestCall; - /** * @internal */ interface ArchPreset { - /** - * Boots the arch preset. - * - * @param array $baseNamespaces - */ - public function boot(TestCall $testCall, array $baseNamespaces): TestCall|ArchExpectation; } diff --git a/src/Preset.php b/src/Preset.php index 6df57197..a6ee3a66 100644 --- a/src/Preset.php +++ b/src/Preset.php @@ -4,9 +4,12 @@ declare(strict_types=1); namespace Pest; -use Pest\Arch\Contracts\ArchExpectation; use Pest\Arch\Support\Composer; +use Pest\ArchPresets\AbstractPreset; +use Pest\ArchPresets\Base; +use Pest\ArchPresets\Strict; use Pest\PendingCalls\TestCall; +use stdClass; /** * @internal @@ -31,19 +34,44 @@ final class Preset /** * Uses the Pest base preset and returns the test call instance. */ - public function base(): TestCall|ArchExpectation + public function base(): Base { - return (new ArchPresets\Base)->boot($this->testCall, $this->baseNamespaces()); + return $this->executePreset(new Base($this->baseNamespaces())); } /** * Uses the Pest strict preset and returns the test call instance. */ - public function strict(): TestCall + public function strict(): Strict { - (new ArchPresets\Strict)->boot($this->testCall, $this->baseNamespaces()); + return $this->executePreset(new Strict($this->baseNamespaces())); + } - return $this->testCall; + /** + * Executes the given preset. + * + * @template TPreset of AbstractPreset + * + * @param TPreset $preset + * @return TPreset + */ + private function executePreset(AbstractPreset $preset): AbstractPreset + { + if ((fn (): ?string => $this->description)->call($this->testCall) === null) { + $description = strtolower((new \ReflectionClass($preset))->getShortName()); + + (fn (): string => $this->description = sprintf('arch "%s" preset', $description))->call($this->testCall); + } + + $this->baseNamespaces(); + + $preset->execute(); + + $this->testCall->testCaseMethod->closure = (function () use ($preset): void { + $preset->flush(); + })->bindTo(new stdClass); + + return $preset; } /** diff --git a/tests/.snapshots/success.txt b/tests/.snapshots/success.txt index b00c7c9e..e13630e6 100644 --- a/tests/.snapshots/success.txt +++ b/tests/.snapshots/success.txt @@ -1,7 +1,7 @@ PASS Tests\Arch - ✓ expect ['dd', 'dump', 'ray', …] → not → toBeUsed → ignoring 'Pest\Expectation' - ✓ expect ['Pest'] → each → toUseStrictTypes + ✓ arch "base" preset + ✓ arch "strict" preset ✓ globals ✓ dependencies ✓ contracts @@ -1268,7 +1268,7 @@ ✓ closure was bound to CustomTestCase PASS Tests\Playground - ✓ expect ['Pest'] → each → toUseStrictTypes + ✓ basic PASS Tests\Plugins\Traits ✓ it allows global uses diff --git a/tests/Playground.php b/tests/Playground.php index dbc1a3ae..be30ae7d 100644 --- a/tests/Playground.php +++ b/tests/Playground.php @@ -1,3 +1,5 @@ preset()->strict(); +test('basic', function () { + expect(true)->toBeTrue(); +});