packages/ztd-query-postgres/tests/Unit/Sql/Sampling/SampleTokensTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Sql\Sampling;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9
10#[CoversClass(\ZtdQuery\Platform\Postgres\Sql\Sampling\SampleTokens::class)]
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::class)]
12final class SampleTokensTest extends TestCase
13{
14    public function testTokenAtOffset(): void
15    {
16        $sql = 'users TABLESAMPLE SYSTEM (10) REPEATABLE (7)';
17        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
18        $reference = ['name' => 'users', 'start' => 0, 'unqualifiedStart' => 0, 'end' => 5];
19
20        self::assertEquals(new \ZtdQuery\Sql\SqlToken(kind: \ZtdQuery\Sql\SqlTokenKind::Word, text: 'users', offset: 0, depth: 0, bracketDepth: 0), (new \ZtdQuery\Platform\Postgres\Sql\Sampling\SampleTokens())->tokenAtOffset($tokens, 0));
21
22        $sql = 'users TABLESAMPLE SYSTEM (10) REPEATABLE (7)';
23        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
24        $reference = ['name' => 'users', 'start' => 0, 'unqualifiedStart' => 0, 'end' => 5];
25
26        self::assertSame(null, (new \ZtdQuery\Platform\Postgres\Sql\Sampling\SampleTokens())->tokenAtOffset($tokens, 500));
27    }
28
29    public function testSampleIndexAfter(): void
30    {
31        $sql = 'users TABLESAMPLE SYSTEM (10) REPEATABLE (7)';
32        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
33        $reference = ['name' => 'users', 'start' => 0, 'unqualifiedStart' => 0, 'end' => 5];
34
35        self::assertSame(1, (new \ZtdQuery\Platform\Postgres\Sql\Sampling\SampleTokens())->sampleIndexAfter($tokens, $tokens[0]));
36    }
37
38    public function testIsRelationBoundary(): void
39    {
40        $sql = ',';
41        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
42
43        self::assertSame(false, (new \ZtdQuery\Platform\Postgres\Sql\Sampling\SampleTokens())->isRelationBoundary($tokens[0]));
44
45        $sql = 'JOIN';
46        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
47
48        self::assertSame(true, (new \ZtdQuery\Platform\Postgres\Sql\Sampling\SampleTokens())->isRelationBoundary($tokens[0]));
49
50        $sql = 'WHERE';
51        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
52
53        self::assertSame(true, (new \ZtdQuery\Platform\Postgres\Sql\Sampling\SampleTokens())->isRelationBoundary($tokens[0]));
54
55        $sql = 'name';
56        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
57
58        self::assertSame(false, (new \ZtdQuery\Platform\Postgres\Sql\Sampling\SampleTokens())->isRelationBoundary($tokens[0]));
59    }
60
61    public function testIsOpeningParenthesis(): void
62    {
63        $sql = 'users TABLESAMPLE SYSTEM (10) REPEATABLE (7)';
64        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
65        $reference = ['name' => 'users', 'start' => 0, 'unqualifiedStart' => 0, 'end' => 5];
66
67        self::assertSame(true, (new \ZtdQuery\Platform\Postgres\Sql\Sampling\SampleTokens())->isOpeningParenthesis($tokens[3], $tokens[0]));
68    }
69
70    public function testClosingParenthesisIndex(): void
71    {
72        $sql = 'users TABLESAMPLE SYSTEM (10) REPEATABLE (7)';
73        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
74        $reference = ['name' => 'users', 'start' => 0, 'unqualifiedStart' => 0, 'end' => 5];
75
76        self::assertSame(5, (new \ZtdQuery\Platform\Postgres\Sql\Sampling\SampleTokens())->closingParenthesisIndex($tokens, 3));
77    }
78
79    public function testTokenAfter(): void
80    {
81        $sql = 'users TABLESAMPLE SYSTEM (10) REPEATABLE (7)';
82        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
83        $reference = ['name' => 'users', 'start' => 0, 'unqualifiedStart' => 0, 'end' => 5];
84
85        self::assertEquals(new \ZtdQuery\Sql\SqlToken(kind: \ZtdQuery\Sql\SqlTokenKind::Word, text: 'TABLESAMPLE', offset: 6, depth: 0, bracketDepth: 0), (new \ZtdQuery\Platform\Postgres\Sql\Sampling\SampleTokens())->tokenAfter($tokens, $tokens[0]));
86    }
87
88    public function testSameLevel(): void
89    {
90        $sql = 'users TABLESAMPLE SYSTEM (10) REPEATABLE (7)';
91        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
92        $reference = ['name' => 'users', 'start' => 0, 'unqualifiedStart' => 0, 'end' => 5];
93
94        self::assertSame(true, (new \ZtdQuery\Platform\Postgres\Sql\Sampling\SampleTokens())->sameLevel($tokens[0], $tokens[1]));
95    }
96}
97