packages/sql-formatter/tests/Unit/Core/Compact/SpacingTest.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 SpacingTest extends TestCase
27{
28    public function testBetweenProtectsNumberExponentAndCommentBoundaries(): void
29    {
30        $spacing = new \SqlFormatter\Core\Compact\Spacing(new \SqlParser\PostgreSql\PostgreSqlParser(), \SqlFormatter\Facade\DialectFactory::forParser(new \SqlParser\PostgreSql\PostgreSqlParser())->compactRules());
31        self::assertSame(' ', $spacing->between(new \SqlParser\Lexer\Token(1, 'ICONST', '1', 0), new \SqlParser\Lexer\Token(2, 'IDENT', 'e2', 2), null));
32        self::assertSame(' ', $spacing->between(new \SqlParser\Lexer\Token(1, '-', '-', 0), new \SqlParser\Lexer\Token(1, '-', '-', 2), null));
33        self::assertSame('', $spacing->between(new \SqlParser\Lexer\Token(1, 'IDENT', 'a', 0), new \SqlParser\Lexer\Token(2, '+', '+', 2), null));
34    }
35
36    public function testBetweenDoesNotMergeQuotedTokensOrOperatorTokens(): void
37    {
38        $spacing = new \SqlFormatter\Core\Compact\Spacing(new \SqlParser\PostgreSql\PostgreSqlParser(), \SqlFormatter\Facade\DialectFactory::forParser(new \SqlParser\PostgreSql\PostgreSqlParser())->compactRules());
39        self::assertSame(' ', $spacing->between(new \SqlParser\Lexer\Token(1, 'SCONST', "'a'", 0), new \SqlParser\Lexer\Token(1, 'SCONST', "'b'", 4), null));
40        self::assertSame(' ', $spacing->between(new \SqlParser\Lexer\Token(1, '/', '/', 0), new \SqlParser\Lexer\Token(2, '*', '*', 2), null));
41    }
42
43    public function testSignatureDistinguishesTokenMerging(): void
44    {
45        $spacing = new \SqlFormatter\Core\Compact\Spacing(new \SqlParser\PostgreSql\PostgreSqlParser(), \SqlFormatter\Facade\DialectFactory::forParser(new \SqlParser\PostgreSql\PostgreSqlParser())->compactRules());
46        self::assertNotSame($spacing->signature('a b'), $spacing->signature('ab'));
47        self::assertNotSame($spacing->signature("'a' 'b'"), $spacing->signature("'a''b'"));
48        self::assertSame($spacing->signature('a + b'), $spacing->signature('a+b'));
49    }
50}
51