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