packages/sql-faker/tests/Unit/MySql/Generation/Rewrite/InstanceActionRuleTest.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\InstanceActionRule;
15
16#[CoversClass(InstanceActionRule::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 InstanceActionRuleTest extends TestCase
25{
26    public function testRewriteRecognizesTheTwoCheckedRedoNamesButLeavesReloadChannelsAlone(): void
27    {
28        $trace = new DerivationTrace('alter_instance_action');
29        $trace->expand(0, new Production([new Terminal('ENABLE_SYM'), new NonTerminal('ident'), new NonTerminal('ident')]), 5);
30        $trace->expand(1, new Production([new Terminal('IDENT')]), 0);
31        $trace->expand(2, new Production([new Terminal('IDENT')]), 0);
32        $input = $trace->terminals();
33        self::assertSame(['ENABLE_SYM', 'REDO_ENGINE', 'REDO_LOG_NAME'], (new InstanceActionRule())->rewrite($input)->names());
34        $reload = $input->replace(0, 1, [$input->terminals[0]->replaced('RELOAD', 'test')], 'test');
35        self::assertSame($reload, (new InstanceActionRule())->rewrite($reload));
36    }
37
38    public function testRewriteResolvesTheMasterKeyEngineAsAContextualDomain(): void
39    {
40        $trace = new DerivationTrace('alter_instance_action');
41        $trace->expand(0, new Production([new Terminal('ROTATE_SYM'), new NonTerminal('ident_or_text'), new Terminal('MASTER_SYM'), new Terminal('KEY_SYM')]), 0);
42        $trace->expand(1, new Production([new Terminal('LEX_HOSTNAME')]), 1);
43        self::assertSame(['ROTATE_SYM', 'ROTATE_KEY_ENGINE', 'MASTER_SYM', 'KEY_SYM'], (new InstanceActionRule())->rewrite($trace->terminals())->names());
44    }
45}
46