packages/sql-faker/tests/Unit/Generation/Token/TerminalMappingRuleTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\Generation\Token;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use SqlFaker\Generation\Token\TerminalMappingRule;
11use SqlFaker\Generation\Token\TerminalOccurrence;
12use SqlFaker\Generation\Token\TerminalSequence;
13
14#[CoversClass(TerminalMappingRule::class)]
15#[UsesClass(TerminalOccurrence::class)]
16#[UsesClass(TerminalSequence::class)]
17#[UsesClass(\SqlFaker\Generation\Token\ProductionOccurrence::class)]
18final class TerminalMappingRuleTest extends TestCase
19{
20 public function testRewriteChangesOnlyDirectChildrenOfTheNamedRule(): void
21 {
22 $direct = new TerminalOccurrence('IDENT', 1, [0], ['option']);
23 $nested = new TerminalOccurrence('IDENT', 3, [0, 2], ['option', 'expression']);
24 $outside = new TerminalOccurrence('IDENT', 4);
25 $original = [$direct, $nested, $outside];
26 $input = new TerminalSequence($original, $original);
27 $result = (new TerminalMappingRule('option', 'IDENT', 'MODE', 'parser.c:option'))->rewrite($input);
28 self::assertSame(['MODE', 'IDENT', 'IDENT'], $result->names());
29 self::assertSame($original, $result->original);
30 self::assertSame($nested, $result->terminals[1]);
31 self::assertSame($direct->id, $result->terminals[0]->id);
32 self::assertSame('parser.c:option', $result->terminals[0]->rewrite);
33 }
34}
35