packages/ztd-query-postgres/tests/Unit/Sql/Merge/RelationTargetTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Sql\Merge;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9
10#[CoversClass(\ZtdQuery\Platform\Postgres\Sql\Merge\RelationTarget::class)]
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::class)]
12final class RelationTargetTest extends TestCase
13{
14    public function testRelationAt(): void
15    {
16        $sql = 'public."Users" u';
17        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
18
19        self::assertEquals(['name' => 'Users', 'sql' => 'public."Users"', 'next' => 3, 'last' => new \ZtdQuery\Sql\SqlToken(kind: \ZtdQuery\Sql\SqlTokenKind::QuotedIdentifier, text: '"Users"', offset: 7, depth: 0, bracketDepth: 0)], (new \ZtdQuery\Platform\Postgres\Sql\Merge\RelationTarget())->relationAt($sql, $tokens, 0));
20
21        $sql = 'ONLY users';
22        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
23
24        self::assertEquals(['name' => 'users', 'sql' => 'users', 'next' => 2, 'last' => new \ZtdQuery\Sql\SqlToken(kind: \ZtdQuery\Sql\SqlTokenKind::Word, text: 'users', offset: 5, depth: 0, bracketDepth: 0)], (new \ZtdQuery\Platform\Postgres\Sql\Merge\RelationTarget())->relationAt($sql, $tokens, 1));
25
26        $sql = '()';
27        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
28
29        self::assertSame(null, (new \ZtdQuery\Platform\Postgres\Sql\Merge\RelationTarget())->relationAt($sql, $tokens, 0));
30    }
31
32    public function testTargetAlias(): void
33    {
34        $sql = 'AS u';
35        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
36
37        self::assertSame('u', (new \ZtdQuery\Platform\Postgres\Sql\Merge\RelationTarget())->targetAlias($sql, $tokens, 0, 2, 'users'));
38
39        $sql = '';
40        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
41
42        self::assertSame('users', (new \ZtdQuery\Platform\Postgres\Sql\Merge\RelationTarget())->targetAlias($sql, $tokens, 0, 0, 'users'));
43    }
44
45    public function testIdentifierName(): void
46    {
47        $sql = '"a""b"';
48        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
49
50        self::assertSame('a"b', (new \ZtdQuery\Platform\Postgres\Sql\Merge\RelationTarget())->identifierName($tokens[0]));
51
52        $sql = 'users';
53        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
54
55        self::assertSame('users', (new \ZtdQuery\Platform\Postgres\Sql\Merge\RelationTarget())->identifierName($tokens[0]));
56
57        $sql = '(';
58        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
59
60        self::assertSame(null, (new \ZtdQuery\Platform\Postgres\Sql\Merge\RelationTarget())->identifierName($tokens[0]));
61    }
62
63    public function testIsSymbol(): void
64    {
65        $sql = '(';
66        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
67
68        self::assertSame(true, (new \ZtdQuery\Platform\Postgres\Sql\Merge\RelationTarget())->isSymbol($tokens[0], '('));
69
70        $sql = 'word';
71        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
72
73        self::assertSame(false, (new \ZtdQuery\Platform\Postgres\Sql\Merge\RelationTarget())->isSymbol($tokens[0], '('));
74    }
75}
76