packages/sql-formatter/tests/Unit/Core/Compact/GroupingTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Core\Compact;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\DataProvider;
9use PHPUnit\Framework\TestCase;
10
11#[CoversClass(\SqlFormatter\Core\Compact\Reductions::class)]
12#[CoversClass(\SqlFormatter\Core\Compact\Document::class)]
13#[CoversClass(\SqlFormatter\Core\Compact\Grouping::class)]
14#[CoversClass(\SqlFormatter\Core\Compact\Keywords::class)]
15#[CoversClass(\SqlFormatter\Core\Compact\Renderer::class)]
16#[CoversClass(\SqlFormatter\Core\Compact\Rules::class)]
17#[CoversClass(\SqlFormatter\Core\Compact\Shape::class)]
18#[CoversClass(\SqlFormatter\Core\Compact\Spacing::class)]
19#[CoversClass(\SqlFormatter\Core\Compact\Trivia::class)]
20#[CoversClass(\SqlFormatter\Core\Compact\Visitor::class)]
21#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Core\Formatter::class)]
22#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Core\Compact\Settings::class)]
23#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Platform\MySql\Dialect::class)]
24#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Platform\PostgreSql\Dialect::class)]
25#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Platform\Sqlite\Dialect::class)]
26#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFormatter\Facade\DialectFactory::class)]
27final class GroupingTest extends TestCase
28{
29    /**
30     * @param class-string<\SqlParser\MySql\MySqlParser|\SqlParser\PostgreSql\PostgreSqlParser|\SqlParser\Sqlite\SqliteParser> $parserClass
31     */
32    #[DataProvider('providerParsers')]
33    public function testPairsDistinguishesGroupingFromOtherParentheses(string $parserClass): void
34    {
35        $parser = new $parserClass();
36        $tree = $parser->parse('SELECT f((a+b)), (SELECT a FROM t), ((a)) FROM t');
37        self::assertCount(3, \SqlFormatter\Facade\DialectFactory::forParser($parser)->compactRules()->grouping->pairs($tree));
38    }
39    /**
40     * @return list<array{class-string<\SqlParser\MySql\MySqlParser|\SqlParser\PostgreSql\PostgreSqlParser|\SqlParser\Sqlite\SqliteParser>}>
41     */
42    public static function providerParsers(): array
43    {
44        return [[\SqlParser\MySql\MySqlParser::class], [\SqlParser\PostgreSql\PostgreSqlParser::class], [\SqlParser\Sqlite\SqliteParser::class]];
45    }
46}
47