packages/sql-formatter/tests/Unit/Core/Compact/KeywordsTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Core\Compact;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9
10#[CoversClass(\SqlFormatter\Core\Compact\Reductions::class)]
11#[CoversClass(\SqlFormatter\Core\Compact\Document::class)]
12#[CoversClass(\SqlFormatter\Core\Compact\Grouping::class)]
13#[CoversClass(\SqlFormatter\Core\Compact\Keywords::class)]
14#[CoversClass(\SqlFormatter\Core\Compact\Renderer::class)]
15#[CoversClass(\SqlFormatter\Core\Compact\Rules::class)]
16#[CoversClass(\SqlFormatter\Core\Compact\Shape::class)]
17#[CoversClass(\SqlFormatter\Core\Compact\Spacing::class)]
18#[CoversClass(\SqlFormatter\Core\Compact\Trivia::class)]
19#[CoversClass(\SqlFormatter\Core\Compact\Visitor::class)]
20#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Core\Formatter::class)]
21#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Core\Compact\Settings::class)]
22#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Platform\MySql\Dialect::class)]
23#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Platform\PostgreSql\Dialect::class)]
24#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Platform\Sqlite\Dialect::class)]
25#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Facade\DialectFactory::class)]
26final class KeywordsTest extends TestCase
27{
28    public function testTextPreservesKeywordIdentifiersAndLiteralBytes(): void
29    {
30        $keyword = new \SqlParser\Lexer\Token(1, 'ACTION', 'Action', 0);
31        self::assertSame('Action', (new \SqlFormatter\Platform\MySql\Dialect())->compactRules()->keywords->text($keyword, true));
32        self::assertSame('ACTION', (new \SqlFormatter\Platform\MySql\Dialect())->compactRules()->keywords->text($keyword, false));
33        $literal = new \SqlParser\Lexer\Token(2, 'SCONST', "'MiXeD'", 0);
34        self::assertSame("'MiXeD'", (new \SqlFormatter\Platform\MySql\Dialect())->compactRules()->keywords->text($literal, false));
35        self::assertTrue((new \SqlFormatter\Platform\PostgreSql\Dialect())->compactRules()->keywords->identifier('ColLabel'));
36        self::assertFalse((new \SqlFormatter\Platform\PostgreSql\Dialect())->compactRules()->keywords->identifier('expr'));
37    }
38
39    public function testIdentifierRecognizesGrammarNameRoles(): void
40    {
41        self::assertTrue((new \SqlFormatter\Platform\PostgreSql\Dialect())->compactRules()->keywords->identifier('ColLabel'));
42        self::assertFalse((new \SqlFormatter\Platform\PostgreSql\Dialect())->compactRules()->keywords->identifier('expr'));
43    }
44
45    public function testFallbackPreservesSqliteIdentifierSpelling(): void
46    {
47        $identifier = new \SqlParser\Lexer\Token(1, 'ACTION', 'Action', 0);
48        self::assertTrue((new \SqlFormatter\Platform\Sqlite\Dialect())->compactRules()->keywords->fallback($identifier, new \SqlParser\Parser\Node('expr', 2, [$identifier])));
49        $constant = new \SqlParser\Lexer\Token(2, 'CTIME_KW', 'current_timestamp', 0);
50        self::assertFalse((new \SqlFormatter\Platform\Sqlite\Dialect())->compactRules()->keywords->fallback($constant, new \SqlParser\Parser\Node('expr', 0, [$constant])));
51    }
52}
53