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