packages/sql-faker/tests/Unit/MySql/Generation/Lexeme/KeywordLexemeGeneratorTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\MySql\Generation\Lexeme;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use SqlFaker\Generation\Exception\LexicalException;
11use SqlFaker\Generation\Lexeme\Lexeme;
12use SqlFaker\Generation\Lexeme\LexemeGenerator;
13use SqlFaker\Generation\Lexeme\LexemeInput;
14use SqlFaker\Generation\Lexeme\OutputPart;
15use SqlFaker\Generation\Lexeme\ResolvedOutput;
16use SqlFaker\Generation\Token\TerminalOccurrence;
17use SqlFaker\Generation\Token\TerminalSequence;
18use SqlFaker\MySql\Generation\Lexeme\KeywordLexemeGenerator;
19
20#[CoversClass(KeywordLexemeGenerator::class)]
21#[UsesClass(Lexeme::class)]
22#[UsesClass(LexemeGenerator::class)]
23#[UsesClass(LexemeInput::class)]
24#[UsesClass(LexicalException::class)]
25#[UsesClass(OutputPart::class)]
26#[UsesClass(ResolvedOutput::class)]
27#[UsesClass(TerminalOccurrence::class)]
28#[UsesClass(TerminalSequence::class)]
29#[UsesClass(\SqlFaker\Generation\Lexeme\LexemeCandidates::class)]
30#[UsesClass(\SqlFaker\Generation\Lexeme\LexemeSequence::class)]
31#[UsesClass(\SqlFaker\Generation\Lexeme\SpacingConstraint::class)]
32#[UsesClass(\SqlFaker\Generation\Token\ProductionOccurrence::class)]
33final class KeywordLexemeGeneratorTest extends TestCase
34{
35    public function testGenerateSeparatesFunctionUseFromIdentifierUse(): void
36    {
37        $generator = new KeywordLexemeGenerator([], ['NOW_SYM' => ['NOW']]);
38        $sequence = TerminalSequence::fromNames(['NOW_SYM', '(']);
39        $right = new ResolvedOutput([new OutputPart(new Lexeme('(', 'symbol', $sequence->terminals[1], 'source'), '', 'open')]);
40        $function = $generator->generate(new LexemeInput($sequence, 0, $right));
41        self::assertNotNull($function);
42        self::assertSame('function', [...$function->sequences()][0]->lexemes[0]->kind);
43        $identifier = new TerminalOccurrence('NOW_SYM', 0, [1], ['ident']);
44        $name = $generator->generate(new LexemeInput(new TerminalSequence([$identifier]), 0, $right));
45        self::assertNotNull($name);
46        self::assertSame('identifier', [...$name->sequences()][0]->lexemes[0]->kind);
47    }
48
49    public function testGenerateLeavesUndeclaredTerminalsUnclaimed(): void
50    {
51        $generator = new KeywordLexemeGenerator([], []);
52        self::assertNull($generator->generate(new LexemeInput(TerminalSequence::fromNames(['UNKNOWN']), 0, new ResolvedOutput())));
53    }
54}
55