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