packages/sql-faker/tests/Unit/MySql/Generation/Rewrite/Replication/TablePatternRuleTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\MySql\Generation\Rewrite\Replication;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use SqlFaker\Generation\Token\TerminalOccurrence;
11use SqlFaker\Generation\Token\TerminalSequence;
12use SqlFaker\MySql\Generation\Rewrite\Replication\TablePatternRule;
13
14#[CoversClass(TablePatternRule::class)]
15#[UsesClass(TerminalOccurrence::class)]
16#[UsesClass(TerminalSequence::class)]
17final class TablePatternRuleTest extends TestCase
18{
19    public function testRewriteMapsEveryWrappedFilterWithoutChangingUnrelatedStrings(): void
20    {
21        $first = new TerminalOccurrence('TEXT_STRING', 3, [0, 1, 2], ['filter_wild_db_table_string', 'TEXT_STRING_sys_nonewline', 'TEXT_STRING_sys']);
22        $plain = new TerminalOccurrence('TEXT_STRING', 4, [5], ['literal']);
23        $second = new TerminalOccurrence('TEXT_STRING', 6, [7], ['filter_wild_db_table_string']);
24        $other = new TerminalOccurrence('OTHER', 8, [9], ['filter_wild_db_table_string']);
25        $input = new TerminalSequence([$first, $plain, $second, $other], [$first, $plain, $second, $other]);
26        $rule = new TablePatternRule();
27        $result = $rule->rewrite($input);
28        self::assertSame(['REPLICATION_TABLE_PATTERN', 'TEXT_STRING', 'REPLICATION_TABLE_PATTERN', 'OTHER'], $result->names());
29        self::assertSame([3, 4, 6, 8], array_map(static fn (TerminalOccurrence $terminal): int => $terminal->id, $result->terminals));
30        self::assertSame($first->ancestors, $result->terminals[0]->ancestors);
31        self::assertSame($plain, $result->terminals[1]);
32        self::assertSame($other, $result->terminals[3]);
33        self::assertSame($input->original, $result->original);
34        self::assertSame($result, $rule->rewrite($result));
35    }
36}
37