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

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\MySql\Generation\Rewrite;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use SqlFaker\Generation\Derivation\DerivationTrace;
11use SqlFaker\Grammar\Model\NonTerminal;
12use SqlFaker\Grammar\Model\Production;
13use SqlFaker\Grammar\Model\Terminal;
14use SqlFaker\MySql\Generation\Rewrite\FlushExportRule;
15
16#[CoversClass(FlushExportRule::class)]
17#[UsesClass(DerivationTrace::class)]
18#[UsesClass(NonTerminal::class)]
19#[UsesClass(Production::class)]
20#[UsesClass(Terminal::class)]
21#[UsesClass(\SqlFaker\Generation\Token\ProductionOccurrence::class)]
22#[UsesClass(\SqlFaker\Generation\Token\TerminalOccurrence::class)]
23#[UsesClass(\SqlFaker\Generation\Token\TerminalSequence::class)]
24final class FlushExportRuleTest extends TestCase
25{
26    public function testRewriteAddsATableToAnEmptyExportListAndPreservesItsProvenance(): void
27    {
28        $trace = new DerivationTrace('flush_options');
29        $trace->expand(0, new Production([new Terminal('TABLES'), new NonTerminal('opt_table_list'), new NonTerminal('opt_flush_lock')]), 0);
30        $trace->expand(1, new Production([]), 0);
31        $trace->expand(1, new Production([new Terminal('FOR_SYM'), new Terminal('EXPORT')]), 1);
32        $input = $trace->terminals();
33        $result = (new FlushExportRule())->rewrite($input);
34        self::assertSame(['TABLES', 'IDENT_QUOTED', 'FOR_SYM', 'EXPORT'], $result->names());
35        self::assertTrue($result->terminals[1]->within('opt_table_list'));
36        self::assertSame($input->original, $result->original);
37        self::assertCount(count($result->terminals), array_unique(array_map(static fn ($terminal): int => $terminal->id, $result->terminals)));
38    }
39
40    public function testRewriteLeavesGlobalReadLocksValidWithoutTables(): void
41    {
42        $trace = new DerivationTrace('flush_options');
43        $trace->expand(0, new Production([new Terminal('TABLES'), new NonTerminal('opt_table_list'), new NonTerminal('opt_flush_lock')]), 0);
44        $trace->expand(1, new Production([]), 0);
45        $trace->expand(1, new Production([new Terminal('WITH'), new Terminal('READ_SYM'), new Terminal('LOCK_SYM')]), 0);
46        $input = $trace->terminals();
47        self::assertSame($input, (new FlushExportRule())->rewrite($input));
48    }
49}
50