1<?php declare(strict_types=1);
2
3namespace PhpParser;
4
5class NodeDumperTest extends \PHPUnit\Framework\TestCase {
6    private function canonicalize($string) {
7        return str_replace("\r\n", "\n", $string);
8    }
9
10    /**
11     * @dataProvider provideTestDump
12     */
13    public function testDump($node, $dump) {
14        $dumper = new NodeDumper();
15
16        $this->assertSame($this->canonicalize($dump), $this->canonicalize($dumper->dump($node)));
17    }
18
19    public function provideTestDump() {
20        return [
21            [
22                [],
23'array(
24)'
25            ],
26            [
27                ['Foo', 'Bar', 'Key' => 'FooBar'],
28'array(
29    0: Foo
30    1: Bar
31    Key: FooBar
32)'
33            ],
34            [
35                new Node\Name(['Hallo', 'World']),
36'Name(
37    name: Hallo\World
38)'
39            ],
40            [
41                new Node\Expr\Array_([
42                    new Node\ArrayItem(new Node\Scalar\String_('Foo'))
43                ]),
44'Expr_Array(
45    items: array(
46        0: ArrayItem(
47            key: null
48            value: Scalar_String(
49                value: Foo
50            )
51            byRef: false
52            unpack: false
53        )
54    )
55)'
56            ],
57        ];
58    }
59
60    public function testDumpWithPositions() {
61        $parser = (new ParserFactory())->createForHostVersion();
62        $dumper = new NodeDumper(['dumpPositions' => true]);
63
64        $code = "<?php\n\$a = 1;\necho \$a;";
65        $expected = <<<'OUT'
66array(
67    0: Stmt_Expression[2:1 - 2:7](
68        expr: Expr_Assign[2:1 - 2:6](
69            var: Expr_Variable[2:1 - 2:2](
70                name: a
71            )
72            expr: Scalar_Int[2:6 - 2:6](
73                value: 1
74            )
75        )
76    )
77    1: Stmt_Echo[3:1 - 3:8](
78        exprs: array(
79            0: Expr_Variable[3:6 - 3:7](
80                name: a
81            )
82        )
83    )
84)
85OUT;
86
87        $stmts = $parser->parse($code);
88        $dump = $dumper->dump($stmts, $code);
89
90        $this->assertSame($this->canonicalize($expected), $this->canonicalize($dump));
91    }
92
93    public function testError() {
94        $this->expectException(\InvalidArgumentException::class);
95        $this->expectExceptionMessage('Can only dump nodes and arrays.');
96        $dumper = new NodeDumper();
97        $dumper->dump(new \stdClass());
98    }
99}
100