packages/sql-faker/tests/Unit/PostgreSql/Generation/Rewrite/PublicationObjectRuleTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\PostgreSql\Generation\Rewrite;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use SqlFaker\Generation\Derivation\DerivationTrace;
11use SqlFaker\Generation\Token\TerminalSequence;
12use SqlFaker\Grammar\Model\NonTerminal;
13use SqlFaker\Grammar\Model\Production;
14use SqlFaker\Grammar\Model\Terminal;
15use SqlFaker\PostgreSql\Generation\Rewrite\PublicationObjectRule;
16
17#[CoversClass(PublicationObjectRule::class)]
18#[UsesClass(DerivationTrace::class)]
19#[UsesClass(NonTerminal::class)]
20#[UsesClass(Production::class)]
21#[UsesClass(Terminal::class)]
22#[UsesClass(TerminalSequence::class)]
23#[UsesClass(\SqlFaker\Generation\Token\ProductionOccurrence::class)]
24#[UsesClass(\SqlFaker\Generation\Token\TerminalOccurrence::class)]
25final class PublicationObjectRuleTest extends TestCase
26{
27 public function testRewriteCompletesTheFirstImplicitObjectAndPreservesContinuation(): void
28 {
29 $trace = new DerivationTrace('pub_obj_list');
30 $trace->expand(0, new Production([new NonTerminal('PublicationObjSpec'), new Terminal(','), new NonTerminal('PublicationObjSpec')]), 1);
31 $trace->expand(0, new Production([new Terminal('IDENT')]), 0);
32 $trace->expand(2, new Production([new Terminal('IDENT')]), 0);
33 $input = $trace->terminals();
34 $result = (new PublicationObjectRule())->rewrite($input);
35 self::assertSame(['TABLE', 'IDENT', ',', 'IDENT'], $result->names());
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 testKindRecognizesCurrentSchemaAndInheritsAnUnqualifiedName(): void
41 {
42 $trace = new DerivationTrace('PublicationObjSpec');
43 $trace->expand(0, new Production([new Terminal('CURRENT_SCHEMA')]), 0);
44 $rule = new PublicationObjectRule();
45 self::assertSame('TABLES', $rule->kind($trace->terminals(), 0, 'TABLE'));
46 self::assertSame('TABLES', $rule->kind(TerminalSequence::fromNames(['IDENT']), 0, 'TABLES'));
47 }
48}
49