packages/sql-faker/tests/Unit/Generation/Lexeme/LexemeGeneratorTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\Generation\Lexeme;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use SqlFaker\Generation\Candidate\FixedLexemeGenerator;
11use SqlFaker\Generation\Candidate\MatchingLexemeGenerator;
12use SqlFaker\Generation\Lexeme\LexemeGenerator;
13use SqlFaker\Generation\Lexeme\LexemeInput;
14use SqlFaker\Generation\Lexeme\ResolvedOutput;
15use SqlFaker\Generation\Token\TerminalSequence;
16
17#[CoversClass(LexemeGenerator::class)]
18#[UsesClass(FixedLexemeGenerator::class)]
19#[UsesClass(LexemeInput::class)]
20#[UsesClass(MatchingLexemeGenerator::class)]
21#[UsesClass(ResolvedOutput::class)]
22#[UsesClass(TerminalSequence::class)]
23#[UsesClass(\SqlFaker\Generation\Lexeme\LexemeCandidates::class)]
24#[UsesClass(\SqlFaker\Generation\Lexeme\LexemeSequence::class)]
25#[UsesClass(\SqlFaker\Generation\Token\TerminalOccurrence::class)]
26#[UsesClass(\SqlFaker\Generation\Lexeme\Lexeme::class)]
27#[UsesClass(\SqlFaker\Generation\Lexeme\SpacingConstraint::class)]
28#[UsesClass(\SqlFaker\Generation\Token\ProductionOccurrence::class)]
29final class LexemeGeneratorTest extends TestCase
30{
31    public function testGenerateContractDistinguishesNonApplicabilityAndAnEmptyOutput(): void
32    {
33        $generator = new MatchingLexemeGenerator('END', new FixedLexemeGenerator('', 'marker', 'parser:END'));
34        $input = new LexemeInput(TerminalSequence::fromNames(['NAME']), 0, new ResolvedOutput());
35        self::assertNull($generator->generate($input));
36        $result = $generator->generate(new LexemeInput(TerminalSequence::fromNames(['END']), 0, new ResolvedOutput()));
37        self::assertNotNull($result);
38        self::assertSame([], [...$result->sequences()][0]->lexemes);
39    }
40}
41