[Uid] Add fromBase58(), fromBase32(), fromRfc4122() and fromBinary()

This commit is contained in:
Thomas Calvet 2021-01-15 13:41:08 +01:00 committed by Nicolas Grekas
parent 4818b282f7
commit c01ec7d462
4 changed files with 245 additions and 0 deletions

View File

@ -37,6 +37,62 @@ abstract class AbstractUid implements \JsonSerializable
*/
abstract public static function fromString(string $uid): self;
/**
* @return static
*
* @throws \InvalidArgumentException When the passed value is not valid
*/
public static function fromBinary(string $uid): self
{
if (16 !== \strlen($uid)) {
throw new \InvalidArgumentException('Invalid binary uid provided.');
}
return static::fromString($uid);
}
/**
* @return static
*
* @throws \InvalidArgumentException When the passed value is not valid
*/
public static function fromBase58(string $uid): self
{
if (22 !== \strlen($uid)) {
throw new \InvalidArgumentException('Invalid base-58 uid provided.');
}
return static::fromString($uid);
}
/**
* @return static
*
* @throws \InvalidArgumentException When the passed value is not valid
*/
public static function fromBase32(string $uid): self
{
if (26 !== \strlen($uid)) {
throw new \InvalidArgumentException('Invalid base-32 uid provided.');
}
return static::fromString($uid);
}
/**
* @return static
*
* @throws \InvalidArgumentException When the passed value is not valid
*/
public static function fromRfc4122(string $uid): self
{
if (36 !== \strlen($uid)) {
throw new \InvalidArgumentException('Invalid RFC4122 uid provided.');
}
return static::fromString($uid);
}
/**
* Returns the identifier as a raw binary string.
*/

View File

@ -1,6 +1,11 @@
CHANGELOG
=========
5.3
---
* Add `AbstractUid::fromBinary()`, `AbstractUid::fromBase58()`, `AbstractUid::fromBase32()` and `AbstractUid::fromRfc4122()`
5.2.0
-----

View File

@ -118,4 +118,96 @@ class UlidTest extends TestCase
$this->assertLessThan(0, $b->compare($c));
$this->assertGreaterThan(0, $c->compare($b));
}
public function testFromBinary()
{
$this->assertEquals(
Ulid::fromString("\x01\x77\x05\x8F\x4D\xAC\xD0\xB2\xA9\x90\xA4\x9A\xF0\x2B\xC0\x08"),
Ulid::fromBinary("\x01\x77\x05\x8F\x4D\xAC\xD0\xB2\xA9\x90\xA4\x9A\xF0\x2B\xC0\x08")
);
foreach ([
'01EW2RYKDCT2SAK454KBR2QG08',
'1BVXue8CnY8ogucrHX3TeF',
'0177058f-4dac-d0b2-a990-a49af02bc008',
] as $ulid) {
try {
Ulid::fromBinary($ulid);
$this->fail();
} catch (\Throwable $e) {
}
$this->assertInstanceOf(\InvalidArgumentException::class, $e);
}
}
public function testFromBase58()
{
$this->assertEquals(
Ulid::fromString('1BVXue8CnY8ogucrHX3TeF'),
Ulid::fromBase58('1BVXue8CnY8ogucrHX3TeF')
);
foreach ([
"\x01\x77\x05\x8F\x4D\xAC\xD0\xB2\xA9\x90\xA4\x9A\xF0\x2B\xC0\x08",
'01EW2RYKDCT2SAK454KBR2QG08',
'0177058f-4dac-d0b2-a990-a49af02bc008',
] as $ulid) {
try {
Ulid::fromBase58($ulid);
$this->fail();
} catch (\Throwable $e) {
}
$this->assertInstanceOf(\InvalidArgumentException::class, $e);
}
}
public function testFromBase32()
{
$this->assertEquals(
Ulid::fromString('01EW2RYKDCT2SAK454KBR2QG08'),
Ulid::fromBase32('01EW2RYKDCT2SAK454KBR2QG08')
);
foreach ([
"\x01\x77\x05\x8F\x4D\xAC\xD0\xB2\xA9\x90\xA4\x9A\xF0\x2B\xC0\x08",
'1BVXue8CnY8ogucrHX3TeF',
'0177058f-4dac-d0b2-a990-a49af02bc008',
] as $ulid) {
try {
Ulid::fromBase32($ulid);
$this->fail();
} catch (\Throwable $e) {
}
$this->assertInstanceOf(\InvalidArgumentException::class, $e);
}
}
public function testFromRfc4122()
{
$this->assertEquals(
Ulid::fromString('0177058f-4dac-d0b2-a990-a49af02bc008'),
Ulid::fromRfc4122('0177058f-4dac-d0b2-a990-a49af02bc008')
);
foreach ([
"\x01\x77\x05\x8F\x4D\xAC\xD0\xB2\xA9\x90\xA4\x9A\xF0\x2B\xC0\x08",
'01EW2RYKDCT2SAK454KBR2QG08',
'1BVXue8CnY8ogucrHX3TeF',
] as $ulid) {
try {
Ulid::fromRfc4122($ulid);
$this->fail();
} catch (\Throwable $e) {
}
$this->assertInstanceOf(\InvalidArgumentException::class, $e);
}
}
}

