packages/sql-faker/tests/Unit/PostgreSql/Generation/Lexeme/HashBoundLexemeGeneratorTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\PostgreSql\Generation\Lexeme;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use SqlFaker\Generation\Lexeme\Lexeme;
11use SqlFaker\Generation\Lexeme\LexemeGenerator;
12use SqlFaker\Generation\Lexeme\LexemeInput;
13use SqlFaker\Generation\Lexeme\OutputPart;
14use SqlFaker\Generation\Lexeme\ResolvedOutput;
15use SqlFaker\Generation\Token\TerminalOccurrence;
16use SqlFaker\Generation\Token\TerminalSequence;
17use SqlFaker\PostgreSql\Generation\Lexeme\HashBoundLexemeGenerator;
18
19#[CoversClass(HashBoundLexemeGenerator::class)]
20#[UsesClass(Lexeme::class)]
21#[UsesClass(LexemeGenerator::class)]
22#[UsesClass(LexemeInput::class)]
23#[UsesClass(OutputPart::class)]
24#[UsesClass(ResolvedOutput::class)]
25#[UsesClass(TerminalOccurrence::class)]
26#[UsesClass(TerminalSequence::class)]
27#[UsesClass(\SqlFaker\Generation\Lexeme\LexemeCandidates::class)]
28#[UsesClass(\SqlFaker\Generation\Lexeme\LexemeSequence::class)]
29#[UsesClass(\SqlFaker\Generation\Lexeme\SpacingConstraint::class)]
30#[UsesClass(\SqlFaker\Generation\Token\ProductionOccurrence::class)]
31final class HashBoundLexemeGeneratorTest extends TestCase
32{
33    public function testGenerateMakesBothOrdersReachableAndRejectsRepeatedNames(): void
34    {
35        $left = new TerminalOccurrence('HASH_BOUND_NAME', 1, [0], ['PartitionBoundSpec']);
36        $right = new TerminalOccurrence('HASH_BOUND_NAME', 2, [0], ['PartitionBoundSpec']);
37        $sequence = new TerminalSequence([$left, $right]);
38        $generator = new HashBoundLexemeGenerator();
39        $last = $generator->generate(new LexemeInput($sequence, 1, new ResolvedOutput()));
40        self::assertNotNull($last);
41        self::assertCount(2, [...$last->sequences()]);
42        $suffix = new ResolvedOutput([new OutputPart(new Lexeme('modulus', 'identifier', $right, 'source'), '', 'chosen')]);
43        $first = $generator->generate(new LexemeInput($sequence, 0, $suffix));
44        self::assertNotNull($first);
45        self::assertSame('remainder', [...$first->sequences()][0]->lexemes[0]->text);
46        $invalid = $generator->generate(new LexemeInput($sequence, 0, $suffix, 'modulus'));
47        self::assertNotNull($invalid);
48        self::assertSame([], [...$invalid->sequences()]);
49    }
50}
51