123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- <?php
- declare(strict_types=1);
- namespace Ramsey\Uuid\Test\Generator;
- use Exception;
- use PHPUnit\Framework\MockObject\MockObject;
- use Ramsey\Uuid\Converter\NumberConverterInterface;
- use Ramsey\Uuid\Exception\InvalidArgumentException;
- use Ramsey\Uuid\Generator\CombGenerator;
- use Ramsey\Uuid\Generator\RandomGeneratorInterface;
- use Ramsey\Uuid\Test\TestCase;
- use function bin2hex;
- use function dechex;
- use function hex2bin;
- use function str_pad;
- use const STR_PAD_LEFT;
- class CombGeneratorTest extends TestCase
- {
- /**
- * @var int
- */
- private $timestampBytes = 6;
- public function testGenerateUsesRandomGeneratorWithLengthMinusTimestampBytes(): void
- {
- $length = 10;
- $expectedLength = $length - $this->timestampBytes;
- /** @var MockObject & RandomGeneratorInterface $randomGenerator */
- $randomGenerator = $this->getMockBuilder(RandomGeneratorInterface::class)->getMock();
- $randomGenerator->expects($this->once())
- ->method('generate')
- ->with($expectedLength);
- /** @var MockObject & NumberConverterInterface $converter */
- $converter = $this->getMockBuilder(NumberConverterInterface::class)->getMock();
- $generator = new CombGenerator($randomGenerator, $converter);
- $generator->generate($length);
- }
- public function testGenerateCalculatesPaddedHexStringFromCurrentTimestamp(): void
- {
- /** @var MockObject & RandomGeneratorInterface $randomGenerator */
- $randomGenerator = $this->getMockBuilder(RandomGeneratorInterface::class)->getMock();
- /** @var MockObject & NumberConverterInterface $converter */
- $converter = $this->getMockBuilder(NumberConverterInterface::class)->getMock();
- $converter->expects($this->once())
- ->method('toHex')
- ->with($this->isType('string'));
- $generator = new CombGenerator($randomGenerator, $converter);
- $generator->generate(10);
- }
- public function testGenerateReturnsBinaryStringCreatedFromGeneratorAndConverter(): void
- {
- $length = 20;
- $hash = dechex(1234567891);
- $timeHash = dechex(1458147405);
- /** @var MockObject & RandomGeneratorInterface $randomGenerator */
- $randomGenerator = $this->getMockBuilder(RandomGeneratorInterface::class)->getMock();
- $randomGenerator->method('generate')
- ->with($length - $this->timestampBytes)
- ->willReturn($hash);
- /** @var MockObject & NumberConverterInterface $converter */
- $converter = $this->getMockBuilder(NumberConverterInterface::class)->getMock();
- $converter->method('toHex')
- ->with($this->isType('string'))
- ->willReturn($timeHash);
- $time = str_pad($timeHash, 12, '0', STR_PAD_LEFT);
- $expected = hex2bin(str_pad(bin2hex($hash), $length - $this->timestampBytes, '0')) . hex2bin($time);
- $generator = new CombGenerator($randomGenerator, $converter);
- $returned = $generator->generate($length);
- $this->assertIsString($returned);
- $this->assertSame($expected, $returned);
- }
- /**
- * @return array<array{0: int}>
- */
- public function lengthLessThanSix(): array
- {
- return [[0], [1], [2], [3], [4], [5]];
- }
- /**
- * @param int<1, max> $length
- *
- * @throws Exception
- *
- * @dataProvider lengthLessThanSix
- */
- public function testGenerateWithLessThanTimestampBytesThrowsException(int $length): void
- {
- /** @var MockObject & RandomGeneratorInterface $randomGenerator */
- $randomGenerator = $this->getMockBuilder(RandomGeneratorInterface::class)->getMock();
- /** @var MockObject & NumberConverterInterface $converter */
- $converter = $this->getMockBuilder(NumberConverterInterface::class)->getMock();
- $generator = new CombGenerator($randomGenerator, $converter);
- $this->expectException(InvalidArgumentException::class);
- $generator->generate($length);
- }
- /**
- * @throws Exception
- */
- public function testGenerateWithOddNumberOverTimestampBytesCausesError(): void
- {
- /** @var MockObject & RandomGeneratorInterface $randomGenerator */
- $randomGenerator = $this->getMockBuilder(RandomGeneratorInterface::class)->getMock();
- /** @var MockObject & NumberConverterInterface $converter */
- $converter = $this->getMockBuilder(NumberConverterInterface::class)->getMock();
- $generator = new CombGenerator($randomGenerator, $converter);
- $this->expectError();
- $generator->generate(7);
- }
- }
|