packages/sql-faker/tests/Unit/PostgreSql/Generation/Rewrite/Routine/JsonTablePathRuleTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\PostgreSql\Generation\Rewrite\Routine;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\DataProvider;
9use PHPUnit\Framework\Attributes\UsesClass;
10use PHPUnit\Framework\TestCase;
11use SqlFaker\Generation\Token\ProductionOccurrence;
12use SqlFaker\Generation\Token\TerminalOccurrence;
13use SqlFaker\Generation\Token\TerminalSequence;
14use SqlFaker\PostgreSql\Generation\Rewrite\Routine\JsonTablePathRule;
15
16#[CoversClass(JsonTablePathRule::class)]
17#[UsesClass(ProductionOccurrence::class)]
18#[UsesClass(TerminalOccurrence::class)]
19#[UsesClass(TerminalSequence::class)]
20final class JsonTablePathRuleTest extends TestCase
21{
22    #[DataProvider('providerPaths')]
23    public function testRewriteOnlyTheDirectPathIsReplaced(string $name, string $expected): void
24    {
25        $context = new TerminalOccurrence('IDENT', 10, [0, 1, 2], ['json_table', 'json_value_expr', 'a_expr']);
26        $path = new TerminalOccurrence($name, 11, [0, 3], ['json_table', 'a_expr']);
27        $column = new TerminalOccurrence('IDENT', 12, [0, 4], ['json_table', 'json_table_column_definition']);
28        $input = new TerminalSequence([$context, $path, $column], [$context, $path, $column], [], [
29            new ProductionOccurrence(0, null, 'json_table', 0), new ProductionOccurrence(1, 0, 'json_value_expr', 0),
30            new ProductionOccurrence(2, 1, 'a_expr', 0), new ProductionOccurrence(3, 0, 'a_expr', 0),
31            new ProductionOccurrence(4, 0, 'json_table_column_definition', 0),
32        ]);
33        $rule = new JsonTablePathRule();
34        $result = $rule->rewrite($input);
35        self::assertSame(['IDENT', $expected, 'IDENT'], $result->names());
36        self::assertSame($input->original, $result->original);
37        self::assertSame($context, $result->terminals[0]);
38        self::assertSame($column, $result->terminals[2]);
39        self::assertSame($result, $rule->rewrite($result));
40        self::assertSame(TerminalSequence::class, $rule->rewrite(TerminalSequence::fromNames([]))::class);
41    }
42
43    /**
44     * @return iterable<array{string, string}>
45     */
46    public static function providerPaths(): iterable
47    {
48        yield ['IDENT', 'JSON_TABLE_PATH'];
49        yield ['ICONST', 'JSON_TABLE_PATH'];
50        yield ['SCONST', 'SCONST'];
51        yield ['JSON_TABLE_PATH', 'JSON_TABLE_PATH'];
52    }
53}
54