diff --git a/lib/Assert/AssertionChain.php b/lib/Assert/AssertionChain.php index dbb6e839..d5017b64 100644 --- a/lib/Assert/AssertionChain.php +++ b/lib/Assert/AssertionChain.php @@ -142,6 +142,13 @@ class AssertionChain */ private $all = false; + /** + * Perform a negative assertion. + * + * @var bool + */ + private $not = false; + /** @var string|Assertion Class to use for assertion calls */ private $assertionClassName = 'Assert\Assertion'; @@ -197,6 +204,10 @@ public function __call($methodName, $args): AssertionChain } } + if ($this->not) { + $methodName = 'not'.$methodName; + } + if ($this->all) { $methodName = 'all'.$methodName; } @@ -218,6 +229,18 @@ public function all(): AssertionChain return $this; } + /** + * Switch chain into negative mode. + * + * @return \Assert\AssertionChain + */ + public function not() + { + $this->not = true; + + return $this; + } + /** * Switch chain into mode allowing nulls, ignoring further assertions. * diff --git a/tests/Assert/Tests/AssertionChainFunctionsTest.php b/tests/Assert/Tests/AssertionChainFunctionsTest.php index e971db4d..e74f93ed 100644 --- a/tests/Assert/Tests/AssertionChainFunctionsTest.php +++ b/tests/Assert/Tests/AssertionChainFunctionsTest.php @@ -51,6 +51,11 @@ public function testThatAssertionChainFunctionsValidatesAllInputs() $this->assertInstanceOf(AssertionChain::class, \Assert\that([1, 2, 3])->all()->integer()); } + public function testThatAssertionChainFunctionsValidateNegativeAssertions() + { + $this->assertInstanceOf(AssertionChain::class, \Assert\that('foo')->not()->isInstanceOf(\stdClass::class)); + } + public function testAssertionChainFunctionsThatAllShortcut() { $this->assertInstanceOf(AssertionChain::class, \Assert\thatAll([1, 2, 3])->integer()); diff --git a/tests/Assert/Tests/AssertionChainTest.php b/tests/Assert/Tests/AssertionChainTest.php index bf54c61b..a23475ce 100644 --- a/tests/Assert/Tests/AssertionChainTest.php +++ b/tests/Assert/Tests/AssertionChainTest.php @@ -45,6 +45,11 @@ public function testThatAssertionChainSkipAssertionsOnValidNull() $this->assertInstanceOf(AssertionChain::class, Assert::that(null)->nullOr()->integer()->eq(10)); } + public function testThatAssertionChainDoesANegativeAssert() + { + $this->assertInstanceOf(AssertionChain::class, Assert::that(1)->not()->eq(10)); + } + public function testThatAssertionChainValidatesAllInputs() { $this->assertInstanceOf(AssertionChain::class, Assert::that([1, 2, 3])->all()->integer());