🌐 AI搜索 & 代理 主页
Skip to content

Commit 1fa277b

Browse files
committed
[Uid] enhance MockUuidFactory to support randomBased
1 parent c307d8f commit 1fa277b

File tree

2 files changed

+139
-82
lines changed

2 files changed

+139
-82
lines changed

src/Symfony/Component/Uid/Factory/MockUuidFactory.php

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,22 @@ class MockUuidFactory extends UuidFactory
2020
{
2121
private \Iterator $sequence;
2222

23+
/**
24+
* @param iterable<string|Uuid> $uuids
25+
*/
2326
public function __construct(
2427
iterable $uuids,
25-
private string $defaultClass = UuidV6::class,
26-
string|int $timeBasedClass = UuidV6::class,
27-
string|int $nameBasedClass = UuidV5::class,
28-
string|int $randomBasedClass = UuidV4::class,
29-
Uuid|string|null $timeBasedNode = null,
30-
Uuid|string|null $nameBasedNamespace = null,
28+
private int|string $randomBasedClass = UuidV4::class,
29+
private Uuid|string|null $timeBasedNode = null,
30+
private Uuid|string|null $nameBasedNamespace = null,
3131
) {
32-
parent::__construct($defaultClass, $timeBasedClass, $nameBasedClass, $randomBasedClass, $timeBasedNode, $nameBasedNamespace);
33-
if (!is_subclass_of($this->defaultClass, Uuid::class)) {
34-
throw new \InvalidArgumentException(\sprintf('The class "%s" must be a subclass of "%s".', $this->defaultClass, Uuid::class));
35-
}
36-
$this->sequence = \is_array($uuids) ? new \ArrayIterator($uuids) : new \IteratorIterator($uuids);
32+
parent::__construct(UuidV6::class, UuidV6::class, UuidV5::class, $this->randomBasedClass, $timeBasedNode, $nameBasedNamespace);
33+
34+
$this->sequence = match (true) {
35+
\is_array($uuids) => new \ArrayIterator($uuids),
36+
$uuids instanceof \Iterator => $uuids,
37+
$uuids instanceof \Traversable => new \IteratorIterator($uuids),
38+
};
3739
}
3840

3941
public function create(): Uuid
@@ -44,6 +46,35 @@ public function create(): Uuid
4446
$uuid = $this->sequence->current();
4547
$this->sequence->next();
4648

47-
return $this->defaultClass::fromString($uuid);
49+
return $uuid instanceof Uuid ? $uuid : Uuid::fromString($uuid);
50+
}
51+
52+
public function randomBased(): RandomBasedUuidFactory
53+
{
54+
return new class($this->sequence, $this->randomBasedClass) extends RandomBasedUuidFactory {
55+
private \Iterator $sequence;
56+
57+
public function __construct(\Iterator $sequence, string $class)
58+
{
59+
parent::__construct($class);
60+
$this->sequence = $sequence;
61+
}
62+
63+
public function create(): UuidV4
64+
{
65+
if (!$this->sequence->valid()) {
66+
throw new \RuntimeException('No more UUIDs in sequence.');
67+
}
68+
$uuid = $this->sequence->current();
69+
$this->sequence->next();
70+
if ($uuid instanceof UuidV4) {
71+
return $uuid;
72+
}
73+
if (\is_string($uuid)) {
74+
return UuidV4::fromString($uuid);
75+
}
76+
throw new \RuntimeException(\sprintf('Next UUID in sequence is not a UuidV4 or string: "%s".', get_debug_type($uuid)));
77+
}
78+
};
4879
}
4980
}

src/Symfony/Component/Uid/Tests/Factory/MockUuidFactoryTest.php

Lines changed: 96 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Uid\Tests\Factory;
1313

14+
use PHPUnit\Framework\Attributes\DataProvider;
1415
use PHPUnit\Framework\TestCase;
1516
use Symfony\Component\Uid\Factory\MockUuidFactory;
1617
use Symfony\Component\Uid\UuidV1;
@@ -23,101 +24,126 @@
2324

