diff --git a/src/PendingCalls/TestCall.php b/src/PendingCalls/TestCall.php index 9b1edabc..1bc29e7a 100644 --- a/src/PendingCalls/TestCall.php +++ b/src/PendingCalls/TestCall.php @@ -104,6 +104,24 @@ final class TestCall return $this; } + /** + * Asserts that the test throws the given `$exceptionClass` when called if the given condition is falsy. + * + * @param (callable(): bool)|bool $condition + */ + public function throwsUnless(callable|bool $condition, string|int $exception, string $exceptionMessage = null, int $exceptionCode = null): self + { + $condition = is_callable($condition) + ? $condition + : static fn (): bool => $condition; + + if (! $condition()) { + return $this->throws($exception, $exceptionMessage, $exceptionCode); + } + + return $this; + } + /** * Runs the current test multiple times with * each item of the given `iterable`. diff --git a/tests/Features/Exceptions.php b/tests/Features/Exceptions.php index 3b45b0db..d0ce2c6c 100644 --- a/tests/Features/Exceptions.php +++ b/tests/Features/Exceptions.php @@ -59,3 +59,37 @@ it('can just define the message if given condition is 1', function () { it('can just define the code if given condition is 1', function () { throw new Exception('Something bad happened', 1); })->throwsIf(1, 1); + +it('not catch exceptions if given condition is true', function () { + $this->assertTrue(true); +})->throwsUnless(true, Exception::class); + +it('catch exceptions if given condition is falsy', function () { + throw new Exception('Something bad happened'); +})->throwsUnless(function () { + return false; +}, Exception::class); + +it('catch exceptions and messages if given condition is falsy', function () { + throw new Exception('Something bad happened'); +})->throwsUnless(false, Exception::class, 'Something bad happened'); + +it('catch exceptions, messages and code if given condition is falsy', function () { + throw new Exception('Something bad happened', 1); +})->throwsUnless(false, Exception::class, 'Something bad happened', 1); + +it('can just define the message if given condition is falsy', function () { + throw new Exception('Something bad happened'); +})->throwsUnless(false, 'Something bad happened'); + +it('can just define the code if given condition is falsy', function () { + throw new Exception('Something bad happened', 1); +})->throwsUnless(false, 1); + +it('can just define the message if given condition is 0', function () { + throw new Exception('Something bad happened'); +})->throwsUnless(0, 'Something bad happened'); + +it('can just define the code if given condition is 0', function () { + throw new Exception('Something bad happened', 1); +})->throwsUnless(0, 1);