packages/sql-faker/tests/Unit/PostgreSql/Generation/Rewrite/Column/NumericContextRuleTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\PostgreSql\Generation\Rewrite\Column;
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\Column\NumericContextRule;
15
16#[CoversClass(NumericContextRule::class)]
17#[UsesClass(ProductionOccurrence::class)]
18#[UsesClass(TerminalOccurrence::class)]
19#[UsesClass(TerminalSequence::class)]
20final class NumericContextRuleTest extends TestCase
21{
22 /**
23 * @param list<string> $rules
24 */
25 #[DataProvider('providerContexts')]
26 public function testRewritePreservesNestedIntegersAndRestrictsDirectContextValues(array $rules, string $name, string $expected): void
27 {
28 $terminal = new TerminalOccurrence($name, 10, array_keys($rules), $rules);
29 $sequence = new TerminalSequence([$terminal], [$terminal]);
30 $rule = new NumericContextRule();
31 $result = $rule->rewrite($sequence);
32 self::assertSame([$expected], $result->names());
33 self::assertSame($terminal->id, $result->terminals[0]->id);
34 self::assertSame($terminal->ancestors, $result->terminals[0]->ancestors);
35 self::assertSame($result, $rule->rewrite($result));
36 }
37
38 /**
39 * @return list<array{list<string>, string, string}>
40 */
41 public static function providerContexts(): array
42 {
43 return [
44 [['opt_float', 'Iconst'], 'ICONST', 'FLOAT_PRECISION_NUMBER'],
45 [['alter_table_cmd', 'Iconst'], 'ICONST', 'COLUMN_POSITION_NUMBER'],
46 [['alter_table_cmd', 'SignedIconst', 'Iconst'], 'ICONST', 'ICONST'],
47 [['a_expr', 'Iconst'], 'ICONST', 'ICONST'],
48 [[], 'ICONST', 'ICONST'],
49 [['opt_float', 'Iconst'], 'FCONST', 'FCONST'],
50 ];
51 }
52}
53