packages/sql-faker/tests/Unit/Generation/Candidate/ValueLexemeGeneratorTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\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 testGenerateOffersOnlyTheDefaultRepresentativesWhenNoValueIsRequested(): void
43 {
44 $generator = new ValueLexemeGenerator('NUMBER', new \SqlFaker\Generation\Value\CharacterDomain(str_split('0123456789'), 1, 20), ['1', '0', '2'], 'number', 'scanner:digits');
45 $result = $generator->generate(new LexemeInput(TerminalSequence::fromNames(['NUMBER']), 0, new ResolvedOutput()));
46 self::assertNotNull($result);
47 self::assertSame(
48 ['1', '0', '2'],
49 array_map(static fn ($candidate): string => $candidate->lexemes[0]->text, [...$result->sequences()]),
50 );
51 }
52
53 public function testGenerateRejectsAnInvalidValueWithoutFallingBackToADefault(): void
54 {
55 $generator = new ValueLexemeGenerator('NUMBER', new \SqlFaker\Generation\Value\CharacterDomain(str_split('0123456789'), 1, 20), ['1'], 'number', 'scanner:digits');
56 $input = new LexemeInput(TerminalSequence::fromNames(['NUMBER']), 0, new ResolvedOutput(), '12x');
57 $result = $generator->generate($input);
58 self::assertNotNull($result);
59 self::assertSame([], [...$result->sequences()]);
60 self::assertNull($generator->generate(new LexemeInput(TerminalSequence::fromNames(['STRING']), 0, new ResolvedOutput())));
61 }
62
63}
64