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