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