diff --git a/src/Mixins/Expectation.php b/src/Mixins/Expectation.php index 303a3965..fa6c6ee8 100644 --- a/src/Mixins/Expectation.php +++ b/src/Mixins/Expectation.php @@ -272,6 +272,23 @@ final class Expectation return $this; } + /** + * Asserts that the size of the value and $expected are the same. + * + * @param array $expected + * @return self + */ + public function toHaveSameSize(iterable $expected, string $message = ''): self + { + if (! is_countable($this->value) && ! is_iterable($this->value)) { + InvalidExpectationValue::expected('countable|iterable'); + } + + Assert::assertSameSize($expected, $this->value, $message); + + return $this; + } + /** * Asserts that the value contains the property $name. * diff --git a/tests/Features/Expect/toHaveSameSize.php b/tests/Features/Expect/toHaveSameSize.php new file mode 100644 index 00000000..9039f0c1 --- /dev/null +++ b/tests/Features/Expect/toHaveSameSize.php @@ -0,0 +1,24 @@ +toHaveSameSize([1]); +})->throws(InvalidExpectationValue::class, 'Invalid expectation value type. Expected [countable|iterable].'); + +test('pass', function () { + expect([1, 2, 3])->toHaveSameSize([4, 5, 6]); +}); + +test('failures', function () { + expect([1, 2, 3])->toHaveSameSize([1]); +})->throws(ExpectationFailedException::class); + +test('failures with message', function () { + expect([1, 2, 3])->toHaveSameSize([1], 'oh no!'); +})->throws(ExpectationFailedException::class, 'oh no!'); + +test('not failures', function () { + expect([1, 2, 3])->not->toHaveSameSize([1]); +});