packages/sql-formatter/tests/Unit/Core/Compact/RulesTest.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 RulesTest extends TestCase
27{
28 public function testApplyRemovesOnlyDefaultsOwnedByTheSelectedGrammarRule(): void
29 {
30 $distinct = new \SqlParser\Lexer\Token(1, 'DISTINCT', 'DISTINCT', 0);
31 $quantifier = new \SqlParser\Parser\Node('set_quantifier', 1, [$distinct]);
32 self::assertSame([], (new \SqlFormatter\Platform\PostgreSql\Dialect())->compactRules()->rules->apply($quantifier, [$distinct], new \SqlParser\Parser\Node('simple_select', 0, [])));
33 self::assertSame([$distinct], (new \SqlFormatter\Platform\PostgreSql\Dialect())->compactRules()->rules->apply($quantifier, [$distinct], new \SqlParser\Parser\Node('group_clause', 0, [])));
34 }
35
36 public function testApplyDoesNotRemoveCastAsInsideAProjection(): void
37 {
38 $tree = (new \SqlParser\PostgreSql\PostgreSqlParser())->parse('SELECT CAST(a AS text)');
39 $target = $tree->find('target_el')[0];
40 self::assertSame($target->tokens(), (new \SqlFormatter\Platform\PostgreSql\Dialect())->compactRules()->rules->apply($target, $target->tokens(), null));
41 }
42
43 public function testDefaultDoesNotDropSetAllOrDescendingOrdering(): void
44 {
45 self::assertFalse((new \SqlFormatter\Platform\MySql\Dialect())->compactRules()->rules->default('union_option', ['ALL'], null));
46 self::assertFalse((new \SqlFormatter\Platform\Sqlite\Dialect())->compactRules()->rules->default('sortorder', ['DESC'], null));
47 self::assertTrue((new \SqlFormatter\Platform\Sqlite\Dialect())->compactRules()->rules->default('sortorder', ['ASC'], null));
48 }
49}
50