View File

@ -193,4 +193,96 @@ class UuidTest extends TestCase
$this->assertInstanceOf(NilUuid::class, $uuid);
$this->assertSame('00000000-0000-0000-0000-000000000000', (string) $uuid);
}
public function testFromBinary()
{
$this->assertEquals(
Uuid::fromString("\x01\x77\x05\x8F\x4D\xAC\xD0\xB2\xA9\x90\xA4\x9A\xF0\x2B\xC0\x08"),
Uuid::fromBinary("\x01\x77\x05\x8F\x4D\xAC\xD0\xB2\xA9\x90\xA4\x9A\xF0\x2B\xC0\x08")
);
foreach ([
'01EW2RYKDCT2SAK454KBR2QG08',
'1BVXue8CnY8ogucrHX3TeF',
'0177058f-4dac-d0b2-a990-a49af02bc008',
] as $ulid) {
try {
Uuid::fromBinary($ulid);
$this->fail();
} catch (\Throwable $e) {
}
$this->assertInstanceOf(\InvalidArgumentException::class, $e);
}
}
public function testFromBase58()
{
$this->assertEquals(
UuidV1::fromString('94fSqj9oxGtsNbkfQNntwx'),
UuidV1::fromBase58('94fSqj9oxGtsNbkfQNntwx')
);
foreach ([
"\x41\x4C\x08\x92\x57\x1B\x11\xEB\xBF\x70\x93\xF9\xB0\x82\x2C\x57",
'219G494NRV27NVYW4KZ6R84B2Q',
'414c0892-571b-11eb-bf70-93f9b0822c57',
] as $ulid) {
try {
UuidV1::fromBase58($ulid);
$this->fail();
} catch (\Throwable $e) {
}
$this->assertInstanceOf(\InvalidArgumentException::class, $e);
}
}
public function testFromBase32()
{
$this->assertEquals(
UuidV5::fromString('2VN0S74HBDBB0AQRXAHFVG35KK'),
UuidV5::fromBase32('2VN0S74HBDBB0AQRXAHFVG35KK')
);
foreach ([
"\x5B\xA8\x32\x72\x45\x6D\x5A\xC0\xAB\xE3\xAA\x8B\xF7\x01\x96\x73",
'CKTRYycTes6WAqSQJsTDaz',
'5ba83272-456d-5ac0-abe3-aa8bf7019673',
] as $ulid) {
try {
Ulid::fromBase32($ulid);
$this->fail();
} catch (\Throwable $e) {
}
$this->assertInstanceOf(\InvalidArgumentException::class, $e);
}
}
public function testFromRfc4122()
{
$this->assertEquals(
UuidV6::fromString('1eb571b4-14c0-6893-bf70-2d4c83cf755a'),
UuidV6::fromRfc4122('1eb571b4-14c0-6893-bf70-2d4c83cf755a')
);
foreach ([
"\x1E\xB5\x71\xB4\x14\xC0\x68\x93\xBF\x70\x2D\x4C\x83\xCF\x75\x5A",
'0YPNRV8560D29VYW1D9J1WYXAT',
'4nwTLZ2TdMtTVDE5AwVjaR',
] as $ulid) {
try {
Ulid::fromRfc4122($ulid);
$this->fail();
} catch (\Throwable $e) {
}
$this->assertInstanceOf(\InvalidArgumentException::class, $e);
}
}
}