packages/sql-faker/tests/Unit/Generation/Value/SequenceDomainTest.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(SequenceDomain::class)]
18#[UsesClass(CharacterDomain::class)]
19#[UsesClass(IntegerDomain::class)]
20#[UsesClass(ChoiceDomain::class)]
21#[UsesClass(ValueChoices::class)]
22#[UsesClass(ValueDomain::class)]
23final class SequenceDomainTest extends TestCase
24{
25    public function testChooseConstructsAProductWithoutEnumeratingItsMembers(): void
26    {
27        $domain = new SequenceDomain(new IntegerDomain('0', '18446744073709551615', 0), new CharacterDomain(['.'], 1, 1), new CharacterDomain(['9'], 30, 30));
28        $visits = 0;
29        $value = $domain->choose(static function (int $count) use (&$visits): int {
30            ++$visits;
31            return $count - 1;
32        });
33        self::assertSame('18446744073709551615.' . str_repeat('9', 30), $value);
34        self::assertLessThan(60, $visits);
35        self::assertSame('', (new SequenceDomain())->choose(static fn (int $count): int => 0));
36    }
37
38    public function testMatchRetainsAmbiguousPrefixesUntilTheSuffixResolvesThem(): void
39    {
40        $domain = new SequenceDomain(new CharacterDomain(['a'], 1, 3), new CharacterDomain(['a'], 1, 1));
41        self::assertSame([2, 3], $domain->match('aaa!'));
42        self::assertSame([], $domain->match('a!'));
43        self::assertSame([2], (new SequenceDomain())->match('xx', 2));
44    }
45}
46