Skip to content

Commit 48b016a

Browse files
committed
test: add tests to skip DocBlock processing for anonymous classes
1 parent 75ce032 commit 48b016a

File tree

1 file changed

+105
-0
lines changed

1 file changed

+105
-0
lines changed

tests/src/Rules/DocBlockHeaderFixerTest.php

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -845,4 +845,109 @@ public function testInsertNewDocBlockWithClassNameAndSeparateNone(): void
845845
$expected = "<?php /**\n * TestClass.\n *\n * @author John Doe\n */class TestClass {}";
846846
self::assertSame($expected, $tokens->generateCode());
847847
}
848+
849+
public function testSkipsAnonymousClasses(): void
850+
{
851+
$code = '<?php $obj = new class {};';
852+
$tokens = Tokens::fromCode($code);
853+
$file = new SplFileInfo(__FILE__);
854+
855+
$method = new ReflectionMethod($this->fixer, 'applyFix');
856+
857+
$this->fixer->configure([
858+
'annotations' => ['author' => 'John Doe'],
859+
'separate' => 'none',
860+
'ensure_spacing' => false,
861+
]);
862+
$method->invoke($this->fixer, $file, $tokens);
863+
864+
// Code should remain unchanged - no DocBlock added to anonymous class
865+
self::assertSame($code, $tokens->generateCode());
866+
}
867+
868+
public function testSkipsAnonymousClassesButProcessesRegularClasses(): void
869+
{
870+
$code = '<?php class RegularClass {} $obj = new class {};';
871+
$tokens = Tokens::fromCode($code);
872+
$file = new SplFileInfo(__FILE__);
873+
874+
$method = new ReflectionMethod($this->fixer, 'applyFix');
875+
876+
$this->fixer->configure([
877+
'annotations' => ['author' => 'John Doe'],
878+
'separate' => 'none',
879+
'ensure_spacing' => false,
880+
]);
881+
$method->invoke($this->fixer, $file, $tokens);
882+
883+
$result = $tokens->generateCode();
884+
885+
// Regular class should have DocBlock
886+
self::assertStringContainsString("/**\n * @author John Doe\n */class RegularClass", $result);
887+
// Anonymous class should NOT have DocBlock (should remain as "new class")
888+
self::assertStringContainsString('new class {}', $result);
889+
}
890+
891+
public function testIsAnonymousClassDetectsAnonymousClass(): void
892+
{
893+
$code = '<?php $obj = new class {};';
894+
$tokens = Tokens::fromCode($code);
895+
896+
$method = new ReflectionMethod($this->fixer, 'isAnonymousClass');
897+
898+
// Find the class token index
899+
$classIndex = null;
900+
for ($i = 0; $i < $tokens->count(); ++$i) {
901+
if ($tokens[$i]->isGivenKind(T_CLASS)) {
902+
$classIndex = $i;
903+
break;
904+
}
905+
}
906+
907+
$result = $method->invoke($this->fixer, $tokens, $classIndex);
908+
909+
self::assertTrue($result);
910+
}
911+
912+
public function testIsAnonymousClassReturnsFalseForRegularClass(): void
913+
{
914+
$code = '<?php class RegularClass {}';
915+
$tokens = Tokens::fromCode($code);
916+
917+
$method = new ReflectionMethod($this->fixer, 'isAnonymousClass');
918+
919+
// Find the class token index
920+
$classIndex = null;
921+
for ($i = 0; $i < $tokens->count(); ++$i) {
922+
if ($tokens[$i]->isGivenKind(T_CLASS)) {
923+
$classIndex = $i;
924+
break;
925+
}
926+
}
927+
928+
$result = $method->invoke($this->fixer, $tokens, $classIndex);
929+
930+
self::assertFalse($result);
931+
}
932+
933+
public function testIsAnonymousClassWithAttribute(): void
934+
{
935+
$code = '<?php $obj = new #[SomeAttribute] class {};';
936+
$tokens = Tokens::fromCode($code);
937+
938+
$method = new ReflectionMethod($this->fixer, 'isAnonymousClass');
939+
940+
// Find the class token index
941+
$classIndex = null;
942+
for ($i = 0; $i < $tokens->count(); ++$i) {
943+
if ($tokens[$i]->isGivenKind(T_CLASS)) {
944+
$classIndex = $i;
945+
break;
946+
}
947+
}
948+
949+
$result = $method->invoke($this->fixer, $tokens, $classIndex);
950+
951+
self::assertTrue($result);
952+
}
848953
}

0 commit comments

Comments
 (0)