packages/sql-faker/tests/Unit/Generation/Value/ChoiceDomainTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\Generation\Value;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use SqlFaker\Generation\Value\CharacterDomain;
11use SqlFaker\Generation\Value\ChoiceDomain;
12use SqlFaker\Generation\Value\IntegerDomain;
13use SqlFaker\Generation\Value\SequenceDomain;
14use SqlFaker\Generation\Value\ValueChoices;
15use SqlFaker\Generation\Value\ValueDomain;
16
17#[CoversClass(ChoiceDomain::class)]
18#[UsesClass(CharacterDomain::class)]
19#[UsesClass(IntegerDomain::class)]
20#[UsesClass(SequenceDomain::class)]
21#[UsesClass(ValueChoices::class)]
22#[UsesClass(ValueDomain::class)]
23final class ChoiceDomainTest extends TestCase
24{
25 public function testChooseReachesEachDeclaredForm(): void
26 {
27 $domain = new ChoiceDomain(new CharacterDomain(['0'], 1, 1, '0x'), new CharacterDomain(['f'], 2, 2, "X'", "'"));
28 self::assertSame('0x0', $domain->choose(static fn (int $count): int => 0));
29 self::assertSame("X'ff'", $domain->choose(static fn (int $count): int => $count - 1));
30 }
31
32 public function testMatchUnionsAndDeduplicatesAlternativeEndPositions(): void
33 {
34 $domain = new ChoiceDomain(new CharacterDomain(['a'], 1, 2), new CharacterDomain(['a'], 1, 1));
35 self::assertSame([2, 3], $domain->match('!aa?', 1));
36 self::assertSame([], $domain->match('b'));
37 }
38}
39