diff --git a/src/PendingObjects/TestCall.php b/src/PendingObjects/TestCall.php index be839bff..f8ada58d 100644 --- a/src/PendingObjects/TestCall.php +++ b/src/PendingObjects/TestCall.php @@ -78,6 +78,26 @@ final class TestCall return $this; } + /** + * Asserts that the test throws the given `$exceptionClass` when called if the given condition is true. + * + * @param Closure|bool|int $condition + */ + public function throwsIf($condition, string $exception, string $exceptionMessage = null): TestCall + { + $condition = is_callable($condition) + ? $condition + : Closure::fromCallable(function () use ($condition): bool { + return (bool) $condition; + }); + + if ($condition() === true) { + return $this->throws($exception, $exceptionMessage); + } + + return $this; + } + /** * Runs the current test multiple times with * each item of the given `iterable`. diff --git a/tests/.snapshots/success.txt b/tests/.snapshots/success.txt index 328c8e9f..cac11672 100644 --- a/tests/.snapshots/success.txt +++ b/tests/.snapshots/success.txt @@ -107,6 +107,11 @@ ✓ it catch exceptions ✓ it catch exceptions and messages ✓ it can just define the message + ✓ it not catch exceptions if given condition is false + ✓ it catch exceptions if given condition is true + ✓ it catch exceptions and messages if given condition is true + ✓ it can just define the message if given condition is true + ✓ it can just define the message if given condition is 1 PASS Tests\Features\Expect\HigherOrder\methods ✓ it can access methods diff --git a/tests/Features/Exceptions.php b/tests/Features/Exceptions.php index 37eaaeb9..9970c2a9 100644 --- a/tests/Features/Exceptions.php +++ b/tests/Features/Exceptions.php @@ -17,3 +17,23 @@ it('catch exceptions and messages', function () { it('can just define the message', function () { throw new Exception('Something bad happened'); })->throws('Something bad happened'); + +it('not catch exceptions if given condition is false', function () { + $this->assertTrue(true); +})->throwsIf(false, Exception::class); + +it('catch exceptions if given condition is true', function () { + throw new Exception('Something bad happened'); +})->throwsIf(function () { return true; }, Exception::class); + +it('catch exceptions and messages if given condition is true', function () { + throw new Exception('Something bad happened'); +})->throwsIf(true, Exception::class, 'Something bad happened'); + +it('can just define the message if given condition is true', function () { + throw new Exception('Something bad happened'); +})->throwsIf(true, 'Something bad happened'); + +it('can just define the message if given condition is 1', function () { + throw new Exception('Something bad happened'); +})->throwsIf(1, 'Something bad happened');