2425
class MockUuidFactoryTest extends TestCase
2526
{
26-
public function testCreateV1()
27+
#[DataProvider('provideSequences')]
28+
public function testCreate(iterable $sequence, array $expected)
2729
{
28-
$factory = new MockUuidFactory([
29-
'6ba7b810-9dad-11d1-80b4-00c04fd430c8',
30-
'6ba7b810-9dad-11d1-80b4-00c04fd430c8',
31-
], UuidV1::class);
32-
33-
$this->assertSame('6ba7b810-9dad-11d1-80b4-00c04fd430c8', (string) $factory->create());
34-
$this->assertSame('6ba7b810-9dad-11d1-80b4-00c04fd430c8', (string) $factory->create());
30+
$factory = new MockUuidFactory($sequence);
31+
foreach ($expected as $expectedUuid) {
32+
$this->assertEquals($expectedUuid, $factory->create());
33+
}
3534
}
3635

37-
public function testCreateV3()
36+
public static function provideSequences(): \Generator
3837
{
39-
$factory = new MockUuidFactory([
40-
'6ba7b810-9dad-31d1-80b4-00c04fd430c8',
41-
'6ba7b810-9dad-31d1-80b4-00c04fd430c8',
42-
], UuidV3::class);
43-
44-
$this->assertSame('6ba7b810-9dad-31d1-80b4-00c04fd430c8', (string) $factory->create());
45-
$this->assertSame('6ba7b810-9dad-31d1-80b4-00c04fd430c8', (string) $factory->create());
38+
$uuid1String = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
39+
$uuid3String = '6ba7b810-9dad-31d1-80b4-00c04fd430c8';
40+
$uuid4String = '6ba7b810-9dad-41d1-80b4-00c04fd430c8';
41+
$uuid5String = '6ba7b810-9dad-51d1-80b4-00c04fd430c8';
42+
$uuid6String = '6ba7b810-9dad-61d1-80b4-00c04fd430c8';
43+
$uuid7String = '6ba7b810-9dad-71d1-80b4-00c04fd430c8';
44+
$uuid8String = '6ba7b810-9dad-81d1-80b4-00c04fd430c8';
45+
46+
$uuid1 = UuidV1::fromString($uuid1String);
47+
$uuid3 = UuidV3::fromString($uuid3String);
48+
$uuid4 = UuidV4::fromString($uuid4String);
49+
$uuid5 = UuidV5::fromString($uuid5String);
50+
$uuid6 = UuidV6::fromString($uuid6String);
51+
$uuid7 = UuidV7::fromString($uuid7String);
52+
$uuid8 = UuidV8::fromString($uuid8String);
53+
54+
yield 'object sequence' => [
55+
[$uuid1, $uuid3, $uuid4, $uuid5, $uuid6, $uuid7, $uuid8],
56+
[$uuid1, $uuid3, $uuid4, $uuid5, $uuid6, $uuid7, $uuid8],
57+
];
58+
yield 'string sequence' => [
59+
[
60+
$uuid1String,
61+
$uuid3String,
62+
$uuid4String,
63+
$uuid5String,
64+
$uuid6String,
65+
$uuid7String,
66+
$uuid8String,
67+
],
68+
[$uuid1, $uuid3, $uuid4, $uuid5, $uuid6, $uuid7, $uuid8],
69+
];
70+
yield 'mixed sequence' => [
71+
[
72+
$uuid1,
73+
$uuid3String,
74+
$uuid4,
75+
$uuid5String,
76+
$uuid6,
77+
$uuid7String,
78+
$uuid8,
79+
],
80+
[$uuid1, $uuid3, $uuid4, $uuid5, $uuid6, $uuid7, $uuid8],
81+
];
4682
}
4783

48-
public function testCreateV4()
84+
public function testExhaustedSequence()
4985
{
50-
$factory = new MockUuidFactory([
51-
'6ba7b810-9dad-41d1-80b4-00c04fd430c8',
52-
'6ba7b810-9dad-41d1-80b4-00c04fd430c8',
53-
], UuidV4::class);
54-
55-
$this->assertSame('6ba7b810-9dad-41d1-80b4-00c04fd430c8', (string) $factory->create());
56-
$this->assertSame('6ba7b810-9dad-41d1-80b4-00c04fd430c8', (string) $factory->create());
57-
}
86+
$this->expectException(\RuntimeException::class);
87+
$this->expectExceptionMessage('No more UUIDs in sequence');
5888

59-
public function testCreateV5()
60-
{
6189
$factory = new MockUuidFactory([
62-
'6ba7b810-9dad-51d1-80b4-00c04fd430c8',
63-
'6ba7b810-9dad-51d1-80b4-00c04fd430c8',
64-
], UuidV5::class);
90+
UuidV1::fromString('6ba7b810-9dad-11d1-80b4-00c04fd430c8'),
91+
'6ba7b810-9dad-31d1-80b4-00c04fd430c8',
92+
]);
6593

66-
$this->assertSame('6ba7b810-9dad-51d1-80b4-00c04fd430c8', (string) $factory->create());
67-
$this->assertSame('6ba7b810-9dad-51d1-80b4-00c04fd430c8', (string) $factory->create());
94+
$factory->create();
95+
$factory->create();
96+
$factory->create();
6897
}
6998

