123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- <?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);
- }
- }
- }
|