Skip to content

Commit 1074c35

Browse files
committed
[Uid] refactor MockUuidFactory to inherit from UuidFactory and keep API consistent
1 parent 6bb8585 commit 1074c35

File tree

4 files changed

+61
-147
lines changed

4 files changed

+61
-147
lines changed

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

Lines changed: 21 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -12,67 +12,43 @@
1212
namespace Symfony\Component\Uid\Factory;
1313

1414
use Symfony\Component\Uid\Uuid;
15-
use Symfony\Component\Uid\UuidV1;
16-
use Symfony\Component\Uid\UuidV3;
1715
use Symfony\Component\Uid\UuidV4;
1816
use Symfony\Component\Uid\UuidV5;
1917
use Symfony\Component\Uid\UuidV6;
20-
use Symfony\Component\Uid\UuidV7;
21-
use Symfony\Component\Uid\UuidV8;
2218

23-
class MockUuidFactory implements UuidFactoryInterface
19+
class MockUuidFactory extends UuidFactory
2420
{
2521
private \Iterator $sequence;
2622

27-
public function __construct(iterable $uuids)
28-
{
23+
public function __construct(
24+
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,
31+
) {
32+
parent::__construct($defaultClass, $timeBasedClass, $nameBasedClass, $randomBasedClass, $timeBasedNode, $nameBasedNamespace);
33+
$this->validateDefaultClass($defaultClass);
2934
$this->sequence = \is_array($uuids) ? new \ArrayIterator($uuids) : new \IteratorIterator($uuids);
3035
}
3136

32-
public function v1(): UuidV1
33-
{
34-
return UuidV1::fromString($this->getNextUuid());
35-
}
36-
37-
public function v3(Uuid $namespace, string $name): UuidV3
38-
{
39-
return UuidV3::fromString($this->getNextUuid());
40-
}
41-
42-
public function v4(): UuidV4
43-
{
44-
return UuidV4::fromString($this->getNextUuid());
45-
}
46-
47-
public function v5(Uuid $namespace, string $name): UuidV5
48-
{
49-
return UuidV5::fromString($this->getNextUuid());
50-
}
51-
52-
public function v6(): UuidV6
53-
{
54-
return UuidV6::fromString($this->getNextUuid());
55-
}
56-
57-
public function v7(): UuidV7
58-
{
59-
return UuidV7::fromString($this->getNextUuid());
60-
}
61-
62-
public function v8(string $uuid): UuidV8
63-
{
64-
return UuidV8::fromString($this->getNextUuid());
65-
}
66-
67-
private function getNextUuid(): string
37+
public function create(): Uuid
6838
{
6939
if (!$this->sequence->valid()) {
7040
throw new \RuntimeException('No more UUIDs in sequence.');
7141
}
72-
7342
$uuid = $this->sequence->current();
7443
$this->sequence->next();
7544

76-
return $uuid;
45+
return $this->defaultClass::fromString($uuid);
46+
}
47+
48+
private function validateDefaultClass(string $class): void
49+
{
50+
if (!is_subclass_of($class, Uuid::class)) {
51+
throw new \InvalidArgumentException(\sprintf('The class "%s" must be a subclass of "%s".', $class, Uuid::class));
52+
}
7753
}
7854
}

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

Lines changed: 1 addition & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,11 @@
1414
use Symfony\Component\Uid\Exception\LogicException;
1515
use Symfony\Component\Uid\Uuid;
1616
use Symfony\Component\Uid\UuidV1;
17-
use Symfony\Component\Uid\UuidV3;
1817
use Symfony\Component\Uid\UuidV4;
1918
use Symfony\Component\Uid\UuidV5;
2019
use Symfony\Component\Uid\UuidV6;
21-
use Symfony\Component\Uid\UuidV7;
22-
use Symfony\Component\Uid\UuidV8;
2320

24-
class UuidFactory implements UuidFactoryInterface
21+
class UuidFactory
2522
{
2623
private string $defaultClass;
2724
private string $timeBasedClass;
@@ -99,39 +96,4 @@ private function getNamespace(Uuid|string $namespace): Uuid
9996
default => Uuid::fromString($namespace),
10097
};
10198
}
102-
103-
public function v1(): UuidV1
104-
{
105-
return Uuid::v1();
106-
}
107-
108-
public function v3(Uuid $namespace, string $name): UuidV3
109-
{
110-
return Uuid::v3($namespace, $name);
111-
}
112-
113-
public function v4(): UuidV4
114-
{
115-
return Uuid::v4();
116-
}
117-
118-
public function v5(Uuid $namespace, string $name): UuidV5
119-
{
120-
return Uuid::v5($namespace, $name);
121-
}
122-
123-
public function v6(): UuidV6
124-
{
125-
return Uuid::v6();
126-
}
127-
128-
public function v7(): UuidV7
129-
{
130-
return Uuid::v7();
131-
}
132-
133-
public function v8(string $uuid): UuidV8
134-
{
135-
return Uuid::v8($uuid);
136-
}
13799
}

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

