diff --git a/src/Concerns/TestCase.php b/src/Concerns/TestCase.php index 5dbac402..8191256c 100644 --- a/src/Concerns/TestCase.php +++ b/src/Concerns/TestCase.php @@ -53,6 +53,11 @@ trait TestCase $this->setGroups($groups); } + public function addDependencies(array $tests): void + { + $this->setDependencies($tests); + } + /** * Returns the test case name. Note that, in Pest * we ignore withDataset argument as the description @@ -130,16 +135,16 @@ trait TestCase /** * Runs the test. */ - public function __test(): void + public function __test() { - $this->__callClosure($this->__test, func_get_args()); + return $this->__callClosure($this->__test, func_get_args()); } - private function __callClosure(Closure $closure, array $arguments): void + private function __callClosure(Closure $closure, array $arguments) { - ExceptionTrace::ensure(function () use ($closure, $arguments) { - call_user_func_array(Closure::bind($closure, $this, get_class($this)), $arguments); - }); + return ExceptionTrace::ensure(function () use ($closure, $arguments) { + return call_user_func_array(Closure::bind($closure, $this, get_class($this)), $arguments); + })->getValue(); } public function getPrintableTestCaseName(): string diff --git a/src/Factories/TestCaseFactory.php b/src/Factories/TestCaseFactory.php index 49c6eaad..88124936 100644 --- a/src/Factories/TestCaseFactory.php +++ b/src/Factories/TestCaseFactory.php @@ -132,10 +132,11 @@ final class TestCaseFactory $proxies = $this->proxies; $factoryTest = $this->test; - $test = function () use ($chains, $proxies, $factoryTest): void { + $test = function () use ($chains, $proxies, $factoryTest) { $proxies->proxy($this); $chains->chain($this); - call_user_func(Closure::bind($factoryTest, $this, get_class($this)), ...func_get_args()); + + return call_user_func(Closure::bind($factoryTest, $this, get_class($this)), ...func_get_args()); }; $className = $this->makeClassFromFilename($this->filename); diff --git a/src/PendingObjects/TestCall.php b/src/PendingObjects/TestCall.php index 7b7549ae..66703a50 100644 --- a/src/PendingObjects/TestCall.php +++ b/src/PendingObjects/TestCall.php @@ -84,6 +84,20 @@ final class TestCall return $this; } + public function dependsOn(string ...$tests): TestCall + { + $this->testCaseFactory + ->factoryProxies + ->add(Backtrace::file(), Backtrace::line(), 'addDependencies', [$tests]); + + return $this; + } + + public function depends(string ...$tests): TestCall + { + return $this->dependsOn(...$tests); + } + /** * Makes the test suite only this test case. */ diff --git a/src/Support/ExceptionTrace.php b/src/Support/ExceptionTrace.php index a7166f41..320716e0 100644 --- a/src/Support/ExceptionTrace.php +++ b/src/Support/ExceptionTrace.php @@ -18,10 +18,10 @@ final class ExceptionTrace * Ensures the given closure reports * the good execution context. */ - public static function ensure(Closure $closure): void + public static function ensure(Closure $closure): Mixed { try { - $closure(); + return new Mixed($closure()); } catch (Throwable $throwable) { if (Str::startsWith($message = $throwable->getMessage(), self::UNDEFINED_METHOD)) { $message = str_replace(self::UNDEFINED_METHOD, 'Call to undefined method ', $message); diff --git a/src/Support/Mixed.php b/src/Support/Mixed.php new file mode 100644 index 00000000..17ea6060 --- /dev/null +++ b/src/Support/Mixed.php @@ -0,0 +1,32 @@ +value = $value; + } + + /** + * @return mixed + */ + public function getValue() + { + return $this->value; + } +} diff --git a/tests/.snapshots/success.txt b/tests/.snapshots/success.txt index 961a0180..a0b846d0 100644 --- a/tests/.snapshots/success.txt +++ b/tests/.snapshots/success.txt @@ -42,6 +42,15 @@ ✓ eager registered wrapped datasets did the job right ✓ lazy named datasets with (Bar Object (...)) + PASS Tests\Features\Depends + ✓ first + ✓ second + ✓ dependsOn + ✓ dependsOn with ...params + ✓ dependsOn with defined arguments + ✓ dependsOn run test only once + ✓ depends alias for dependsOn + PASS Tests\Features\Exceptions ✓ it gives access the the underlying expectException ✓ it catch exceptions @@ -144,5 +153,5 @@ WARN Tests\Visual\Success s visual snapshot of test suite on success - Tests: 6 skipped, 79 passed - Time: 3.44s + Tests: 6 skipped, 86 passed + Time: 2.61s diff --git a/tests/Features/Depends.php b/tests/Features/Depends.php new file mode 100644 index 00000000..0bf30539 --- /dev/null +++ b/tests/Features/Depends.php @@ -0,0 +1,47 @@ +dependsOn('first', 'second'); + +test('dependsOn with ...params', function (string ...$params) { + assertEquals( + ['first', 'second'], + $params + ); +})->dependsOn('first', 'second'); + +test('dependsOn with defined arguments', function (string $first, string $second) { + assertEquals('first', $first); + assertEquals('second', $second); +})->dependsOn('first', 'second'); + +test('dependsOn run test only once', function () use (&$runCounter) { + assertEquals(2, $runCounter); +})->dependsOn('first', 'second'); + +test('depends alias for dependsOn', function (string ...$params) { + assertEquals( + ['first', 'second'], + $params + ); +})->depends('first', 'second');