packages/sql-formatter/tests/Unit/Core/Layout/HeadersTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Core\Layout;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use SqlFormatter\Core\FormatOptions;
10use SqlFormatter\Core\Layout\Headers;
11use SqlFormatter\Core\Layout\Policy;
12use SqlFormatter\Core\Layout\Writer;
13use SqlFormatter\Core\Style;
14use SqlFormatter\Core\Syntax\Document;
15use SqlParser\Sqlite\SqliteParser;
16
17#[CoversClass(Document::class)]
18#[CoversClass(\SqlFormatter\Core\Syntax\Analyzer::class)]
19#[CoversClass(\SqlFormatter\Core\Syntax\Brackets::class)]
20#[CoversClass(\SqlFormatter\Core\Syntax\Expressions::class)]
21#[CoversClass(\SqlFormatter\Core\Syntax\Headers::class)]
22#[CoversClass(\SqlFormatter\Core\Syntax\Markers::class)]
23#[CoversClass(\SqlFormatter\Core\Syntax\Rules::class)]
24#[CoversClass(Headers::class)]
25#[CoversClass(Writer::class)]
26#[CoversClass(Policy::class)]
27#[CoversClass(FormatOptions::class)]
28#[CoversClass(\SqlFormatter\Core\Syntax\Lists::class)]
29#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Core\Formatter::class)]
30#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Core\Compact\Settings::class)]
31#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Platform\MySql\Dialect::class)]
32#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Platform\PostgreSql\Dialect::class)]
33#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Platform\Sqlite\Dialect::class)]
34#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Facade\DialectFactory::class)]
35final class HeadersTest extends TestCase
36{
37    public function testWidthExcludesNestedQueryHeaders(): void
38    {
39        $document = Document::from((new SqliteParser())->parse('SELECT (SELECT a FROM t ORDER BY a) FROM u'), (new \SqlFormatter\Platform\Sqlite\Dialect())->syntaxRules());
40        $headers = new Headers($document);
41        self::assertSame(6, $headers->width(0, count($document->tokens) - 1));
42        self::assertSame(8, $headers->width(2, 9));
43    }
44    public function testLengthIncludesInterwordSpaces(): void
45    {
46        $document = Document::from((new SqliteParser())->parse('SELECT a FROM t ORDER BY a'), (new \SqlFormatter\Platform\Sqlite\Dialect())->syntaxRules());
47        self::assertSame(8, (new Headers($document))->length(4, 5));
48    }
49
50    public function testWriteAlignsRiverHeader(): void
51    {
52        $document = Document::from((new SqliteParser())->parse('SELECT a FROM t'), (new \SqlFormatter\Platform\Sqlite\Dialect())->syntaxRules());
53        $writer = new Writer();
54        (new Headers($document))->write($writer, 0, 0, new Policy(new FormatOptions(Style::River), 0, 8));
55        self::assertSame('  SELECT', $writer->finish(''));
56    }
57}
58