mirror of
https://github.com/ramsey/uuid.git
synced 2026-06-14 15:56:48 +03:00
205 lines
7.2 KiB
PHP
205 lines
7.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Ramsey\Uuid\Test\Generator;
|
|
|
|
use DateTimeImmutable;
|
|
use Mockery;
|
|
use Mockery\MockInterface;
|
|
use Ramsey\Uuid\Generator\RandomBytesGenerator;
|
|
use Ramsey\Uuid\Generator\RandomGeneratorInterface;
|
|
use Ramsey\Uuid\Generator\UnixTimeGenerator;
|
|
use Ramsey\Uuid\Test\TestCase;
|
|
|
|
class UnixTimeGeneratorTest extends TestCase
|
|
{
|
|
/**
|
|
* @runInSeparateProcess since values are stored statically on the class
|
|
* @preserveGlobalState disabled
|
|
*/
|
|
public function testGenerate(): void
|
|
{
|
|
$dateTime = new DateTimeImmutable('@1578612359.521023');
|
|
$expectedBytes = "\x01\x6f\x8c\xa1\x01\x61\x03\x00\xff\x00\xff\x00\xff\x00\xff\x00";
|
|
|
|
/** @var RandomGeneratorInterface&MockInterface $randomGenerator */
|
|
$randomGenerator = Mockery::mock(RandomGeneratorInterface::class);
|
|
$randomGenerator->expects()->generate(16)->andReturns(
|
|
"\xff\x00\xff\x00\xff\x00\xff\x00\xff\x00\xff\x00\xff\x00\xff\x00",
|
|
);
|
|
|
|
$unixTimeGenerator = new UnixTimeGenerator($randomGenerator);
|
|
|
|
$bytes = $unixTimeGenerator->generate(null, null, $dateTime);
|
|
|
|
$this->assertSame($expectedBytes, $bytes);
|
|
}
|
|
|
|
/**
|
|
* @runInSeparateProcess since values are stored statically on the class
|
|
* @preserveGlobalState disabled
|
|
*/
|
|
public function testGenerateProducesMonotonicResults(): void
|
|
{
|
|
$randomGenerator = new RandomBytesGenerator();
|
|
$unixTimeGenerator = new UnixTimeGenerator($randomGenerator);
|
|
|
|
$previous = '';
|
|
for ($i = 0; $i < 25; $i++) {
|
|
$bytes = $unixTimeGenerator->generate();
|
|
$this->assertTrue($bytes > $previous);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @runInSeparateProcess since values are stored statically on the class
|
|
* @preserveGlobalState disabled
|
|
*/
|
|
public function testGenerateProducesMonotonicResultsWithSameDate(): void
|
|
{
|
|
$dateTime = new DateTimeImmutable('now');
|
|
$randomGenerator = new RandomBytesGenerator();
|
|
$unixTimeGenerator = new UnixTimeGenerator($randomGenerator);
|
|
|
|
$previous = '';
|
|
for ($i = 0; $i < 25; $i++) {
|
|
$bytes = $unixTimeGenerator->generate(null, null, $dateTime);
|
|
$this->assertTrue($bytes > $previous);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @runInSeparateProcess since values are stored statically on the class
|
|
* @preserveGlobalState disabled
|
|
*/
|
|
public function testGenerateProducesMonotonicResultsFor32BitPath(): void
|
|
{
|
|
$randomGenerator = new RandomBytesGenerator();
|
|
$unixTimeGenerator = new UnixTimeGenerator($randomGenerator, 4);
|
|
|
|
$previous = '';
|
|
for ($i = 0; $i < 25; $i++) {
|
|
$bytes = $unixTimeGenerator->generate();
|
|
$this->assertTrue($bytes > $previous);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @runInSeparateProcess since values are stored statically on the class
|
|
* @preserveGlobalState disabled
|
|
*/
|
|
public function testGenerateProducesMonotonicResultsWithSameDateFor32BitPath(): void
|
|
{
|
|
$dateTime = new DateTimeImmutable('now');
|
|
$randomGenerator = new RandomBytesGenerator();
|
|
$unixTimeGenerator = new UnixTimeGenerator($randomGenerator, 4);
|
|
|
|
$previous = '';
|
|
for ($i = 0; $i < 25; $i++) {
|
|
$bytes = $unixTimeGenerator->generate(null, null, $dateTime);
|
|
$this->assertTrue($bytes > $previous);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @runInSeparateProcess since values are stored statically on the class
|
|
* @preserveGlobalState disabled
|
|
*/
|
|
public function testGenerateProducesMonotonicResultsStartingWithAllBitsSet(): void
|
|
{
|
|
/** @var RandomGeneratorInterface&MockInterface $randomGenerator */
|
|
$randomGenerator = Mockery::mock(RandomGeneratorInterface::class);
|
|
$randomGenerator->expects()->generate(16)->andReturns(
|
|
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",
|
|
);
|
|
$randomGenerator->expects()->generate(10)->times(24)->andReturns(
|
|
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",
|
|
);
|
|
|
|
$unixTimeGenerator = new UnixTimeGenerator($randomGenerator);
|
|
|
|
$previous = '';
|
|
for ($i = 0; $i < 25; $i++) {
|
|
$bytes = $unixTimeGenerator->generate();
|
|
$this->assertTrue($bytes > $previous);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @runInSeparateProcess since values are stored statically on the class
|
|
* @preserveGlobalState disabled
|
|
*/
|
|
public function testGenerateProducesMonotonicResultsStartingWithAllBitsSetWithSameDate(): void
|
|
{
|
|
$dateTime = new DateTimeImmutable('now');
|
|
|
|
/** @var RandomGeneratorInterface&MockInterface $randomGenerator */
|
|
$randomGenerator = Mockery::mock(RandomGeneratorInterface::class);
|
|
$randomGenerator->expects()->generate(16)->andReturns(
|
|
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",
|
|
);
|
|
$randomGenerator->expects()->generate(10)->times(24)->andReturns(
|
|
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",
|
|
);
|
|
|
|
$unixTimeGenerator = new UnixTimeGenerator($randomGenerator);
|
|
|
|
$previous = '';
|
|
for ($i = 0; $i < 25; $i++) {
|
|
$bytes = $unixTimeGenerator->generate(null, null, $dateTime);
|
|
$this->assertTrue($bytes > $previous);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @runInSeparateProcess since values are stored statically on the class
|
|
* @preserveGlobalState disabled
|
|
*/
|
|
public function testGenerateProducesMonotonicResultsStartingWithAllBitsSetFor32BitPath(): void
|
|
{
|
|
/** @var RandomGeneratorInterface&MockInterface $randomGenerator */
|
|
$randomGenerator = Mockery::mock(RandomGeneratorInterface::class);
|
|
$randomGenerator->expects()->generate(16)->andReturns(
|
|
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",
|
|
);
|
|
$randomGenerator->expects()->generate(10)->times(24)->andReturns(
|
|
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",
|
|
);
|
|
|
|
$unixTimeGenerator = new UnixTimeGenerator($randomGenerator, 4);
|
|
|
|
$previous = '';
|
|
for ($i = 0; $i < 25; $i++) {
|
|
$bytes = $unixTimeGenerator->generate();
|
|
$this->assertTrue($bytes > $previous);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @runInSeparateProcess since values are stored statically on the class
|
|
* @preserveGlobalState disabled
|
|
*/
|
|
public function testGenerateProducesMonotonicResultsStartingWithAllBitsSetWithSameDateFor32BitPath(): void
|
|
{
|
|
$dateTime = new DateTimeImmutable('now');
|
|
|
|
/** @var RandomGeneratorInterface&MockInterface $randomGenerator */
|
|
$randomGenerator = Mockery::mock(RandomGeneratorInterface::class);
|
|
$randomGenerator->expects()->generate(16)->andReturns(
|
|
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",
|
|
);
|
|
$randomGenerator->expects()->generate(10)->times(24)->andReturns(
|
|
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",
|
|
);
|
|
|
|
$unixTimeGenerator = new UnixTimeGenerator($randomGenerator, 4);
|
|
|
|
$previous = '';
|
|
for ($i = 0; $i < 25; $i++) {
|
|
$bytes = $unixTimeGenerator->generate(null, null, $dateTime);
|
|
$this->assertTrue($bytes > $previous);
|
|
}
|
|
}
|
|
}
|