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