packages/sql-formatter/tests/Unit/Core/Layout/SpacingTest.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\Layout\Spacing;
11use SqlParser\Lexer\Token;
12
13#[CoversClass(Spacing::class)]
14#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Core\Formatter::class)]
15#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Core\Compact\Settings::class)]
16#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Platform\MySql\Dialect::class)]
17#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Platform\PostgreSql\Dialect::class)]
18#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Platform\Sqlite\Dialect::class)]
19#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Facade\DialectFactory::class)]
20final class SpacingTest extends TestCase
21{
22    #[TestWith(['a', ',', false, ''])]
23    #[TestWith(['a', '.', false, ''])]
24    #[TestWith(['.', 'b', false, ''])]
25    #[TestWith(['(', '1', false, ''])]
26    #[TestWith(['1', ')', false, ''])]
27    #[TestWith(['-', '1', true, ''])]
28    #[TestWith(['-', '-', true, ' '])]
29    #[TestWith(['a', '+', false, ' '])]
30    public function testBetweenSeparatesTokens(string $before, string $after, bool $unary, string $expected): void
31    {
32        self::assertSame($expected, Spacing::between(new Token(1, 'TOKEN', $before, 0), new Token(1, 'TOKEN', $after, 5), $unary));
33    }
34
35    public function testBetweenPreservesFunctionAdjacency(): void
36    {
37        $name = new Token(1, 'IDENT', 'count', 0);
38        self::assertSame('', Spacing::between($name, new Token(2, 'LP', '(', 5)));
39        self::assertSame(' ', Spacing::between($name, new Token(2, 'LP', '(', 6, ' ')));
40        self::assertSame('', Spacing::between(null, $name));
41    }
42}
43