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