Lines changed: 0 additions & 38 deletions
This file was deleted.

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

Lines changed: 39 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,13 @@
1313

1414
use PHPUnit\Framework\TestCase;
1515
use Symfony\Component\Uid\Factory\MockUuidFactory;
16-
use Symfony\Component\Uid\Uuid;
16+
use Symfony\Component\Uid\UuidV1;
17+
use Symfony\Component\Uid\UuidV3;
18+
use Symfony\Component\Uid\UuidV4;
19+
use Symfony\Component\Uid\UuidV5;
20+
use Symfony\Component\Uid\UuidV6;
21+
use Symfony\Component\Uid\UuidV7;
22+
use Symfony\Component\Uid\UuidV8;
1723

1824
class MockUuidFactoryTest extends TestCase
1925
{
@@ -22,76 +28,76 @@ public function testCreateV1()
2228
$factory = new MockUuidFactory([
2329
'6ba7b810-9dad-11d1-80b4-00c04fd430c8',
2430
'6ba7b810-9dad-11d1-80b4-00c04fd430c8',
25-
]);
31+
], UuidV1::class);
2632

27-
$this->assertSame('6ba7b810-9dad-11d1-80b4-00c04fd430c8', (string) $factory->v1());
28-
$this->assertSame('6ba7b810-9dad-11d1-80b4-00c04fd430c8', (string) $factory->v1());
33+
$this->assertSame('6ba7b810-9dad-11d1-80b4-00c04fd430c8', (string) $factory->create());
34+
$this->assertSame('6ba7b810-9dad-11d1-80b4-00c04fd430c8', (string) $factory->create());
2935
}
3036

3137
public function testCreateV3()
3238
{
3339
$factory = new MockUuidFactory([
3440
'6ba7b810-9dad-31d1-80b4-00c04fd430c8',
3541
'6ba7b810-9dad-31d1-80b4-00c04fd430c8',
36-
]);
42+
], UuidV3::class);
3743

38-
$this->assertSame('6ba7b810-9dad-31d1-80b4-00c04fd430c8', (string) $factory->v3(new Uuid('00000000-0000-0000-0000-000000000000'), 'name'));
39-
$this->assertSame('6ba7b810-9dad-31d1-80b4-00c04fd430c8', (string) $factory->v3(new Uuid('00000000-0000-0000-0000-000000000000'), 'name'));
44+
$this->assertSame('6ba7b810-9dad-31d1-80b4-00c04fd430c8', (string) $factory->create());
45+
$this->assertSame('6ba7b810-9dad-31d1-80b4-00c04fd430c8', (string) $factory->create());
4046
}
4147

4248
public function testCreateV4()
4349
{
4450
$factory = new MockUuidFactory([
4551
'6ba7b810-9dad-41d1-80b4-00c04fd430c8',
4652
'6ba7b810-9dad-41d1-80b4-00c04fd430c8',
47-
]);
53+
], UuidV4::class);
4854

49-
$this->assertSame('6ba7b810-9dad-41d1-80b4-00c04fd430c8', (string) $factory->v4());
50-
$this->assertSame('6ba7b810-9dad-41d1-80b4-00c04fd430c8', (string) $factory->v4());
55+
$this->assertSame('6ba7b810-9dad-41d1-80b4-00c04fd430c8', (string) $factory->create());
56+
$this->assertSame('6ba7b810-9dad-41d1-80b4-00c04fd430c8', (string) $factory->create());
5157
}
5258

