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