diff --git a/config/sets/typed-collections.php b/config/sets/typed-collections.php index e17965af..314df532 100644 --- a/config/sets/typed-collections.php +++ b/config/sets/typed-collections.php @@ -28,6 +28,7 @@ use Rector\Doctrine\TypedCollections\Rector\If_\RemoveIfInstanceofCollectionRector; use Rector\Doctrine\TypedCollections\Rector\If_\RemoveIsArrayOnCollectionRector; use Rector\Doctrine\TypedCollections\Rector\MethodCall\AssertNullOnCollectionToAssertEmptyRector; +use Rector\Doctrine\TypedCollections\Rector\MethodCall\AssertSameCountOnCollectionToAssertCountRector; use Rector\Doctrine\TypedCollections\Rector\MethodCall\SetArrayToNewCollectionRector; use Rector\Doctrine\TypedCollections\Rector\New_\RemoveNewArrayCollectionWrapRector; use Rector\Doctrine\TypedCollections\Rector\NullsafeMethodCall\RemoveNullsafeOnCollectionRector; @@ -82,7 +83,10 @@ // cleanup RemoveNullsafeOnCollectionRector::class, - AssertNullOnCollectionToAssertEmptyRector::class, + + // test assertions RemoveAssertNotNullOnCollectionRector::class, + AssertNullOnCollectionToAssertEmptyRector::class, + AssertSameCountOnCollectionToAssertCountRector::class, ]); }; diff --git a/rules-tests/TypedCollections/Rector/MethodCall/AssertSameCountOnCollectionToAssertCountRector/AssertSameCountOnCollectionToAssertCountRectorTest.php b/rules-tests/TypedCollections/Rector/MethodCall/AssertSameCountOnCollectionToAssertCountRector/AssertSameCountOnCollectionToAssertCountRectorTest.php new file mode 100644 index 00000000..ba8419bd --- /dev/null +++ b/rules-tests/TypedCollections/Rector/MethodCall/AssertSameCountOnCollectionToAssertCountRector/AssertSameCountOnCollectionToAssertCountRectorTest.php @@ -0,0 +1,28 @@ +doTestFile($filePath); + } + + public static function provideData(): Iterator + { + return self::yieldFilesFromDirectory(__DIR__ . '/Fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__ . '/config/configured_rule.php'; + } +} diff --git a/rules-tests/TypedCollections/Rector/MethodCall/AssertSameCountOnCollectionToAssertCountRector/Fixture/assert_count.php.inc b/rules-tests/TypedCollections/Rector/MethodCall/AssertSameCountOnCollectionToAssertCountRector/Fixture/assert_count.php.inc new file mode 100644 index 00000000..4f4e28b8 --- /dev/null +++ b/rules-tests/TypedCollections/Rector/MethodCall/AssertSameCountOnCollectionToAssertCountRector/Fixture/assert_count.php.inc @@ -0,0 +1,37 @@ +assertSame(10, $this->items->count()); + } +} + +?> +----- +assertCount(10, $this->items); + } +} + +?> diff --git a/rules-tests/TypedCollections/Rector/MethodCall/AssertSameCountOnCollectionToAssertCountRector/Fixture/skip_assert_count_on_somethign_else.php.inc b/rules-tests/TypedCollections/Rector/MethodCall/AssertSameCountOnCollectionToAssertCountRector/Fixture/skip_assert_count_on_somethign_else.php.inc new file mode 100644 index 00000000..35bf1fc6 --- /dev/null +++ b/rules-tests/TypedCollections/Rector/MethodCall/AssertSameCountOnCollectionToAssertCountRector/Fixture/skip_assert_count_on_somethign_else.php.inc @@ -0,0 +1,15 @@ +assertSame(10, $this->items->count()); + } +} diff --git a/rules-tests/TypedCollections/Rector/MethodCall/AssertSameCountOnCollectionToAssertCountRector/config/configured_rule.php b/rules-tests/TypedCollections/Rector/MethodCall/AssertSameCountOnCollectionToAssertCountRector/config/configured_rule.php new file mode 100644 index 00000000..d71f3597 --- /dev/null +++ b/rules-tests/TypedCollections/Rector/MethodCall/AssertSameCountOnCollectionToAssertCountRector/config/configured_rule.php @@ -0,0 +1,10 @@ +rule(AssertSameCountOnCollectionToAssertCountRector::class); +}; diff --git a/rules/TypedCollections/Rector/Expression/RemoveAssertNotNullOnCollectionRector.php b/rules/TypedCollections/Rector/Expression/RemoveAssertNotNullOnCollectionRector.php index 9ced7f75..62c8f87f 100644 --- a/rules/TypedCollections/Rector/Expression/RemoveAssertNotNullOnCollectionRector.php +++ b/rules/TypedCollections/Rector/Expression/RemoveAssertNotNullOnCollectionRector.php @@ -4,11 +4,11 @@ namespace Rector\Doctrine\TypedCollections\Rector\Expression; -use PHPUnit\Framework\Assert; use PhpParser\Node; use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Stmt\Expression; use PhpParser\NodeVisitor; +use PHPUnit\Framework\Assert; use Rector\Doctrine\TypedCollections\TypeAnalyzer\CollectionTypeDetector; use Rector\PHPUnit\Enum\PHPUnitClassName; use Rector\Rector\AbstractRector; diff --git a/rules/TypedCollections/Rector/MethodCall/AssertSameCountOnCollectionToAssertCountRector.php b/rules/TypedCollections/Rector/MethodCall/AssertSameCountOnCollectionToAssertCountRector.php new file mode 100644 index 00000000..489d5169 --- /dev/null +++ b/rules/TypedCollections/Rector/MethodCall/AssertSameCountOnCollectionToAssertCountRector.php @@ -0,0 +1,103 @@ +assertSame(5, $collection->count()) to $this->assertCount(5, $collection) in tests', + [ + new CodeSample( + <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class SomeClass extends \PHPUnit\Framework\TestCase +{ + private Collection $items; + + public function test(): void + { + $this->assertSame(5, $this->items->count()); + } +} +CODE_SAMPLE + , + <<<'CODE_SAMPLE' +use Doctrine\Common\Collections\Collection; + +final class SomeClass extends \PHPUnit\Framework\TestCase +{ + private Collection $items; + + public function test(): void + { + $this->assertCount(5, $this->items); + } +} +CODE_SAMPLE + )] + ); + } + + public function getNodeTypes(): array + { + return [MethodCall::class]; + + } + + /** + * @param MethodCall $node + */ + public function refactor(Node $node): MethodCall|null + { + if ($node->isFirstClassCallable()) { + return null; + } + + if (! $this->isName($node->name, 'assertSame')) { + return null; + } + + if (! $this->testsNodeAnalyzer->isInTestClass($node)) { + return null; + } + + $comparedArg = $node->getArgs()[1] + ->value; + + if ($comparedArg instanceof MethodCall && $this->isName( + $comparedArg->name, + 'count' + ) && $this->collectionTypeDetector->isCollectionType($comparedArg->var)) { + $node->name = new Identifier('assertCount'); + $node->args[1] = new Arg($comparedArg->var); + + return $node; + } + + return null; + } +}