packages/sql-formatter/tests/Unit/Core/Compact/ReductionsTest.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 ReductionsTest extends TestCase
27{
28 public function testCandidatesProtectsHintBearingGrouping(): void
29 {
30 $parser = new \SqlParser\Sqlite\SqliteParser();
31 $tree = $parser->parse('SELECT (a) AS x');
32 self::assertSame([[7, 9], [11]], (new \SqlFormatter\Core\Compact\Reductions(\SqlFormatter\Facade\DialectFactory::forParser($parser)->compactRules()->grouping, \SqlFormatter\Facade\DialectFactory::forParser($parser)->compactRules()->aliases))->candidates($tree, []));
33 self::assertSame([[11]], (new \SqlFormatter\Core\Compact\Reductions(\SqlFormatter\Facade\DialectFactory::forParser($parser)->compactRules()->grouping, \SqlFormatter\Facade\DialectFactory::forParser($parser)->compactRules()->aliases))->candidates($tree, [8 => true]));
34 }
35
36 public function testAliasesKeepsCastAndCteAs(): void
37 {
38 $parser = new \SqlParser\PostgreSql\PostgreSqlParser();
39 $tree = $parser->parse('WITH q AS (SELECT CAST(a AS text) AS x FROM t AS u) SELECT x FROM q');
40 self::assertSame([34, 46], (new \SqlFormatter\Core\Compact\Reductions(\SqlFormatter\Facade\DialectFactory::forParser($parser)->compactRules()->grouping, \SqlFormatter\Facade\DialectFactory::forParser($parser)->compactRules()->aliases))->aliases($tree));
41 }
42}
43