diff --git a/src/Identifiers/Random.php b/src/Identifiers/Random.php new file mode 100644 index 0000000..b7cfc58 --- /dev/null +++ b/src/Identifiers/Random.php @@ -0,0 +1,119 @@ + $conditionClosure) { + if ($conditionClosure($format)) { + return (string)$normalizedFormat; + } + } + + return $format; + } + + private static function getNormalizers () : array { + /** + * => + */ + + return [ + + 'A' => function ($format) : bool { + return ctype_upper($format); + }, + + 'a' => function ($format) : bool { + return ctype_lower($format); + }, + + '1' => function ($format) : bool { + return is_numeric($format); + }, + + ]; + } + + private static function getPickers () : array { + return [ + + 'A' => function () : string { + return Random::pickLetter(); + }, + + 'a' => function () : string { + return strtolower(Random::pickLetter()); + }, + + '1' => function () : string { + return (string)Random::pickDigit(); + }, + + ]; + } + + public static function pickLetter () : string { + $asciiCode = 65 + mt_rand() % 26; + + return chr($asciiCode); + } + + public static function pickDigit (int $base = 10) : int { + return mt_rand() % $base; + } + + private static function getPicker (string $format) : Closure { + $pickers = self::getPickers(); + + if (isset($pickers[$format])) { + return $pickers[$format]; + } + + throw new InvalidArgumentException(); + } + +} diff --git a/src/Identifiers/UUID.php b/src/Identifiers/UUID.php index 578d534..dd842d2 100644 --- a/src/Identifiers/UUID.php +++ b/src/Identifiers/UUID.php @@ -1,39 +1,43 @@ assertEquals( + 32, strlen($hash), + "$hash size must be 32 characters" + ); + + $this->assertRegExp("/[0-9a-f]{32}/", $hash); + } + + public function testHexadecimalHashesAreUnique() : void { + $this->assertNotEquals( + Random::generateHexHash(), + Random::generateHexHash() + ); + } + + /** + * @dataProvider provideRandomStringFormats + */ + public function testRandomString($format, $re, $len) : void { + $string = Random::generateString($format); + + $this->assertEquals($len, strlen($format)); + $this->assertRegExp($re, $string); + } + + public function provideRandomStringFormats() : iterable { + yield ["AAA111", "/^[A-Z]{3}[0-9]{3}$/", 6]; + yield ["AAA123", "/^[A-Z]{3}[0-9]{3}$/", 6]; + yield ["ABC123", "/^[A-Z]{3}[0-9]{3}$/", 6]; + yield ["", "/^$/", 0]; + } + +} diff --git a/tests/Identifiers/UUIDTest.php b/tests/Identifiers/UUIDTest.php index 35d5241..1a81ad1 100644 --- a/tests/Identifiers/UUIDTest.php +++ b/tests/Identifiers/UUIDTest.php @@ -1,27 +1,39 @@ assertEquals( 36, strlen($uuid), "UUID size must be 36 characters." ); $re = "/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/"; $this->assertRegExp($re, $uuid); } + public function testUUIDv4WithoutHyphens () : void { + $uuid = UUID::UUIDv4WithoutHyphens(); + + $this->assertEquals( + 32, strlen($uuid), + "UUID size must be 36 characters, and there are 4 hyphens, so here 32 characters are expected." + ); + + $re = "/[0-9a-f]/"; + $this->assertRegExp($re, $uuid); + } + public function testUUIDv4AreUnique () : void { $this->assertNotEquals(UUID::UUIDv4(), UUID::UUIDv4()); } }