diff --git a/src/Rector/Contrib/PHPUnit/SpecificMethodBoolNullRector.php b/src/Rector/Contrib/PHPUnit/SpecificMethodBoolNullRector.php new file mode 100644 index 00000000000..63f7b9177e6 --- /dev/null +++ b/src/Rector/Contrib/PHPUnit/SpecificMethodBoolNullRector.php @@ -0,0 +1,78 @@ +assertSame(null, $anything); + * + * After: + * - $this->assertNull($anything); + */ +final class SpecificMethodBoolNullRector extends AbstractRector +{ + /** + * @var MethodCallAnalyzer + */ + private $methodCallAnalyzer; + + /** + * @var string|null + */ + private $activeFuncCallName; + + public function __construct(MethodCallAnalyzer $methodCallAnalyzer) + { + $this->methodCallAnalyzer = $methodCallAnalyzer; + } + + public function isCandidate(Node $node): bool + { + $this->activeFuncCallName = null; + + if (! $this->methodCallAnalyzer->isTypesAndMethods( + $node, + ['PHPUnit\Framework\TestCase', 'PHPUnit_Framework_TestCase'], + ['assertSame'] + )) { + return false; + } + + /** @var MethodCall $methodCallNode */ + $methodCallNode = $node; + + $firstArgumentValue = $methodCallNode->args[0]->value; + if (! $firstArgumentValue instanceof ConstFetch) { + return false; + } + + $costName = $firstArgumentValue->name->toString(); + if ($costName === 'null') { + return true; + } + + return false; + } + + /** + * @param MethodCall $methodCallNode + */ + public function refactor(Node $methodCallNode): ?Node + { + $methodCallNode->name = new Identifier('assertNull'); + + $methodArguments = $methodCallNode->args; + array_shift($methodArguments); + + $methodCallNode->args = $methodCallNode; + + return $methodCallNode; + } +} diff --git a/src/config/level/phpunit/phpunit60.yml b/src/config/level/phpunit/phpunit60.yml index f3ffc3b3518..76b71d5f945 100644 --- a/src/config/level/phpunit/phpunit60.yml +++ b/src/config/level/phpunit/phpunit60.yml @@ -2,6 +2,7 @@ rectors: Rector\Rector\Contrib\PHPUnit\ExceptionAnnotationRector: ~ Rector\Rector\Contrib\PHPUnit\GetMockRector: ~ Rector\Rector\Contrib\PHPUnit\SpecificMethodRector: ~ + Rector\Rector\Contrib\PHPUnit\SpecificMethodBoolNullRector: ~ # ref. https://github.com/sebastianbergmann/phpunit/compare/5.7.9...6.0.0 Rector\Rector\Dynamic\PseudoNamespaceToNamespaceRector: diff --git a/tests/Rector/Contrib/PHPUnit/SpecificMethodBoolNullRector/Correct/correct.php.inc b/tests/Rector/Contrib/PHPUnit/SpecificMethodBoolNullRector/Correct/correct.php.inc new file mode 100644 index 00000000000..ce1c81161ef --- /dev/null +++ b/tests/Rector/Contrib/PHPUnit/SpecificMethodBoolNullRector/Correct/correct.php.inc @@ -0,0 +1,9 @@ +assertNull('second argument'); + } +} diff --git a/tests/Rector/Contrib/PHPUnit/SpecificMethodBoolNullRector/Test.php b/tests/Rector/Contrib/PHPUnit/SpecificMethodBoolNullRector/Test.php new file mode 100644 index 00000000000..b4651a63b46 --- /dev/null +++ b/tests/Rector/Contrib/PHPUnit/SpecificMethodBoolNullRector/Test.php @@ -0,0 +1,25 @@ +doTestFileMatchesExpectedContent( + __DIR__ . '/Wrong/wrong.php.inc', + __DIR__ . '/Correct/correct.php.inc' + ); + } + + /** + * @return string[] + */ + protected function getRectorClasses(): array + { + return [SpecificMethodBoolNullRector::class]; + } +} diff --git a/tests/Rector/Contrib/PHPUnit/SpecificMethodBoolNullRector/Wrong/wrong.php.inc b/tests/Rector/Contrib/PHPUnit/SpecificMethodBoolNullRector/Wrong/wrong.php.inc new file mode 100644 index 00000000000..8da58ea171c --- /dev/null +++ b/tests/Rector/Contrib/PHPUnit/SpecificMethodBoolNullRector/Wrong/wrong.php.inc @@ -0,0 +1,9 @@ +assertSame(null, 'second argument'); + } +}