From f510ea5b9026de23c613883f32a119cafe50fc4f Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Tue, 6 Oct 2026 09:45:23 +0200 Subject: [PATCH 1/3] Skip named and unpack arguments when autofixing --- src/Rules/PHPUnit/AssertRuleHelper.php | 12 ++++++++++++ .../data/assert-equals-is-discouraged-fixable.php | 2 ++ .../assert-equals-is-discouraged-fixable.php.fixed | 2 ++ .../data/assert-same-boolean-expected-fixable.php | 2 ++ .../assert-same-boolean-expected-fixable.php.fixed | 2 ++ .../data/assert-same-null-expected-fixable.php | 2 ++ .../data/assert-same-null-expected-fixable.php.fixed | 2 ++ 7 files changed, 24 insertions(+) diff --git a/src/Rules/PHPUnit/AssertRuleHelper.php b/src/Rules/PHPUnit/AssertRuleHelper.php index ecaec91d..5971fc0b 100644 --- a/src/Rules/PHPUnit/AssertRuleHelper.php +++ b/src/Rules/PHPUnit/AssertRuleHelper.php @@ -3,6 +3,7 @@ namespace PHPStan\Rules\PHPUnit; use PhpParser\Node; +use PhpParser\Node\Expr\CallLike; use PHPStan\Analyser\Scope; use PHPStan\Type\ObjectType; use function in_array; @@ -46,4 +47,15 @@ public static function isMethodOrStaticCallOnAssert(Node $node, Scope $scope): b return $testCaseType->isSuperTypeOf($calledOnType)->yes(); } + public static function hasNamedOrUnpackedArguments(CallLike $call): bool + { + foreach ($call->getArgs() as $arg) { + if ($arg->name !== null || $arg->unpack) { + return true; + } + } + + return false; + } + } diff --git a/tests/Rules/PHPUnit/data/assert-equals-is-discouraged-fixable.php b/tests/Rules/PHPUnit/data/assert-equals-is-discouraged-fixable.php index 5c0c993b..6940148a 100644 --- a/tests/Rules/PHPUnit/data/assert-equals-is-discouraged-fixable.php +++ b/tests/Rules/PHPUnit/data/assert-equals-is-discouraged-fixable.php @@ -13,6 +13,8 @@ public function doFoo(string $s, string $t): void { $this->assertEquals('', $s); $this->assertNotEquals('', $t); + $this->assertEquals(expected: '', actual: $s); + $this->assertEquals('', $s, ...func_get_args()); } public function doFoo2(string $s, string $t): void diff --git a/tests/Rules/PHPUnit/data/assert-equals-is-discouraged-fixable.php.fixed b/tests/Rules/PHPUnit/data/assert-equals-is-discouraged-fixable.php.fixed index 9217e3e1..55150525 100644 --- a/tests/Rules/PHPUnit/data/assert-equals-is-discouraged-fixable.php.fixed +++ b/tests/Rules/PHPUnit/data/assert-equals-is-discouraged-fixable.php.fixed @@ -13,6 +13,8 @@ class Foo extends TestCase { $this->assertSame('', $s); $this->assertNotSame('', $t); + $this->assertEquals(expected: '', actual: $s); + $this->assertEquals('', $s, ...func_get_args()); } public function doFoo2(string $s, string $t): void diff --git a/tests/Rules/PHPUnit/data/assert-same-boolean-expected-fixable.php b/tests/Rules/PHPUnit/data/assert-same-boolean-expected-fixable.php index 5d5a3ba4..e7334514 100644 --- a/tests/Rules/PHPUnit/data/assert-same-boolean-expected-fixable.php +++ b/tests/Rules/PHPUnit/data/assert-same-boolean-expected-fixable.php @@ -15,6 +15,8 @@ public function returnsBool(): bool public function doFoo(): void { $this->assertSame(true, $this->returnBool()); + $this->assertSame(expected: true, actual: $this->returnBool()); + $this->assertSame(true, ...func_get_args()); self::assertSame(false, $this->returnBool()); } diff --git a/tests/Rules/PHPUnit/data/assert-same-boolean-expected-fixable.php.fixed b/tests/Rules/PHPUnit/data/assert-same-boolean-expected-fixable.php.fixed index d0bb802a..b1eb18e3 100644 --- a/tests/Rules/PHPUnit/data/assert-same-boolean-expected-fixable.php.fixed +++ b/tests/Rules/PHPUnit/data/assert-same-boolean-expected-fixable.php.fixed @@ -15,6 +15,8 @@ class AssertSameBooleanExpectedTestCase extends \PHPUnit\Framework\TestCase public function doFoo(): void { $this->assertTrue($this->returnBool()); + $this->assertSame(expected: true, actual: $this->returnBool()); + $this->assertSame(true, ...func_get_args()); self::assertFalse($this->returnBool()); } diff --git a/tests/Rules/PHPUnit/data/assert-same-null-expected-fixable.php b/tests/Rules/PHPUnit/data/assert-same-null-expected-fixable.php index f95fadd6..3c7dc1cc 100644 --- a/tests/Rules/PHPUnit/data/assert-same-null-expected-fixable.php +++ b/tests/Rules/PHPUnit/data/assert-same-null-expected-fixable.php @@ -15,6 +15,8 @@ public function returnNull() public function doFoo(): void { $this->assertSame(null, 'a'); + $this->assertSame(expected: null, actual: 'named'); + $this->assertSame(null, ...func_get_args()); \PHPUnit\Framework\Assert::assertSame($this->returnNull(), 'foo'); } diff --git a/tests/Rules/PHPUnit/data/assert-same-null-expected-fixable.php.fixed b/tests/Rules/PHPUnit/data/assert-same-null-expected-fixable.php.fixed index a3c91042..3e44cbb5 100644 --- a/tests/Rules/PHPUnit/data/assert-same-null-expected-fixable.php.fixed +++ b/tests/Rules/PHPUnit/data/assert-same-null-expected-fixable.php.fixed @@ -15,6 +15,8 @@ class AssertSameNullExpectedTestCase extends \PHPUnit\Framework\TestCase public function doFoo(): void { $this->assertNull('a'); + $this->assertSame(expected: null, actual: 'named'); + $this->assertSame(null, ...func_get_args()); \PHPUnit\Framework\Assert::assertSame($this->returnNull(), 'foo'); } From 6938446be18b25a6f6ca8455cae5edb8111d3f6d Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Tue, 6 Oct 2026 09:46:23 +0200 Subject: [PATCH 2/3] fix --- src/Rules/PHPUnit/AssertEqualsIsDiscouragedRule.php | 4 ++++ src/Rules/PHPUnit/AssertSameBooleanExpectedRule.php | 4 ++++ src/Rules/PHPUnit/AssertSameNullExpectedRule.php | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/src/Rules/PHPUnit/AssertEqualsIsDiscouragedRule.php b/src/Rules/PHPUnit/AssertEqualsIsDiscouragedRule.php index ed6470e2..56be120a 100644 --- a/src/Rules/PHPUnit/AssertEqualsIsDiscouragedRule.php +++ b/src/Rules/PHPUnit/AssertEqualsIsDiscouragedRule.php @@ -73,6 +73,10 @@ public function processNode(Node $node, Scope $scope): array ), )->identifier('phpunit.assertEquals') ->fixNode($node, static function (CallLike $node) use ($correctName) { + if (AssertRuleHelper::hasNamedOrUnpackedArguments($node)) { + return $node; + } + $node->name = new Node\Identifier($correctName); return $node; diff --git a/src/Rules/PHPUnit/AssertSameBooleanExpectedRule.php b/src/Rules/PHPUnit/AssertSameBooleanExpectedRule.php index 89078793..49543371 100644 --- a/src/Rules/PHPUnit/AssertSameBooleanExpectedRule.php +++ b/src/Rules/PHPUnit/AssertSameBooleanExpectedRule.php @@ -51,6 +51,10 @@ public function processNode(Node $node, Scope $scope): array RuleErrorBuilder::message('You should use assertTrue() instead of assertSame() when expecting "true"') ->identifier('phpunit.assertTrue') ->fixNode($node, static function (CallLike $node) { + if (AssertRuleHelper::hasNamedOrUnpackedArguments($node)) { + return $node; + } + $node->name = new Node\Identifier('assertTrue'); $node->args = self::rewriteArgs($node->args); diff --git a/src/Rules/PHPUnit/AssertSameNullExpectedRule.php b/src/Rules/PHPUnit/AssertSameNullExpectedRule.php index 2d5fda41..ee9e56bb 100644 --- a/src/Rules/PHPUnit/AssertSameNullExpectedRule.php +++ b/src/Rules/PHPUnit/AssertSameNullExpectedRule.php @@ -51,6 +51,10 @@ public function processNode(Node $node, Scope $scope): array RuleErrorBuilder::message('You should use assertNull() instead of assertSame(null, $actual).') ->identifier('phpunit.assertNull') ->fixNode($node, static function (CallLike $node) { + if (AssertRuleHelper::hasNamedOrUnpackedArguments($node)) { + return $node; + } + $node->name = new Node\Identifier('assertNull'); $node->args = self::rewriteArgs($node->args); From b78e8276fb7f7799de305035dabed942a4c08fb4 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Tue, 6 Oct 2026 10:05:15 +0200 Subject: [PATCH 3/3] fix lint --- .../Rules/PHPUnit/data/assert-equals-is-discouraged-fixable.php | 2 +- .../PHPUnit/data/assert-equals-is-discouraged-fixable.php.fixed | 2 +- .../Rules/PHPUnit/data/assert-same-boolean-expected-fixable.php | 2 +- .../PHPUnit/data/assert-same-boolean-expected-fixable.php.fixed | 2 +- tests/Rules/PHPUnit/data/assert-same-null-expected-fixable.php | 2 +- .../PHPUnit/data/assert-same-null-expected-fixable.php.fixed | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/Rules/PHPUnit/data/assert-equals-is-discouraged-fixable.php b/tests/Rules/PHPUnit/data/assert-equals-is-discouraged-fixable.php index 6940148a..8f3bf25c 100644 --- a/tests/Rules/PHPUnit/data/assert-equals-is-discouraged-fixable.php +++ b/tests/Rules/PHPUnit/data/assert-equals-is-discouraged-fixable.php @@ -1,4 +1,4 @@ -= 8.0 declare(strict_types=1); diff --git a/tests/Rules/PHPUnit/data/assert-equals-is-discouraged-fixable.php.fixed b/tests/Rules/PHPUnit/data/assert-equals-is-discouraged-fixable.php.fixed index 55150525..3100e62a 100644 --- a/tests/Rules/PHPUnit/data/assert-equals-is-discouraged-fixable.php.fixed +++ b/tests/Rules/PHPUnit/data/assert-equals-is-discouraged-fixable.php.fixed @@ -1,4 +1,4 @@ -= 8.0 declare(strict_types=1); diff --git a/tests/Rules/PHPUnit/data/assert-same-boolean-expected-fixable.php b/tests/Rules/PHPUnit/data/assert-same-boolean-expected-fixable.php index e7334514..65ad1466 100644 --- a/tests/Rules/PHPUnit/data/assert-same-boolean-expected-fixable.php +++ b/tests/Rules/PHPUnit/data/assert-same-boolean-expected-fixable.php @@ -1,4 +1,4 @@ -= 8.0 namespace AssertSameBooleanTestCaseFix; diff --git a/tests/Rules/PHPUnit/data/assert-same-boolean-expected-fixable.php.fixed b/tests/Rules/PHPUnit/data/assert-same-boolean-expected-fixable.php.fixed index b1eb18e3..27ae08b1 100644 --- a/tests/Rules/PHPUnit/data/assert-same-boolean-expected-fixable.php.fixed +++ b/tests/Rules/PHPUnit/data/assert-same-boolean-expected-fixable.php.fixed @@ -1,4 +1,4 @@ -= 8.0 namespace AssertSameBooleanTestCaseFix; diff --git a/tests/Rules/PHPUnit/data/assert-same-null-expected-fixable.php b/tests/Rules/PHPUnit/data/assert-same-null-expected-fixable.php index 3c7dc1cc..59bbea4f 100644 --- a/tests/Rules/PHPUnit/data/assert-same-null-expected-fixable.php +++ b/tests/Rules/PHPUnit/data/assert-same-null-expected-fixable.php @@ -1,4 +1,4 @@ -= 8.0 namespace AssertSameNullTestCaseFix; diff --git a/tests/Rules/PHPUnit/data/assert-same-null-expected-fixable.php.fixed b/tests/Rules/PHPUnit/data/assert-same-null-expected-fixable.php.fixed index 3e44cbb5..db4739a3 100644 --- a/tests/Rules/PHPUnit/data/assert-same-null-expected-fixable.php.fixed +++ b/tests/Rules/PHPUnit/data/assert-same-null-expected-fixable.php.fixed @@ -1,4 +1,4 @@ -= 8.0 namespace AssertSameNullTestCaseFix;