packages/ztd-query-postgres/tests/Unit/Sql/Relation/FromClauseTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Sql\Relation;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9
10#[CoversClass(\ZtdQuery\Platform\Postgres\Sql\Relation\FromClause::class)]
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\Relation\RelationReference::class)]
12#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::class)]
13final class FromClauseTest extends TestCase
14{
15 public function testReferencesFromClause(): void
16 {
17 self::assertSame([['name' => 'users', 'start' => 0, 'unqualifiedStart' => 0, 'end' => 5], ['name' => 'orders', 'start' => 13, 'unqualifiedStart' => 13, 'end' => 19]], (new \ZtdQuery\Platform\Postgres\Sql\Relation\FromClause())->referencesFromClause('users u JOIN orders o ON u.id = o.user_id'));
18 }
19
20 public function testFindFromEnd(): void
21 {
22 $sql = 'SELECT * FROM users u JOIN orders o ON u.id = o.user_id WHERE u.id = 1';
23 $stream = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create());
24 $tokens = $stream->significantTokens();
25
26 self::assertSame(56, (new \ZtdQuery\Platform\Postgres\Sql\Relation\FromClause())->findFromEnd($sql, $tokens, $tokens[2]));
27 }
28
29 public function testMatchesKeywordSequence(): void
30 {
31 $sql = 'LEFT JOIN users';
32 $stream = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create());
33 $tokens = $stream->significantTokens();
34
35 self::assertSame(true, (new \ZtdQuery\Platform\Postgres\Sql\Relation\FromClause())->matchesKeywordSequence($tokens, 0, ['LEFT', 'JOIN']));
36 }
37 public function testParenthesizedReferencesRebasesJoinedRelationOffsets(): void
38 {
39 $sql = '(users JOIN orders ON users.id = orders.user_id)';
40 $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
41 $references = (new \ZtdQuery\Platform\Postgres\Sql\Relation\FromClause())->parenthesizedReferences($sql, $tokens, 0, $tokens[0]);
42 self::assertSame(['users', 'orders'], array_column($references, 'name'));
43 self::assertSame(1, $references[0]['start']);
44 self::assertSame(6, $references[0]['end']);
45 self::assertSame(12, $references[1]['start']);
46 self::assertSame(18, $references[1]['end']);
47 }
48}
49