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

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Core\Layout;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\TestWith;
9use PHPUnit\Framework\TestCase;
10use SqlFormatter\Core\FormatOptions;
11use SqlFormatter\Core\Layout\Policy;
12use SqlFormatter\Core\Style;
13
14#[CoversClass(Policy::class)]
15#[CoversClass(FormatOptions::class)]
16#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Core\Formatter::class)]
17#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Core\Compact\Settings::class)]
18#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Platform\MySql\Dialect::class)]
19#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Platform\PostgreSql\Dialect::class)]
20#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Platform\Sqlite\Dialect::class)]
21#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Facade\DialectFactory::class)]
22final class PolicyTest extends TestCase
23{
24    #[TestWith([Style::Expanded, "\n  ", "\n    ", 4])]
25    #[TestWith([Style::Tabular, "\n  ", '     ', 11])]
26    #[TestWith([Style::River, "\n      ", ' ', 11])]
27    public function testBeforeHeaderAndBodyPlacement(Style $style, string $before, string $after, int $indent): void
28    {
29        $policy = new Policy(new FormatOptions($style, 2), 2, 8);
30        self::assertSame($before, $policy->beforeHeader(4));
31        self::assertSame($after, $policy->afterHeader(4));
32        self::assertSame($indent, $policy->bodyIndent());
33    }
34    public function testLineUsesRequestedColumn(): void
35    {
36        $policy = new Policy(new FormatOptions(), 0, 0);
37        self::assertSame("\n   ", $policy->line(3));
38    }
39
40    public function testAfterHeaderBreaksExpandedBody(): void
41    {
42        $policy = new Policy(new FormatOptions(), 0, 6);
43        self::assertSame("\n    ", $policy->afterHeader(6));
44    }
45
46    public function testBodyIndentUsesAlignedContentColumn(): void
47    {
48        $policy = new Policy(new FormatOptions(Style::River), 4, 8);
49        self::assertSame(13, $policy->bodyIndent());
50    }
51}
52