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