Skip to content

Commit f71ea29

Browse files
committed
Add tests for NodesFactory
1 parent 984b0bf commit f71ea29

File tree

2 files changed

+82
-8
lines changed

2 files changed

+82
-8
lines changed

src/phpDocumentor/Reflection/Php/NodesFactory.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@
1616
use phpDocumentor\Reflection\NodeVisitor\ElementNameResolver;
1717
use PhpParser\Node;
1818
use PhpParser\NodeTraverser;
19+
use PhpParser\NodeTraverserInterface;
1920
use PhpParser\NodeVisitor\NameResolver;
2021
use PhpParser\Parser;
2122
use PhpParser\ParserFactory;
2223

2324
/**
2425
* Factory to create a array of nodes from a provided file.
26+
*
2527
* This factory will use PhpParser and NodeTraverser to do the real processing.
2628
*/
2729
class NodesFactory
@@ -41,14 +43,12 @@ class NodesFactory
4143
private $traverser;
4244

4345
/**
44-
* Initializes the object.
45-
*
46-
* @param Parser $parser used to parse the code
46+
* @param Parser $parser used to parse the code
4747
* @param NodeTraverser $traverser used to do some post processing on the nodes
4848
*/
49-
final public function __construct(Parser $parser, NodeTraverser $traverser)
49+
final public function __construct(Parser $parser, NodeTraverserInterface $traverser)
5050
{
51-
$this->parser = $parser;
51+
$this->parser = $parser;
5252
$this->traverser = $traverser;
5353
}
5454

@@ -62,10 +62,11 @@ final public function __construct(Parser $parser, NodeTraverser $traverser)
6262
*/
6363
public static function createInstance(int $kind = ParserFactory::PREFER_PHP7) : self
6464
{
65-
$parser = (new ParserFactory())->create($kind);
65+
$parser = (new ParserFactory())->create($kind);
6666
$traverser = new NodeTraverser();
6767
$traverser->addVisitor(new NameResolver());
6868
$traverser->addVisitor(new ElementNameResolver());
69+
6970
return new static($parser, $traverser);
7071
}
7172

@@ -78,7 +79,6 @@ public static function createInstance(int $kind = ParserFactory::PREFER_PHP7) :
7879
*/
7980
public function create(string $code) : array
8081
{
81-
$stmt = $this->parser->parse($code);
82-
return $this->traverser->traverse($stmt);
82+
return $this->traverser->traverse($this->parser->parse($code));
8383
}
8484
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/**
6+
* This file is part of phpDocumentor.
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*
11+
* @link http://phpdoc.org
12+
*/
13+
14+
namespace phpDocumentor\Reflection\Php;
15+
16+
use phpDocumentor\Reflection\NodeVisitor\ElementNameResolver;
17+
use PhpParser\NodeTraverser;
18+
use PhpParser\NodeTraverserInterface;
19+
use PhpParser\NodeVisitor\NameResolver;
20+
use PhpParser\Parser;
21+
use PhpParser\ParserFactory;
22+
use PHPUnit\Framework\TestCase;
23+
24+
/**
25+
* @coversDefaultClass \phpDocumentor\Reflection\Php\NodesFactory
26+
* @covers ::__construct
27+
* @covers ::<private>
28+
*/
29+
final class NodesFactoryTest extends TestCase
30+
{
31+
/**
32+
* Tests that an instance of the NodesFactory can be made using its static factory method.
33+
*
34+
* Unfortunately, we cannot actually inspect whether all recommended items were instantiated, so I create an example
35+
* NodesFactory containing what I expected and this test will verify that no regression took place.
36+
*
37+
* @covers ::createInstance
38+
*/
39+
public function testThatAFactoryWithRecommendedComponentsCanBeInstantiated() : void
40+
{
41+
$factory = NodesFactory::createInstance();
42+
43+
$this->assertInstanceOf(NodesFactory::class, $factory);
44+
$this->assertEquals($this->givenTheExpectedDefaultNodesFactory(), $factory);
45+
}
46+
47+
/**
48+
* @covers ::create
49+
*/
50+
public function testThatCodeGetsConvertedIntoNodes()
51+
{
52+
$parser = $this->prophesize(Parser::class);
53+
$parser->parse('this is my code')->willReturn(['parsed code']);
54+
55+
$nodeTraverser = $this->prophesize(NodeTraverserInterface::class);
56+
$nodeTraverser->traverse(['parsed code'])->willReturn(['traversed code']);
57+
58+
$factory = new NodesFactory($parser->reveal(), $nodeTraverser->reveal());
59+
60+
$result = $factory->create('this is my code');
61+
62+
$this->assertSame(['traversed code'], $result);
63+
}
64+
65+
private function givenTheExpectedDefaultNodesFactory() : NodesFactory
66+
{
67+
$parser = (new ParserFactory())->create(ParserFactory::PREFER_PHP7);
68+
$traverser = new NodeTraverser();
69+
$traverser->addVisitor(new NameResolver());
70+
$traverser->addVisitor(new ElementNameResolver());
71+
72+
return new NodesFactory($parser, $traverser);
73+
}
74+
}

0 commit comments

Comments
 (0)