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