From a0c50d3c0ec41a2aac0376e5d6edffbd8eacf8ff Mon Sep 17 00:00:00 2001 From: Jan Nedbal Date: Mon, 9 Oct 2023 17:22:03 +0200 Subject: [PATCH 1/4] AssertTypeSpecifyingExtensionHelper: rootExpr with unknown variable to avoid always-true false positives --- .../PHPUnit/Assert/AssertTypeSpecifyingExtensionHelper.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Type/PHPUnit/Assert/AssertTypeSpecifyingExtensionHelper.php b/src/Type/PHPUnit/Assert/AssertTypeSpecifyingExtensionHelper.php index 963b4f5..8071adf 100644 --- a/src/Type/PHPUnit/Assert/AssertTypeSpecifyingExtensionHelper.php +++ b/src/Type/PHPUnit/Assert/AssertTypeSpecifyingExtensionHelper.php @@ -90,7 +90,8 @@ public static function specifyTypes( return $typeSpecifier->specifyTypesInCondition( $scope, $expression, - TypeSpecifierContext::createTruthy() + TypeSpecifierContext::createTruthy(), + new Expr\BinaryOp\BooleanAnd($expression, new Expr\Variable(new Name('nonsense'))) ); } From d0b61d1251d70fc89fa8dee9ac4abf26d6f9cb27 Mon Sep 17 00:00:00 2001 From: Jan Nedbal Date: Mon, 9 Oct 2023 17:24:26 +0200 Subject: [PATCH 2/4] Fix var name --- src/Type/PHPUnit/Assert/AssertTypeSpecifyingExtensionHelper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Type/PHPUnit/Assert/AssertTypeSpecifyingExtensionHelper.php b/src/Type/PHPUnit/Assert/AssertTypeSpecifyingExtensionHelper.php index 8071adf..481aeca 100644 --- a/src/Type/PHPUnit/Assert/AssertTypeSpecifyingExtensionHelper.php +++ b/src/Type/PHPUnit/Assert/AssertTypeSpecifyingExtensionHelper.php @@ -91,7 +91,7 @@ public static function specifyTypes( $scope, $expression, TypeSpecifierContext::createTruthy(), - new Expr\BinaryOp\BooleanAnd($expression, new Expr\Variable(new Name('nonsense'))) + new Expr\BinaryOp\BooleanAnd($expression, new Expr\Variable('nonsense')) ); } From 766d06f8a5f50602848881350a71811d71d481e0 Mon Sep 17 00:00:00 2001 From: Jan Nedbal Date: Mon, 9 Oct 2023 17:40:14 +0200 Subject: [PATCH 3/4] Fix only problematic ones, add test --- .../Assert/AssertTypeSpecifyingExtensionHelper.php | 11 ++++++++++- tests/Rules/PHPUnit/data/assert-same.php | 7 +++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Type/PHPUnit/Assert/AssertTypeSpecifyingExtensionHelper.php b/src/Type/PHPUnit/Assert/AssertTypeSpecifyingExtensionHelper.php index 481aeca..d23bf03 100644 --- a/src/Type/PHPUnit/Assert/AssertTypeSpecifyingExtensionHelper.php +++ b/src/Type/PHPUnit/Assert/AssertTypeSpecifyingExtensionHelper.php @@ -33,6 +33,12 @@ class AssertTypeSpecifyingExtensionHelper /** @var Closure[] */ private static $resolvers; + /** + * Those can specify types correctly, but would produce always-true issue + * @var string[] + */ + private static $resolversCausingAlwaysTrue = ['ContainsOnlyInstancesOf', 'ContainsEquals', 'Contains']; + /** * @param Arg[] $args */ @@ -87,11 +93,14 @@ public static function specifyTypes( if ($expression === null) { return new SpecifiedTypes([], []); } + + $bypassAlwaysTrueIssue = in_array(self::trimName($name), self::$resolversCausingAlwaysTrue, true); + return $typeSpecifier->specifyTypesInCondition( $scope, $expression, TypeSpecifierContext::createTruthy(), - new Expr\BinaryOp\BooleanAnd($expression, new Expr\Variable('nonsense')) + $bypassAlwaysTrueIssue ? new Expr\BinaryOp\BooleanAnd($expression, new Expr\Variable('nonsense')) : null ); } diff --git a/tests/Rules/PHPUnit/data/assert-same.php b/tests/Rules/PHPUnit/data/assert-same.php index 41384e5..8ab297b 100644 --- a/tests/Rules/PHPUnit/data/assert-same.php +++ b/tests/Rules/PHPUnit/data/assert-same.php @@ -65,6 +65,13 @@ public function testOther() $foo->assertSame(); } + public function testAssertContains() + { + $this->assertContains('not in the list', new \ArrayObject([1])); + $this->assertContainsEquals('not in the list', new \ArrayObject([1])); + $this->assertNotContains('not in the list', new \ArrayObject([1])); + } + public function testStaticMethodReturnWithSameTypeIsNotReported() { $this->assertSame(self::createSomething('foo'), self::createSomething('foo')); From 61d20767448e70a8d41247884383dfe8709e568e Mon Sep 17 00:00:00 2001 From: Jan Nedbal Date: Mon, 9 Oct 2023 17:41:54 +0200 Subject: [PATCH 4/4] Fix cs --- src/Type/PHPUnit/Assert/AssertTypeSpecifyingExtensionHelper.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Type/PHPUnit/Assert/AssertTypeSpecifyingExtensionHelper.php b/src/Type/PHPUnit/Assert/AssertTypeSpecifyingExtensionHelper.php index d23bf03..61bb6dd 100644 --- a/src/Type/PHPUnit/Assert/AssertTypeSpecifyingExtensionHelper.php +++ b/src/Type/PHPUnit/Assert/AssertTypeSpecifyingExtensionHelper.php @@ -23,6 +23,7 @@ use ReflectionObject; use function array_key_exists; use function count; +use function in_array; use function strlen; use function strpos; use function substr;