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