From d5242a59d035e46774f2e634b374bc39ff62cb95 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Bundyra?= <contact@webimpress.com>
Date: Fri, 23 Feb 2024 09:51:20 +0000
Subject: [PATCH] Narrow type on assertCount and assertNotCount

---
 .../AssertTypeSpecifyingExtensionHelper.php   | 14 +++++++++++++
 tests/Type/PHPUnit/data/assert-function.php   | 21 +++++++++++++++++++
 2 files changed, 35 insertions(+)

diff --git a/src/Type/PHPUnit/Assert/AssertTypeSpecifyingExtensionHelper.php b/src/Type/PHPUnit/Assert/AssertTypeSpecifyingExtensionHelper.php
index 61bb6dd..4951257 100644
--- a/src/Type/PHPUnit/Assert/AssertTypeSpecifyingExtensionHelper.php
+++ b/src/Type/PHPUnit/Assert/AssertTypeSpecifyingExtensionHelper.php
@@ -136,6 +136,20 @@ private static function getExpressionResolvers(): array
 	{
 		if (self::$resolvers === null) {
 			self::$resolvers = [
+				'Count' => static function (Scope $scope, Arg $expected, Arg $actual): Identical {
+					return new Identical(
+						$expected->value,
+						new FuncCall(new Name('count'), [$actual])
+					);
+				},
+				'NotCount' => static function (Scope $scope, Arg $expected, Arg $actual): BooleanNot {
+					return new BooleanNot(
+						new Identical(
+							$expected->value,
+							new FuncCall(new Name('count'), [$actual])
+						)
+					);
+				},
 				'InstanceOf' => static function (Scope $scope, Arg $class, Arg $object): Instanceof_ {
 					return new Instanceof_(
 						$object->value,
diff --git a/tests/Type/PHPUnit/data/assert-function.php b/tests/Type/PHPUnit/data/assert-function.php
index 15c4371..10fb417 100644
--- a/tests/Type/PHPUnit/data/assert-function.php
+++ b/tests/Type/PHPUnit/data/assert-function.php
@@ -7,6 +7,8 @@
 use function PHPUnit\Framework\assertContains;
 use function PHPUnit\Framework\assertContainsEquals;
 use function PHPUnit\Framework\assertContainsOnlyInstancesOf;
+use function PHPUnit\Framework\assertCount;
+use function PHPUnit\Framework\assertNotCount;
 use function PHPUnit\Framework\assertEmpty;
 use function PHPUnit\Framework\assertInstanceOf;
 use function PHPUnit\Framework\assertObjectHasAttribute;
@@ -90,4 +92,23 @@ public function containsOnlyInstancesOf(array $a, \Traversable $b): void
 		assertType('Traversable', $b);
 	}
 
+	public function count(array $a, \Countable $b): void
+	{
+		assertCount(3, $a);
+		assertType('non-empty-array', $a);
+
+		assertCount(7, $b);
+		assertType('Countable', $b);
+	}
+
+	public function notCount(array $a, array $b): void
+	{
+		assertNotCount(0, $a);
+		assertType('non-empty-array', $a);
+
+		// still might be empty
+		assertNotCount(1, $b);
+		assertType('array', $b);
+	}
+
 }