packages/sql-faker/tests/Unit/Generation/Value/ValueDomainTest.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(ValueDomain::class)]
18#[UsesClass(CharacterDomain::class)]
19#[UsesClass(IntegerDomain::class)]
20#[UsesClass(SequenceDomain::class)]
21#[UsesClass(ChoiceDomain::class)]
22#[UsesClass(ValueChoices::class)]
23final class ValueDomainTest extends TestCase
24{
25    public function testChooseUsesTheSameContractForLeavesAndComposites(): void
26    {
27        $leaf = new CharacterDomain(['a'], 1, 1);
28        $composite = new SequenceDomain($leaf, new ChoiceDomain($leaf));
29        self::assertSame('aa', $composite->choose(static fn (int $count): int => 0));
30    }
31
32    public function testMatchConsumesLeavesAndCompositeDomainsThroughOneContract(): void
33    {
34        $domain = new SequenceDomain(new CharacterDomain(['a'], 1, 2), new CharacterDomain(['b'], 1, 2));
35        self::assertSame([3, 4], $domain->match('aabb'));
36    }
37}
38