packages/sql-faker/tests/Unit/MySql/Generation/Rewrite/Partition/ListValueRuleTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\MySql\Generation\Rewrite\Partition;
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\MySql\Generation\Rewrite\Partition\ListValueRule;
15
16#[CoversClass(ListValueRule::class)]
17#[UsesClass(ProductionOccurrence::class)]
18#[UsesClass(TerminalOccurrence::class)]
19#[UsesClass(TerminalSequence::class)]
20final class ListValueRuleTest extends TestCase
21{
22 #[DataProvider('providerValues')]
23 public function testRewriteDisambiguatesListExpressionsAndPreservesRangeBounds(string $scope, string $first, string $expected): void
24 {
25 $item = new TerminalOccurrence($first, 10, [0, 1], [$scope, 'part_value_item']);
26 $input = new TerminalSequence([$item], productions: [new ProductionOccurrence(0, null, $scope, 0), new ProductionOccurrence(1, 0, 'part_value_item', 0)]);
27 $result = (new ListValueRule())->rewrite($input);
28 self::assertSame($expected === '+' ? ['+', '('] : [$expected], $result->names());
29 self::assertSame($input->original, $result->original);
30 self::assertSame($input->productions, $result->productions);
31 self::assertSame($item->id, $result->terminals[count($result->terminals) - 1]->id);
32 self::assertSame($result, (new ListValueRule())->rewrite($result));
33 }
34
35 /**
36 * @return list<array{string, string, string}>
37 */
38 public static function providerValues(): array
39 {
40 return [['part_values_in', 'MAX_VALUE_SYM', 'NUM'], ['part_func_max', 'MAX_VALUE_SYM', 'MAX_VALUE_SYM'], ['part_values_in', '(', '+'], ['part_func_max', '(', '('], ['part_values_in', 'NUM', 'NUM']];
41 }
42
43 public function testRewritePreservesAnEmptyListItem(): void
44 {
45 $input = new TerminalSequence([], productions: [new ProductionOccurrence(0, null, 'part_value_item', 0)]);
46 self::assertSame($input, (new ListValueRule())->rewrite($input));
47 }
48}
49