packages/sql-parser/tests/Unit/Parser/NodeTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Parser;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\Small;
9use PHPUnit\Framework\Attributes\UsesClass;
10use PHPUnit\Framework\TestCase;
11use SqlParser\Lexer\Token;
12use SqlParser\Parser\Node;
13
14#[CoversClass(Node::class)]
15#[UsesClass(Token::class)]
16#[Small]
17final class NodeTest extends TestCase
18{
19 public function testIsEmpty(): void
20 {
21 self::assertTrue((new Node('opt', 0, []))->isEmpty());
22 self::assertFalse((new Node('expr', 0, [new Token(1, 'NUM', '1', 0)]))->isEmpty());
23 }
24
25 public function testTokens(): void
26 {
27 $select = new Token(3, 'SELECT', 'SELECT', 0);
28 $one = new Token(7, 'NUM', '1', 7);
29 $tree = new Node('statement', 0, [$select, new Node('expr', 2, [$one]), new Node('opt', 0, [])]);
30
31 self::assertSame([$select, $one], $tree->tokens());
32 }
33
34 public function testFind(): void
35 {
36 $inner = new Node('expr', 1, [new Token(7, 'NUM', '1', 7)]);
37 $outer = new Node('expr', 0, [$inner]);
38 $tree = new Node('statement', 0, [$outer]);
39
40 self::assertSame([$outer, $inner], $tree->find('expr'));
41 self::assertSame([$tree], $tree->find('statement'));
42 self::assertSame([], $tree->find('missing'));
43 }
44
45 public function testSpan(): void
46 {
47 $tree = new Node('statement', 0, [new Token(3, 'SELECT', 'SELECT', 0), new Node('expr', 2, [new Token(7, 'NUM', '1', 7)])]);
48
49 self::assertSame([0, 8], $tree->span());
50 self::assertNull((new Node('opt', 0, []))->span());
51 }
52
53 public function testText(): void
54 {
55 $sql = 'SELECT 1 ';
56 $tree = new Node('statement', 0, [new Token(3, 'SELECT', 'SELECT', 0), new Node('expr', 2, [new Token(7, 'NUM', '1', 7)])]);
57
58 self::assertSame('SELECT 1', $tree->text($sql));
59 self::assertSame('', (new Node('opt', 0, []))->text($sql));
60 }
61
62 public function testToStringWritesBackTheTextTheTreeWasParsedFrom(): void
63 {
64 $sql = "SELECT /* one */ 1 -- done\n";
65 $tree = new Node('statement', 0, [
66 new Token(3, 'SELECT', 'SELECT', 0),
67 new Node('expr', 2, [new Token(7, 'NUM', '1', 17, ' /* one */ ')]),
68 new Node('opt', 0, []),
69 ], " -- done\n");
70
71 self::assertSame($sql, $tree->toString());
72 self::assertSame('', (new Node('opt', 0, []))->toString());
73 }
74}
75