packages/ztd-query-mysql/tests/Unit/Rewrite/Transformer/Select/ExpressionAliaserTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Rewrite\Transformer\Select;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use ZtdQuery\Platform\MySql\Rewrite\Transformer\Select\ExpressionAliaser;
10
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::class)]
12#[CoversClass(ExpressionAliaser::class)]
13final class ExpressionAliaserTest extends TestCase
14{
15    public function testEndsSelectList(): void
16    {
17        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize('FROM id', \ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::create())->significantTokens();
18        self::assertTrue((new ExpressionAliaser())->endsSelectList($tokens[0]));
19        self::assertFalse((new ExpressionAliaser())->endsSelectList($tokens[1]));
20    }
21
22    public function testContainsWildcard(): void
23    {
24        $aliaser = new ExpressionAliaser();
25        self::assertTrue($aliaser->containsWildcard(['id', 't.*']));
26        self::assertTrue($aliaser->containsWildcard(['']));
27        self::assertFalse($aliaser->containsWildcard(['COUNT(*)', 'id * 2']));
28    }
29
30    public function testRemoveModifiers(): void
31    {
32        $aliaser = new ExpressionAliaser();
33        self::assertSame(['modifiers' => 'DISTINCT SQL_NO_CACHE ', 'expression' => 'id'], $aliaser->removeModifiers('DISTINCT SQL_NO_CACHE id'));
34        self::assertSame(['modifiers' => '', 'expression' => 'id'], $aliaser->removeModifiers('id'));
35    }
36
37    public function testIsModifier(): void
38    {
39        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize('DISTINCT id', \ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::create())->significantTokens();
40        self::assertTrue((new ExpressionAliaser())->isModifier($tokens[0]));
41        self::assertFalse((new ExpressionAliaser())->isModifier($tokens[1]));
42    }
43
44    public function testWithoutExplicitAlias(): void
45    {
46        $aliaser = new ExpressionAliaser();
47        self::assertSame('CAST(id AS SIGNED)', $aliaser->withoutExplicitAlias('CAST(id AS SIGNED) AS x'));
48        self::assertSame('id implicit', $aliaser->withoutExplicitAlias('id implicit'));
49    }
50
51}
52