Skip to content

Commit 0f31071

Browse files
Add tests for getVisitorsForNode() function
1 parent 003c0eb commit 0f31071

File tree

5 files changed

+223
-0
lines changed

5 files changed

+223
-0
lines changed

src/PhpParser/NodeTraverser/RectorNodeTraverser.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public function refreshPhpRectors(array $rectors): void
4949
{
5050
$this->rectors = $rectors;
5151
$this->visitors = [];
52+
$this->visitorsPerNodeClass = [];
5253

5354
$this->areNodeVisitorsPrepared = false;
5455
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Rector\Tests\PhpParser\NodeTraverser\ClassLike;
6+
7+
use PhpParser\Node;
8+
use PhpParser\Node\Stmt\ClassLike;
9+
use Rector\Rector\AbstractRector;
10+
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
11+
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
12+
13+
/**
14+
* @see \Rector\Tests\PhpParser\NodeTraverser\RectorNodeTraverserTest
15+
*/
16+
final class RuleUsingClassLikeRector extends AbstractRector
17+
{
18+
public function getRuleDefinition(): RuleDefinition
19+
{
20+
return new RuleDefinition('This rule applies to class like nodes', [new CodeSample('', '')]);
21+
}
22+
23+
/**
24+
* @return array<class-string<Node>>
25+
*/
26+
public function getNodeTypes(): array
27+
{
28+
return [ClassLike::class];
29+
}
30+
31+
public function refactor(Node $node): Node
32+
{
33+
return $node;
34+
}
35+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Rector\Tests\PhpParser\NodeTraverser\Class_;
6+
7+
use PhpParser\Node;
8+
use PhpParser\Node\Stmt\Class_;
9+
use Rector\Rector\AbstractRector;
10+
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
11+
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
12+
13+
/**
14+
* @see \Rector\Tests\PhpParser\NodeTraverser\RectorNodeTraverserTest
15+
*/
16+
final class RuleUsingClassRector extends AbstractRector
17+
{
18+
public function getRuleDefinition(): RuleDefinition
19+
{
20+
return new RuleDefinition('This rule applies to classes', [new CodeSample('', '')]);
21+
}
22+
23+
/**
24+
* @return array<class-string<Node>>
25+
*/
26+
public function getNodeTypes(): array
27+
{
28+
return [Class_::class];
29+
}
30+
31+
public function refactor(Node $node): Node
32+
{
33+
return $node;
34+
}
35+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Rector\Tests\PhpParser\NodeTraverser\Function_;
6+
7+
use PhpParser\Node;
8+
use PhpParser\Node\Stmt\Function_;
9+
use Rector\Rector\AbstractRector;
10+
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
11+
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
12+
13+
/**
14+
* @see \Rector\Tests\PhpParser\NodeTraverser\RectorNodeTraverserTest
15+
*/
16+
final class RuleUsingFunctionRector extends AbstractRector
17+
{
18+
public function getRuleDefinition(): RuleDefinition
19+
{
20+
return new RuleDefinition('This rule applies to functions', [new CodeSample('', '')]);
21+
}
22+
23+
/**
24+
* @return array<class-string<Node>>
25+
*/
26+
public function getNodeTypes(): array
27+
{
28+
return [Function_::class];
29+
}
30+
31+
public function refactor(Node $node): Node
32+
{
33+
return $node;
34+
}
35+
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Rector\Tests\PhpParser\NodeTraverser;
6+
7+
use PhpParser\Node\Stmt\Class_;
8+
use Rector\PhpParser\NodeTraverser\RectorNodeTraverser;
9+
use Rector\Testing\PHPUnit\AbstractLazyTestCase;
10+
use Rector\Tests\PhpParser\NodeTraverser\Class_\RuleUsingClassRector;
11+
use Rector\Tests\PhpParser\NodeTraverser\ClassLike\RuleUsingClassLikeRector;
12+
use Rector\Tests\PhpParser\NodeTraverser\Function_\RuleUsingFunctionRector;
13+
use Rector\Util\Reflection\PrivatesAccessor;
14+
15+
final class RectorNodeTraverserTest extends AbstractLazyTestCase
16+
{
17+
private RectorNodeTraverser $rectorNodeTraverser;
18+
19+
private PrivatesAccessor $privatesAccessor;
20+
21+
private RuleUsingFunctionRector $ruleUsingFunctionRector;
22+
23+
private RuleUsingClassRector $ruleUsingClassRector;
24+
25+
private RuleUsingClassLikeRector $ruleUsingClassLikeRector;
26+
27+
protected function setUp(): void
28+
{
29+
$this->rectorNodeTraverser = $this->make(RectorNodeTraverser::class);
30+
$this->rectorNodeTraverser->refreshPhpRectors([]);
31+
32+
$this->privatesAccessor = new PrivatesAccessor();
33+
34+
$this->ruleUsingFunctionRector = new RuleUsingFunctionRector();
35+
$this->ruleUsingClassRector = new RuleUsingClassRector();
36+
$this->ruleUsingClassLikeRector = new RuleUsingClassLikeRector();
37+
}
38+
39+
public function testGetVisitorsForNodeWhenNoVisitorsAvailable(): void
40+
{
41+
$class = new Class_('test');
42+
$visitors = $this->privatesAccessor->callPrivateMethod(
43+
$this->rectorNodeTraverser,
44+
'getVisitorsForNode',
45+
[$class]
46+
);
47+
48+
$this->assertSame([], $visitors);
49+
}
50+
51+
public function testGetVisitorsForNodeWhenNoVisitorsMatch(): void
52+
{
53+
$class = new Class_('test');
54+
$this->rectorNodeTraverser->addVisitor($this->ruleUsingFunctionRector);
55+
$visitors = $this->privatesAccessor->callPrivateMethod(
56+
$this->rectorNodeTraverser,
57+
'getVisitorsForNode',
58+
[$class]
59+
);
60+
61+
$this->assertSame([], $visitors);
62+
}
63+
64+
public function testGetVisitorsForNodeWhenSomeVisitorsMatch(): void
65+
{
66+
$class = new Class_('test');
67+
$this->rectorNodeTraverser->addVisitor($this->ruleUsingFunctionRector);
68+
$this->rectorNodeTraverser->addVisitor($this->ruleUsingClassRector);
69+
70+
$visitors = $this->privatesAccessor->callPrivateMethod(
71+
$this->rectorNodeTraverser,
72+
'getVisitorsForNode',
73+
[$class]
74+
);
75+
76+
$this->assertEquals([$this->ruleUsingClassRector], $visitors);
77+
}
78+
79+
public function testGetVisitorsForNodeWhenAllVisitorsMatch(): void
80+
{
81+
$class = new Class_('test');
82+
$this->rectorNodeTraverser->addVisitor($this->ruleUsingClassRector);
83+
$this->rectorNodeTraverser->addVisitor($this->ruleUsingClassLikeRector);
84+
85+
$visitors = $this->privatesAccessor->callPrivateMethod(
86+
$this->rectorNodeTraverser,
87+
'getVisitorsForNode',
88+
[$class]
89+
);
90+
91+
$this->assertEquals([$this->ruleUsingClassRector, $this->ruleUsingClassLikeRector], $visitors);
92+
}
93+
94+
public function testGetVisitorsForNodeUsesCachedValue(): void
95+
{
96+
$class = new Class_('test');
97+
$this->rectorNodeTraverser->addVisitor($this->ruleUsingClassRector);
98+
$this->rectorNodeTraverser->addVisitor($this->ruleUsingClassLikeRector);
99+
100+
$visitors = $this->privatesAccessor->callPrivateMethod(
101+
$this->rectorNodeTraverser,
102+
'getVisitorsForNode',
103+
[$class]
104+
);
105+
106+
$this->assertEquals([$this->ruleUsingClassRector, $this->ruleUsingClassLikeRector], $visitors);
107+
108+
$this->rectorNodeTraverser->removeVisitor($this->ruleUsingClassRector);
109+
$visitors = $this->privatesAccessor->callPrivateMethod(
110+
$this->rectorNodeTraverser,
111+
'getVisitorsForNode',
112+
[$class]
113+
);
114+
115+
$this->assertEquals([$this->ruleUsingClassRector, $this->ruleUsingClassLikeRector], $visitors);
116+
}
117+
}

0 commit comments

Comments
 (0)