packages/sql-formatter/tests/Unit/Core/Compact/TriviaTest.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 TriviaTest extends TestCase
27{
28    public function testCleanKeepsOnlyTopLevelDirectives(): void
29    {
30        $trivia = new \SqlFormatter\Core\Compact\Trivia((new \SqlFormatter\Platform\PostgreSql\Dialect())->compactRules()->nesting);
31        self::assertSame('/*+ keep */', $trivia->clean(" -- discard\n/* nested /*+ discard */ body */ /*+ keep */ \n"));
32        self::assertFalse($trivia->executable);
33    }
34
35    public function testCleanRetainsExecutableMarkersAndBodyWhitespaceAcrossTokens(): void
36    {
37        $trivia = new \SqlFormatter\Core\Compact\Trivia((new \SqlFormatter\Platform\MySql\Dialect())->compactRules()->nesting);
38        self::assertSame('/*!80000 ', $trivia->clean(' /* discard */ /*!80000 '));
39        self::assertTrue($trivia->executable);
40        self::assertSame('  ', $trivia->clean('  '));
41        self::assertSame(' */', $trivia->clean(' */ # discard'));
42        self::assertFalse($trivia->executable);
43    }
44
45    public function testCleanRecognizesMysqlNestedVersionComments(): void
46    {
47        $trivia = new \SqlFormatter\Core\Compact\Trivia((new \SqlFormatter\Platform\MySql\Dialect())->compactRules()->nesting);
48        self::assertSame('', $trivia->clean('/* outer /*! nested */ /*+ hidden */ */'));
49        self::assertSame('/*M! keep */', $trivia->clean('/*M! keep */'));
50    }
51
52    public function testBlockEndRespectsTheDialectNestingRules(): void
53    {
54        self::assertSame(17, (new \SqlFormatter\Core\Compact\Trivia((new \SqlFormatter\Platform\PostgreSql\Dialect())->compactRules()->nesting))->blockEnd('/* a /* b */ c */  ', 0));
55        self::assertSame(12, (new \SqlFormatter\Core\Compact\Trivia((new \SqlFormatter\Platform\Sqlite\Dialect())->compactRules()->nesting))->blockEnd('/* a /* b */ c */  ', 0));
56    }
57    public function testExecutablePartDoesNotCloseTheOuterCommentAtAnInnerComment(): void
58    {
59        $trivia = new \SqlFormatter\Core\Compact\Trivia((new \SqlFormatter\Platform\MySql\Dialect())->compactRules()->nesting);
60        $trivia->executable = true;
61        $offset = 0;
62        self::assertSame('/* inner */', $trivia->executablePart('/* inner */', $offset));
63        self::assertTrue($trivia->executable);
64        self::assertSame(11, $offset);
65    }
66}
67