Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit1fa277b

Browse files
committed
[Uid] enhance MockUuidFactory to support randomBased
1 parentc307d8f commit1fa277b

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
publicfunction__construct(
2427
iterable$uuids,
25-
privatestring$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+
privateint|string$randomBasedClass = UuidV4::class,
29+
privateUuid|string|null$timeBasedNode =null,
30+
privateUuid|string|null$nameBasedNamespace =null,
3131
) {
32-
parent::__construct($defaultClass,$timeBasedClass,$nameBasedClass,$randomBasedClass,$timeBasedNode,$nameBasedNamespace);
33-
if (!is_subclass_of($this->defaultClass, Uuid::class)) {
34-
thrownew \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+
$uuidsinstanceof \Iterator =>$uuids,
37+
$uuidsinstanceof \Traversable =>new \IteratorIterator($uuids),
38+
};
3739
}
3840

3941
publicfunctioncreate():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$uuidinstanceof Uuid ?$uuid : Uuid::fromString($uuid);
50+
}
51+
52+
publicfunctionrandomBased():RandomBasedUuidFactory
53+
{
54+
returnnewclass($this->sequence,$this->randomBasedClass)extends RandomBasedUuidFactory {
55+
private\Iterator$sequence;
56+
57+
publicfunction__construct(\Iterator$sequence,string$class)
58+
{
59+
parent::__construct($class);
60+
$this->sequence =$sequence;
61+
}
62+
63+
publicfunctioncreate():UuidV4
64+
{
65+
if (!$this->sequence->valid()) {
66+
thrownew \RuntimeException('No more UUIDs in sequence.');
67+
}
68+
$uuid =$this->sequence->current();
69+
$this->sequence->next();
70+
if ($uuidinstanceof UuidV4) {
71+
return$uuid;
72+
}
73+
if (\is_string($uuid)) {
74+
return UuidV4::fromString($uuid);
75+
}
76+
thrownew \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
namespaceSymfony\Component\Uid\Tests\Factory;
1313

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

2425
class MockUuidFactoryTestextends TestCase
2526
{
26-
publicfunctiontestCreateV1()
27+
#[DataProvider('provideSequences')]
28+
publicfunctiontestCreate(iterable$sequence,array$expected)
2729
{
28-
$factory =newMockUuidFactory([
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 =newMockUuidFactory($sequence);
31+
foreach ($expectedas$expectedUuid) {
32+
$this->assertEquals($expectedUuid,$factory->create());
33+
}
3534
}
3635

37-
publicfunctiontestCreateV3()
36+
publicstaticfunctionprovideSequences():\Generator
3837
{
39-
$factory =newMockUuidFactory([
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-
publicfunctiontestCreateV4()
84+
publicfunctiontestExhaustedSequence()
4985
{
50-
$factory =newMockUuidFactory([
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-
publicfunctiontestCreateV5()
60-
{
6189
$factory =newMockUuidFactory([
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-
publicfunctiontestCreateV6()
99+
publicfunctiontestRandomBasedReturnsUuidV4FromSequence()
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 =newMockUuidFactory([
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-
publicfunctiontestCreateV7()
116+
publicfunctiontestRandomBasedThrowsWhenSequenceIsEmpty()
82117
{
83-
$factory =newMockUuidFactory([
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-
publicfunctiontestCreateV8()
93-
{
121+
$uuid1 = UuidV4::fromString('6ba7b810-9dad-41d1-80b4-00c04fd430c8');
122+
$uuid2 ='3d813cbb-47fb-4f2e-8c1a-6b5f9e8f1e3b';
94123
$factory =newMockUuidFactory([
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-
publicfunctiontestExhaustedSequence()
134+
publicfunctiontestRandomBasedThrowsOnInvalidType()
104135
{
105-
$this->expectException(\RuntimeException::class);
106-
$this->expectExceptionMessage('No more UUIDs in sequence');
107-
108136
$factory =newMockUuidFactory([
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-
publicfunctiontestInvalidDefaultClass()
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-
newMockUuidFactory([],'stdClass');
147+
$randomFactory->create();
122148
}
123149
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp