packages/sql-faker/tests/Unit/Generation/Token/TokenRewriterTest.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;
13use SqlFaker\Generation\Token\TokenRewriter;
14
15#[CoversClass(TokenRewriter::class)]
16#[UsesClass(TerminalMappingRule::class)]
17#[UsesClass(TerminalOccurrence::class)]
18#[UsesClass(TerminalSequence::class)]
19#[UsesClass(\SqlFaker\Generation\Token\ProductionOccurrence::class)]
20final class TokenRewriterTest extends TestCase
21{
22    public function testRewriteAppliesEachRuleOnceInOrderAndPreservesTheOriginal(): void
23    {
24        $input = new TerminalSequence([new TerminalOccurrence('A', 1, [0], ['scope'])]);
25        $pipeline = new TokenRewriter(
26            new TerminalMappingRule('scope', 'A', 'B', 'first'),
27            new TerminalMappingRule('scope', 'B', 'C', 'second'),
28            new TerminalMappingRule('scope', 'C', 'A', 'third'),
29        );
30        $result = $pipeline->rewrite($input);
31        self::assertSame(['A'], $result->names());
32        self::assertSame(['first', 'second', 'third'], $result->rewrites);
33        self::assertSame($input->original, $result->original);
34        self::assertSame($input, (new TokenRewriter())->rewrite($input));
35    }
36}
37