packages/sql-faker/tests/Unit/MySql/Generation/Rewrite/Routine/BinlogRuleTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\MySql\Generation\Rewrite\Routine;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\TestWith;
9use PHPUnit\Framework\Attributes\UsesClass;
10use PHPUnit\Framework\TestCase;
11use SqlFaker\Generation\Token\TerminalOccurrence;
12use SqlFaker\Generation\Token\TerminalSequence;
13use SqlFaker\MySql\Generation\Rewrite\Routine\BinlogRule;
14
15#[CoversClass(BinlogRule::class)]
16#[UsesClass(TerminalOccurrence::class)]
17#[UsesClass(TerminalSequence::class)]
18final class BinlogRuleTest extends TestCase
19{
20    /**
21     * @param list<string> $rules
22     */
23    #[TestWith([['sp_proc_stmt_statement', 'statement', 'binlog_base64_event'], 'DO_SYM'])]
24    #[TestWith([['sp_proc_stmt_statement', 'simple_statement', 'binlog_stmt'], 'DO_SYM'])]
25    #[TestWith([['statement', 'binlog_base64_event'], 'BINLOG_SYM'])]
26    #[TestWith([['sp_proc_stmt_statement', 'statement', 'show'], 'BINLOG_SYM'])]
27    public function testRewriteOnlyTheConflictingBodyStatement(array $rules, string $expected): void
28    {
29        $keyword = new TerminalOccurrence('BINLOG_SYM', 0, [], $rules);
30        $literal = new TerminalOccurrence('TEXT_STRING', 1, [], $rules);
31        $input = new TerminalSequence([$keyword, $literal], [$keyword, $literal]);
32        $rule = new BinlogRule();
33        $result = $rule->rewrite($input);
34        self::assertSame([$expected, 'TEXT_STRING'], $result->names());
35        self::assertSame($literal, $result->terminals[1]);
36        self::assertSame($input->original, $result->original);
37        self::assertSame($result, $rule->rewrite($result));
38    }
39}
40