packages/sql-faker/tests/Unit/Sqlite/Generation/Lexeme/LexicalDefinitionTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\Sqlite\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\Output\CombinedSpacingRule;
12use SqlFaker\Generation\Output\SqlSerializer;
13use SqlFaker\Generation\Token\TerminalSequence;
14use SqlFaker\Sqlite\Generation\Lexeme\LexicalDefinition;
15
16#[CoversClass(LexicalDefinition::class)]
17#[UsesClass(FixedLexemeGenerator::class)]
18#[UsesClass(SqlSerializer::class)]
19#[UsesClass(CombinedSpacingRule::class)]
20#[UsesClass(TerminalSequence::class)]
21#[UsesClass(\SqlFaker\Generation\Lexeme\Lexeme::class)]
22#[UsesClass(\SqlFaker\Generation\Lexeme\LexemeCandidates::class)]
23#[UsesClass(\SqlFaker\Generation\Lexeme\LexemeInput::class)]
24#[UsesClass(\SqlFaker\Generation\Lexeme\LexemeSequence::class)]
25#[UsesClass(\SqlFaker\Generation\Output\BoundaryCompletion::class)]
26#[UsesClass(\SqlFaker\Generation\Output\CandidateResolver::class)]
27#[UsesClass(\SqlFaker\Generation\Lexeme\OutputPart::class)]
28#[UsesClass(\SqlFaker\Generation\Lexeme\ResolvedOutput::class)]
29#[UsesClass(\SqlFaker\Generation\Output\ReverseLexemeGenerator::class)]
30#[UsesClass(\SqlFaker\Generation\Lexeme\SpacingConstraint::class)]
31#[UsesClass(\SqlFaker\Generation\Token\TerminalOccurrence::class)]
32final class LexicalDefinitionTest extends TestCase
33{
34 public function testCompositionProducesOutputAndKeepsItsDiagnosticMetadata(): void
35 {
36 $lexemes = new FixedLexemeGenerator('SELECT', 'keyword', 'scanner:select');
37 $definition = new LexicalDefinition(
38 'demo-1',
39 'Demo',
40 $lexemes,
41 new CombinedSpacingRule(),
42 ['SELECT' => ['SELECT']],
43 );
44 $output = $definition->pipeline->generate(TerminalSequence::fromNames(['SELECT']), null, static fn (int $count): int => 0);
45
46 self::assertSame('SELECT', (new SqlSerializer())->serialize($output->pieces()));
47 self::assertSame($lexemes, $definition->lexemes);
48 self::assertSame(['SELECT' => ['SELECT']], $definition->keywords);
49 }
50}
51