packages/ztd-query-postgres/tests/Unit/Sql/Partition/ClauseTokensTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Sql\Partition;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9
10#[CoversClass(\ZtdQuery\Platform\Postgres\Sql\Partition\ClauseTokens::class)]
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::class)]
12final class ClauseTokensTest extends TestCase
13{
14    public function testParenthesizedValues(): void
15    {
16        $sql = '(1, 2)';
17        $stream = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create());
18        $tokens = $stream->significantTokens();
19
20        self::assertSame(['values' => ['1', '2'], 'next' => 5], (new \ZtdQuery\Platform\Postgres\Sql\Partition\ClauseTokens())->parenthesizedValues($sql, $tokens, 0));
21    }
22
23    public function testClosingParenthesisIndex(): void
24    {
25        $sql = '(1, 2)';
26        $stream = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create());
27        $tokens = $stream->significantTokens();
28
29        self::assertSame(4, (new \ZtdQuery\Platform\Postgres\Sql\Partition\ClauseTokens())->closingParenthesisIndex($tokens, 0));
30    }
31
32    public function testIsSymbol(): void
33    {
34        $sql = '(1, 2)';
35        $stream = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create());
36        $tokens = $stream->significantTokens();
37
38        self::assertSame(true, (new \ZtdQuery\Platform\Postgres\Sql\Partition\ClauseTokens())->isSymbol($tokens[0], '('));
39    }
40
41    public function testKeywordPairIndex(): void
42    {
43        $sql = 'PARTITION BY RANGE (id)';
44        $stream = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create());
45        $tokens = $stream->significantTokens();
46
47        self::assertSame(0, (new \ZtdQuery\Platform\Postgres\Sql\Partition\ClauseTokens())->keywordPairIndex($tokens, 'PARTITION', 'BY'));
48    }
49
50    public function testKeywordIndex(): void
51    {
52        $sql = 'PARTITION BY RANGE (id)';
53        $stream = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create());
54        $tokens = $stream->significantTokens();
55
56        self::assertSame(2, (new \ZtdQuery\Platform\Postgres\Sql\Partition\ClauseTokens())->keywordIndex($tokens, 'RANGE'));
57    }
58
59    public function testQualifiedIdentifierAt(): void
60    {
61        $sql = 'public."Users"';
62        $stream = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create());
63        $tokens = $stream->significantTokens();
64
65        self::assertSame(['name' => 'Users', 'next' => 3], (new \ZtdQuery\Platform\Postgres\Sql\Partition\ClauseTokens())->qualifiedIdentifierAt($stream, $tokens, 0));
66    }
67}
68