packages/deriver/tests/Unit/Deriver/Parser/Node/FileTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Deriver\Parser\Node;
6
7use Deriver\Deriver\Parser\Node\File;
8use Deriver\Deriver\Sources\Source;
9use PhpParser\Node;
10use PhpParser\Node\Scalar\Int_;
11use PhpParser\Node\Stmt\Return_;
12use PhpParser\NodeFinder;
13use PHPUnit\Framework\Attributes\CoversClass;
14use PHPUnit\Framework\Attributes\Small;
15use PHPUnit\Framework\Attributes\UsesClass;
16use PHPUnit\Framework\TestCase;
17
18#[CoversClass(File::class)]
19#[UsesClass(Source::class)]
20#[Small]
21final class FileTest extends TestCase
22{
23 public function testGetTypeDistinguishesTheRootFromStatementsAndExpressions(): void
24 {
25 $value = new Int_(42);
26 $statement = new Return_($value);
27 $file = new File(new Source('a.php', '<?php return 42;'), [$statement]);
28 self::assertSame('File', $file->getType());
29 self::assertSame(['File', 'Stmt_Return', 'Scalar_Int'], array_map(static fn (Node $node): string => $node->getType(), (new NodeFinder())->findInstanceOf([$file], Node::class)));
30 }
31
32 public function testGetSubNodeNamesAllowsTraversalFromTheRootToNestedExpressions(): void
33 {
34 $value = new Int_(42);
35 $file = new File(new Source('a.php', '<?php return 42;'), [new Return_($value)]);
36 self::assertSame(['stmts'], $file->getSubNodeNames());
37 self::assertSame([$value], (new NodeFinder())->findInstanceOf([$file], Int_::class));
38 }
39
40 public function testGetStartLineAndOtherPositionsDescribeTheCompleteSource(): void
41 {
42 $source = new Source('empty.php', "<?php\r\n\r\n");
43 $file = new File($source, []);
44 self::assertSame($source, $file->source);
45 self::assertSame(1, $file->getStartLine());
46 self::assertSame(3, $file->getEndLine());
47 self::assertSame(0, $file->getStartFilePos());
48 self::assertSame(strlen($source->contents) - 1, $file->getEndFilePos());
49 }
50}
51