packages/sql-formatter/tests/Unit/Core/Compact/DocumentTest.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 DocumentTest extends TestCase
27{
28 public function testSignatureIgnoresOptionalSyntaxButPreservesOperatorAssociation(): void
29 {
30 $parser = new \SqlParser\Sqlite\SqliteParser();
31 $left = new \SqlFormatter\Core\Compact\Document($parser->parse('select all (a+b)+c as x from t order by a asc;'), (new \SqlFormatter\Platform\Sqlite\Dialect())->compactRules());
32 $same = new \SqlFormatter\Core\Compact\Document($parser->parse('SELECT a+b+c x FROM t ORDER BY a'), (new \SqlFormatter\Platform\Sqlite\Dialect())->compactRules());
33 $different = new \SqlFormatter\Core\Compact\Document($parser->parse('SELECT a+(b+c) x FROM t ORDER BY a'), (new \SqlFormatter\Platform\Sqlite\Dialect())->compactRules());
34 self::assertSame($left->signature(), $same->signature());
35 self::assertNotSame($left->signature(), $different->signature());
36 }
37
38 public function testSignatureDistinguishesHintsAndExecutableComments(): void
39 {
40 $parser = new \SqlParser\MySql\MySqlParser();
41 $plain = new \SqlFormatter\Core\Compact\Document($parser->parse('SELECT 1'), (new \SqlFormatter\Platform\MySql\Dialect())->compactRules());
42 $hinted = new \SqlFormatter\Core\Compact\Document($parser->parse('SELECT /*+ MAX_EXECUTION_TIME(1) */ 1'), (new \SqlFormatter\Platform\MySql\Dialect())->compactRules());
43 $versioned = new \SqlFormatter\Core\Compact\Document($parser->parse('SELECT /*!99999 DISTINCT */ 1'), (new \SqlFormatter\Platform\MySql\Dialect())->compactRules());
44 self::assertNotSame($plain->signature(), $hinted->signature());
45 self::assertNotSame($plain->signature(), $versioned->signature());
46 }
47}
48