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