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