5359
public function testCreateV5()
5460
{
5561
$factory = new MockUuidFactory([
5662
'6ba7b810-9dad-51d1-80b4-00c04fd430c8',
5763
'6ba7b810-9dad-51d1-80b4-00c04fd430c8',
58-
]);
64+
], UuidV5::class);
5965

60-
$this->assertSame('6ba7b810-9dad-51d1-80b4-00c04fd430c8', (string) $factory->v5(new Uuid('00000000-0000-0000-0000-000000000000'), 'name'));
61-
$this->assertSame('6ba7b810-9dad-51d1-80b4-00c04fd430c8', (string) $factory->v5(new Uuid('00000000-0000-0000-0000-000000000000'), 'name'));
66+
$this->assertSame('6ba7b810-9dad-51d1-80b4-00c04fd430c8', (string) $factory->create());
67+
$this->assertSame('6ba7b810-9dad-51d1-80b4-00c04fd430c8', (string) $factory->create());
6268
}
6369

6470
public function testCreateV6()
6571
{
6672
$factory = new MockUuidFactory([
6773
'6ba7b810-9dad-61d1-80b4-00c04fd430c8',
6874
'6ba7b810-9dad-61d1-80b4-00c04fd430c8',
69-
]);
75+
], UuidV6::class);
7076

71-
$this->assertSame('6ba7b810-9dad-61d1-80b4-00c04fd430c8', (string) $factory->v6());
72-
$this->assertSame('6ba7b810-9dad-61d1-80b4-00c04fd430c8', (string) $factory->v6());
77+
$this->assertSame('6ba7b810-9dad-61d1-80b4-00c04fd430c8', (string) $factory->create());
78+
$this->assertSame('6ba7b810-9dad-61d1-80b4-00c04fd430c8', (string) $factory->create());
7379
}
7480

7581
public function testCreateV7()
7682
{
7783
$factory = new MockUuidFactory([
7884
'6ba7b810-9dad-71d1-80b4-00c04fd430c8',
7985
'6ba7b810-9dad-71d1-80b4-00c04fd430c8',
80-
]);
86+
], UuidV7::class);
8187

82-
$this->assertSame('6ba7b810-9dad-71d1-80b4-00c04fd430c8', (string) $factory->v7());
83-
$this->assertSame('6ba7b810-9dad-71d1-80b4-00c04fd430c8', (string) $factory->v7());
88+
$this->assertSame('6ba7b810-9dad-71d1-80b4-00c04fd430c8', (string) $factory->create());
89+
$this->assertSame('6ba7b810-9dad-71d1-80b4-00c04fd430c8', (string) $factory->create());
8490
}
8591

8692
public function testCreateV8()
8793
{
8894
$factory = new MockUuidFactory([
8995
'6ba7b810-9dad-81d1-80b4-00c04fd430c8',
9096
'6ba7b810-9dad-81d1-80b4-00c04fd430c8',
91-
]);
97+
], UuidV8::class);
9298

93-
$this->assertSame('6ba7b810-9dad-81d1-80b4-00c04fd430c8', (string) $factory->v8('6ba7b810-9dad-81d1-80b4-00c04fd430c8'));
94-
$this->assertSame('6ba7b810-9dad-81d1-80b4-00c04fd430c8', (string) $factory->v8('6ba7b810-9dad-81d1-80b4-00c04fd430c8'));
99+
$this->assertSame('6ba7b810-9dad-81d1-80b4-00c04fd430c8', (string) $factory->create());
100+
$this->assertSame('6ba7b810-9dad-81d1-80b4-00c04fd430c8', (string) $factory->create());
95101
}
96102

97103
public function testExhaustedSequence()
@@ -101,9 +107,17 @@ public function testExhaustedSequence()
101107

102108
$factory = new MockUuidFactory([
103109
'6ba7b810-9dad-11d1-80b4-00c04fd430c8',
104-
]);
110+
], UuidV1::class);
105111

106-
$factory->v1();
107-
$factory->v1();
112+
$factory->create();
113+
$factory->create();
114+
}
115+
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".');
120+
121+
new MockUuidFactory([], 'stdClass');
108122
}
109123
}

0 commit comments

Comments
 (0)