70-
public function testCreateV6()
99+
public function testRandomBasedReturnsUuidV4FromSequence()
71100
{
101+
$uuid1 = UuidV4::fromString('6ba7b810-9dad-41d1-80b4-00c04fd430c8');
102+
$uuid2 = UuidV4::fromString('9d235ae3-a819-41e3-9216-7858734f543d');
103+
$uuid3 = '3d813cbb-47fb-4f2e-8c1a-6b5f9e8f1e3b';
72104
$factory = new MockUuidFactory([
73-
'6ba7b810-9dad-61d1-80b4-00c04fd430c8',
74-
'6ba7b810-9dad-61d1-80b4-00c04fd430c8',
75-
], UuidV6::class);
76-
77-
$this->assertSame('6ba7b810-9dad-61d1-80b4-00c04fd430c8', (string) $factory->create());
78-
$this->assertSame('6ba7b810-9dad-61d1-80b4-00c04fd430c8', (string) $factory->create());
105+
$uuid1,
106+
$uuid2,
107+
$uuid3,
108+
]);
109+
$randomFactory = $factory->randomBased();
110+
111+
$this->assertSame($uuid1, $randomFactory->create());
112+
$this->assertSame($uuid2, $randomFactory->create());
113+
$this->assertEquals(UuidV4::fromString($uuid3), $randomFactory->create());
79114
}
80115

81-
public function testCreateV7()
116+
public function testRandomBasedThrowsWhenSequenceIsEmpty()
82117
{
83-
$factory = new MockUuidFactory([
84-
'6ba7b810-9dad-71d1-80b4-00c04fd430c8',
85-
'6ba7b810-9dad-71d1-80b4-00c04fd430c8',
86-
], UuidV7::class);
87-
88-
$this->assertSame('6ba7b810-9dad-71d1-80b4-00c04fd430c8', (string) $factory->create());
89-
$this->assertSame('6ba7b810-9dad-71d1-80b4-00c04fd430c8', (string) $factory->create());
90-
}
118+
$this->expectException(\RuntimeException::class);
119+
$this->expectExceptionMessage('No more UUIDs in sequence');
91120

92-
public function testCreateV8()
93-
{
121+
$uuid1 = UuidV4::fromString('6ba7b810-9dad-41d1-80b4-00c04fd430c8');
122+
$uuid2 = '3d813cbb-47fb-4f2e-8c1a-6b5f9e8f1e3b';
94123
$factory = new MockUuidFactory([
95-
'6ba7b810-9dad-81d1-80b4-00c04fd430c8',
96-
'6ba7b810-9dad-81d1-80b4-00c04fd430c8',
97-
], UuidV8::class);
98-
99-
$this->assertSame('6ba7b810-9dad-81d1-80b4-00c04fd430c8', (string) $factory->create());
100-
$this->assertSame('6ba7b810-9dad-81d1-80b4-00c04fd430c8', (string) $factory->create());
124+
$uuid1,
125+
$uuid2,
126+
]);
127+
$randomFactory = $factory->randomBased();
128+
129+
$randomFactory->create();
130+
$randomFactory->create();
131+
$randomFactory->create();
101132
}
102133

103-
public function testExhaustedSequence()
134+
public function testRandomBasedThrowsOnInvalidType()
104135
{
105-
$this->expectException(\RuntimeException::class);
106-
$this->expectExceptionMessage('No more UUIDs in sequence');
107-
108136
$factory = new MockUuidFactory([
109-
'6ba7b810-9dad-11d1-80b4-00c04fd430c8',
110-
], UuidV1::class);
137+
UuidV4::fromString('6ba7b810-9dad-41d1-80b4-00c04fd430c8'),
138+
new \stdClass(),
139+
]);
140+
$randomFactory = $factory->randomBased();
111141

112-
$factory->create();
113-
$factory->create();
114-
}
142+
$randomFactory->create();
115143

116-
public function testInvalidDefaultClass()
117-
{
118-
$this->expectException(\InvalidArgumentException::class);
119-
$this->expectExceptionMessage('The class "stdClass" must be a subclass of "Symfony\\Component\\Uid\\Uuid".');
144+
$this->expectException(\RuntimeException::class);
145+
$this->expectExceptionMessage('Next UUID in sequence is not a UuidV4 or string: "stdClass".');
120146

121-
new MockUuidFactory([], 'stdClass');
147+
$randomFactory->create();
122148
}
123149
}

0 commit comments

Comments
 (0)