packages/sql-faker/tests/Unit/Generation/Candidate/FixedLexemeGeneratorTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\Generation\Candidate;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use SqlFaker\Generation\Candidate\FixedLexemeGenerator;
11use SqlFaker\Generation\Lexeme\LexemeGenerator;
12use SqlFaker\Generation\Lexeme\LexemeInput;
13use SqlFaker\Generation\Lexeme\ResolvedOutput;
14use SqlFaker\Generation\Token\TerminalSequence;
15
16#[CoversClass(FixedLexemeGenerator::class)]
17#[UsesClass(LexemeGenerator::class)]
18#[UsesClass(LexemeInput::class)]
19#[UsesClass(ResolvedOutput::class)]
20#[UsesClass(TerminalSequence::class)]
21#[UsesClass(\SqlFaker\Generation\Lexeme\LexemeCandidates::class)]
22#[UsesClass(\SqlFaker\Generation\Lexeme\LexemeSequence::class)]
23#[UsesClass(\SqlFaker\Generation\Token\TerminalOccurrence::class)]
24#[UsesClass(\SqlFaker\Generation\Lexeme\Lexeme::class)]
25#[UsesClass(\SqlFaker\Generation\Lexeme\SpacingConstraint::class)]
26#[UsesClass(\SqlFaker\Generation\Token\ProductionOccurrence::class)]
27final class FixedLexemeGeneratorTest extends TestCase
28{
29 public function testGeneratePreservesTheTerminalOccurrenceAndSourceForCompoundPhrases(): void
30 {
31 $input = new LexemeInput(TerminalSequence::fromNames(['WITH_ROLLUP']), 0, new ResolvedOutput());
32 $candidate = [...(new FixedLexemeGenerator('WITH', 'keyword', 'lexer:phrase', 'rollup'))->generate($input)->sequences()][0];
33 self::assertSame('WITH', $candidate->lexemes[0]->text);
34 self::assertSame($input->terminal(), $candidate->lexemes[0]->origin);
35 self::assertSame('rollup', $candidate->lexemes[0]->phrase);
36 self::assertSame('lexer:phrase', $candidate->lexemes[0]->definition);
37 }
38
39 public function testGenerateRepresentsAnEmptyMarkerAsOneCandidateWithNoLexemes(): void
40 {
41 $input = new LexemeInput(TerminalSequence::fromNames(['EOF']), 0, new ResolvedOutput());
42 $candidates = [...(new FixedLexemeGenerator('', 'marker', 'lexer:eof'))->generate($input)->sequences()];
43 self::assertCount(1, $candidates);
44 self::assertSame([], $candidates[0]->lexemes);
45 }
46}
47