diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d1fdfc2..9d1344c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,13 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] +## [v0.2.2 (2020-06-21)](https://github.com/pestphp/pest/compare/v0.2.1...v0.2.2) +### Added +- `depends` phpunit feature ([#103](https://github.com/pestphp/pest/pull/103)) + +### Fixes +- datasets name conflit ([#101](https://github.com/pestphp/pest/pull/101)) + ## [v0.2.1 (2020-06-17)](https://github.com/pestphp/pest/compare/v0.2.0...v0.2.1) ### Fixes - Multiple `uses` in the same path override previous `uses` ([#97](https://github.com/pestphp/pest/pull/97)) diff --git a/composer.json b/composer.json index ce14bb71..509ee8e4 100644 --- a/composer.json +++ b/composer.json @@ -43,15 +43,15 @@ ] }, "require-dev": { - "ergebnis/phpstan-rules": "^0.14.4", + "ergebnis/phpstan-rules": "^0.15.0", "friendsofphp/php-cs-fixer": "^2.16.3", - "illuminate/console": "^7.10.3", - "illuminate/support": "^7.10.3", - "mockery/mockery": "^1.3.1", - "phpstan/phpstan": "^0.12.25", + "illuminate/console": "^7.16.1", + "illuminate/support": "^7.16.1", + "mockery/mockery": "^1.4.0", + "phpstan/phpstan": "^0.12.30", "phpstan/phpstan-strict-rules": "^0.12.2", - "rector/rector": "^0.7.25", - "symfony/var-dumper": "^5.0.8", + "rector/rector": "^0.7.37", + "symfony/var-dumper": "^5.1.2", "thecodingmachine/phpstan-strict-rules": "^0.12.0" }, "minimum-stability": "dev", @@ -70,7 +70,7 @@ "test:types": "phpstan analyse --ansi", "test:unit": "php bin/pest --colors=always --exclude-group=integration", "test:integration": "php bin/pest --colors=always --group=integration", - "test:update:snapshots": "REBUILD_SNAPSHOTS=true php bin/pest --colors=always", + "update:snapshots": "REBUILD_SNAPSHOTS=true php bin/pest --colors=always", "test": [ "@test:lint", "@test:types", diff --git a/phpstan.neon b/phpstan.neon index 866178f7..e133d425 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -15,9 +15,9 @@ parameters: reportUnmatchedIgnoredErrors: true ignoreErrors: + - "#Undefined variable: \\$this#" - "#is not allowed to extend#" - "#Language construct eval#" - "# with null as default value#" - - "#Using \\$this in static method#" - "#has parameter \\$closure with default value.#" - "#has parameter \\$description with default value.#" diff --git a/src/Concerns/TestCase.php b/src/Concerns/TestCase.php index 5dbac402..fecd488e 100644 --- a/src/Concerns/TestCase.php +++ b/src/Concerns/TestCase.php @@ -129,16 +129,25 @@ trait TestCase /** * Runs the test. + * + * @return mixed + * + * @throws \Throwable */ - 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 + /** + * @return mixed + * + * @throws \Throwable + */ + 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); }); } diff --git a/src/Factories/TestCaseFactory.php b/src/Factories/TestCaseFactory.php index 49c6eaad..f3e8e282 100644 --- a/src/Factories/TestCaseFactory.php +++ b/src/Factories/TestCaseFactory.php @@ -132,10 +132,14 @@ final class TestCaseFactory $proxies = $this->proxies; $factoryTest = $this->test; - $test = function () use ($chains, $proxies, $factoryTest): void { + /** + * @return mixed + */ + $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..e0b7f1c4 100644 --- a/src/PendingObjects/TestCall.php +++ b/src/PendingObjects/TestCall.php @@ -84,6 +84,18 @@ final class TestCall return $this; } + /** + * Sets the test depends. + */ + public function depends(string ...$tests): TestCall + { + $this->testCaseFactory + ->factoryProxies + ->add(Backtrace::file(), Backtrace::line(), 'setDependencies', [$tests]); + + return $this; + } + /** * Makes the test suite only this test case. */ @@ -95,7 +107,7 @@ final class TestCall } /** - * Sets the test groups(s). + * Sets the test group(s). */ public function group(string ...$groups): TestCall { diff --git a/src/Support/ExceptionTrace.php b/src/Support/ExceptionTrace.php index a7166f41..72a1d829 100644 --- a/src/Support/ExceptionTrace.php +++ b/src/Support/ExceptionTrace.php @@ -17,11 +17,15 @@ final class ExceptionTrace /** * Ensures the given closure reports * the good execution context. + * + * @return mixed + * + * @throws \Throwable */ - public static function ensure(Closure $closure): void + public static function ensure(Closure $closure) { try { - $closure(); + return $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/tests/.snapshots/success.txt b/tests/.snapshots/success.txt index 787984ae..4c61fce4 100644 --- a/tests/.snapshots/success.txt +++ b/tests/.snapshots/success.txt @@ -49,6 +49,14 @@ ✓ it creates unique test case names with ('Name 1', Pest\Plugin Object (), true) #3 ✓ it creates unique test case names - count + PASS Tests\Features\Depends + ✓ first + ✓ second + ✓ depends + ✓ depends with ...params + ✓ depends with defined arguments + ✓ depends run test only once + PASS Tests\Features\Exceptions ✓ it gives access the the underlying expectException ✓ it catch exceptions @@ -155,5 +163,5 @@ WARN Tests\Visual\Success s visual snapshot of test suite on success - Tests: 6 skipped, 88 passed - Time: 3.53s + Tests: 6 skipped, 94 passed + Time: 3.73s diff --git a/tests/Features/Depends.php b/tests/Features/Depends.php new file mode 100644 index 00000000..0e7ed5ea --- /dev/null +++ b/tests/Features/Depends.php @@ -0,0 +1,40 @@ +depends('first', 'second'); + +test('depends with ...params', function (string ...$params) { + assertEquals( + ['first', 'second'], + $params + ); +})->depends('first', 'second'); + +test('depends with defined arguments', function (string $first, string $second) { + assertEquals('first', $first); + assertEquals('second', $second); +})->depends('first', 'second'); + +test('depends run test only once', function () use (&$runCounter) { + assertEquals(2, $runCounter); +})->depends('first', 'second');