packages/sql-formatter/tests/Unit/Core/Compact/ShapeTest.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 ShapeTest extends TestCase
27{
28    public function testOfRetainsOperandNestingButIgnoresTransparentWrappers(): void
29    {
30        $a = new \SqlParser\Lexer\Token(1, 'ID', 'a', 0);
31        $b = new \SqlParser\Lexer\Token(1, 'ID', 'b', 2);
32        $c = new \SqlParser\Lexer\Token(1, 'ID', 'c', 4);
33        $left = new \SqlParser\Parser\Node('expr', 0, [new \SqlParser\Parser\Node('expr', 0, [$a, $b]), $c]);
34        $right = new \SqlParser\Parser\Node('expr', 0, [$a, new \SqlParser\Parser\Node('expr', 0, [$b, $c])]);
35        $shape = new \SqlFormatter\Core\Compact\Shape([0 => $a, 2 => $b, 4 => $c], []);
36        self::assertNotSame($shape->of($left), $shape->of($right));
37        self::assertSame($shape->of($a), $shape->of(new \SqlParser\Parser\Node('expr', 7, [$a])));
38        self::assertNull($shape->of(new \SqlParser\Parser\Node('empty', 0, [])));
39    }
40    public function testOfDistinguishesAliasAndStringConcatenationGrammarOwners(): void
41    {
42        $parser = new \SqlParser\MySql\MySqlParser();
43        $alias = new \SqlFormatter\Core\Compact\Document($parser->parse("SELECT 'a' AS 'b'"), (new \SqlFormatter\Platform\MySql\Dialect())->compactRules());
44        $concatenation = new \SqlFormatter\Core\Compact\Document($parser->parse("SELECT 'a' 'b'"), (new \SqlFormatter\Platform\MySql\Dialect())->compactRules());
45        self::assertNotSame($alias->signature(), $concatenation->signature());
46    }
47}
48