packages/sql-faker/tests/Unit/Generation/Candidate/ValueLexemeGeneratorTest.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\ValueLexemeGenerator;
11use SqlFaker\Generation\Lexeme\LexemeGenerator;
12use SqlFaker\Generation\Lexeme\LexemeInput;
13use SqlFaker\Generation\Lexeme\LexemeSequence;
14use SqlFaker\Generation\Lexeme\ResolvedOutput;
15use SqlFaker\Generation\Token\TerminalSequence;
16
17#[CoversClass(ValueLexemeGenerator::class)]
18#[UsesClass(LexemeGenerator::class)]
19#[UsesClass(LexemeInput::class)]
20#[UsesClass(ResolvedOutput::class)]
21#[UsesClass(TerminalSequence::class)]
22#[UsesClass(\SqlFaker\Generation\Lexeme\Lexeme::class)]
23#[UsesClass(\SqlFaker\Generation\Lexeme\LexemeCandidates::class)]
24#[UsesClass(LexemeSequence::class)]
25#[UsesClass(\SqlFaker\Generation\Token\TerminalOccurrence::class)]
26#[UsesClass(\SqlFaker\Generation\Lexeme\SpacingConstraint::class)]
27#[UsesClass(\SqlFaker\Generation\Token\ProductionOccurrence::class)]
28#[UsesClass(\SqlFaker\Generation\Value\CharacterDomain::class)]
29final class ValueLexemeGeneratorTest extends TestCase
30{
31 public function testGenerateAcceptsExplicitValuesBeyondDefaultRepresentatives(): void
32 {
33 $generator = new ValueLexemeGenerator('NUMBER', new \SqlFaker\Generation\Value\CharacterDomain(str_split('0123456789'), 1, 20), ['1'], 'number', 'scanner:digits');
34 $input = new LexemeInput(TerminalSequence::fromNames(['NUMBER']), 0, new ResolvedOutput(), '983');
35 $result = $generator->generate($input);
36 self::assertNotNull($result);
37 $candidate = [...$result->sequences()][0];
38 self::assertSame('983', $candidate->lexemes[0]->text);
39 self::assertSame($input->terminal(), $candidate->lexemes[0]->origin);
40 }
41
42 public function testGenerateRejectsAnInvalidValueWithoutFallingBackToADefault(): void
43 {
44 $generator = new ValueLexemeGenerator('NUMBER', new \SqlFaker\Generation\Value\CharacterDomain(str_split('0123456789'), 1, 20), ['1'], 'number', 'scanner:digits');
45 $input = new LexemeInput(TerminalSequence::fromNames(['NUMBER']), 0, new ResolvedOutput(), '12x');
46 $result = $generator->generate($input);
47 self::assertNotNull($result);
48 self::assertSame([], [...$result->sequences()]);
49 self::assertNull($generator->generate(new LexemeInput(TerminalSequence::fromNames(['STRING']), 0, new ResolvedOutput())));
50 }
51
52}
53