UuidFactoryTest.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. <?php
  2. declare(strict_types=1);
  3. namespace Ramsey\Uuid\Test;
  4. use DateTime;
  5. use DateTimeImmutable;
  6. use DateTimeInterface;
  7. use Mockery;
  8. use PHPUnit\Framework\MockObject\MockObject;
  9. use Ramsey\Uuid\Builder\UuidBuilderInterface;
  10. use Ramsey\Uuid\Codec\CodecInterface;
  11. use Ramsey\Uuid\Converter\NumberConverterInterface;
  12. use Ramsey\Uuid\Converter\TimeConverterInterface;
  13. use Ramsey\Uuid\FeatureSet;
  14. use Ramsey\Uuid\Generator\DceSecurityGeneratorInterface;
  15. use Ramsey\Uuid\Generator\DefaultNameGenerator;
  16. use Ramsey\Uuid\Generator\NameGeneratorInterface;
  17. use Ramsey\Uuid\Generator\RandomGeneratorInterface;
  18. use Ramsey\Uuid\Generator\TimeGeneratorInterface;
  19. use Ramsey\Uuid\Provider\NodeProviderInterface;
  20. use Ramsey\Uuid\Type\Hexadecimal;
  21. use Ramsey\Uuid\UuidFactory;
  22. use Ramsey\Uuid\Validator\ValidatorInterface;
  23. use function hex2bin;
  24. use function strtoupper;
  25. class UuidFactoryTest extends TestCase
  26. {
  27. public function testParsesUuidCorrectly(): void
  28. {
  29. $factory = new UuidFactory();
  30. $uuid = $factory->fromString('ff6f8cb0-c57d-11e1-9b21-0800200c9a66');
  31. $this->assertSame('ff6f8cb0-c57d-11e1-9b21-0800200c9a66', $uuid->toString());
  32. $this->assertSame(hex2bin('ff6f8cb0c57d11e19b210800200c9a66'), $uuid->getBytes());
  33. }
  34. public function testParsesGuidCorrectly(): void
  35. {
  36. $factory = new UuidFactory(new FeatureSet(true));
  37. $uuid = $factory->fromString('ff6f8cb0-c57d-11e1-9b21-0800200c9a66');
  38. $this->assertSame('ff6f8cb0-c57d-11e1-9b21-0800200c9a66', $uuid->toString());
  39. $this->assertSame(hex2bin('b08c6fff7dc5e1119b210800200c9a66'), $uuid->getBytes());
  40. }
  41. public function testFromStringParsesUuidInLowercase(): void
  42. {
  43. $uuidString = 'ff6f8cb0-c57d-11e1-9b21-0800200c9a66';
  44. $uuidUpper = strtoupper($uuidString);
  45. $factory = new UuidFactory(new FeatureSet(true));
  46. $uuid = $factory->fromString($uuidUpper);
  47. $this->assertSame($uuidString, $uuid->toString());
  48. }
  49. public function testGettersReturnValueFromFeatureSet(): void
  50. {
  51. $codec = Mockery::mock(CodecInterface::class);
  52. $nodeProvider = Mockery::mock(NodeProviderInterface::class);
  53. $randomGenerator = Mockery::mock(RandomGeneratorInterface::class);
  54. $timeConverter = Mockery::mock(TimeConverterInterface::class);
  55. $timeGenerator = Mockery::mock(TimeGeneratorInterface::class);
  56. $unixTimeGenerator = Mockery::mock(TimeGeneratorInterface::class);
  57. $nameGenerator = Mockery::mock(NameGeneratorInterface::class);
  58. $dceSecurityGenerator = Mockery::mock(DceSecurityGeneratorInterface::class);
  59. $numberConverter = Mockery::mock(NumberConverterInterface::class);
  60. $builder = Mockery::mock(UuidBuilderInterface::class);
  61. $validator = Mockery::mock(ValidatorInterface::class);
  62. $featureSet = Mockery::mock(FeatureSet::class, [
  63. 'getCodec' => $codec,
  64. 'getNodeProvider' => $nodeProvider,
  65. 'getRandomGenerator' => $randomGenerator,
  66. 'getTimeConverter' => $timeConverter,
  67. 'getTimeGenerator' => $timeGenerator,
  68. 'getNameGenerator' => $nameGenerator,
  69. 'getDceSecurityGenerator' => $dceSecurityGenerator,
  70. 'getNumberConverter' => $numberConverter,
  71. 'getBuilder' => $builder,
  72. 'getValidator' => $validator,
  73. 'getUnixTimeGenerator' => $unixTimeGenerator,
  74. ]);
  75. $uuidFactory = new UuidFactory($featureSet);
  76. $this->assertSame(
  77. $codec,
  78. $uuidFactory->getCodec(),
  79. 'getCodec did not return CodecInterface from FeatureSet'
  80. );
  81. $this->assertSame(
  82. $nodeProvider,
  83. $uuidFactory->getNodeProvider(),
  84. 'getNodeProvider did not return NodeProviderInterface from FeatureSet'
  85. );
  86. $this->assertSame(
  87. $randomGenerator,
  88. $uuidFactory->getRandomGenerator(),
  89. 'getRandomGenerator did not return RandomGeneratorInterface from FeatureSet'
  90. );
  91. $this->assertSame(
  92. $timeGenerator,
  93. $uuidFactory->getTimeGenerator(),
  94. 'getTimeGenerator did not return TimeGeneratorInterface from FeatureSet'
  95. );
  96. }
  97. public function testSettersSetValueForGetters(): void
  98. {
  99. $uuidFactory = new UuidFactory();
  100. /** @var MockObject & CodecInterface $codec */
  101. $codec = $this->getMockBuilder(CodecInterface::class)->getMock();
  102. $uuidFactory->setCodec($codec);
  103. $this->assertSame($codec, $uuidFactory->getCodec());
  104. /** @var MockObject & TimeGeneratorInterface $timeGenerator */
  105. $timeGenerator = $this->getMockBuilder(TimeGeneratorInterface::class)->getMock();
  106. $uuidFactory->setTimeGenerator($timeGenerator);
  107. $this->assertSame($timeGenerator, $uuidFactory->getTimeGenerator());
  108. /** @var MockObject & NumberConverterInterface $numberConverter */
  109. $numberConverter = $this->getMockBuilder(NumberConverterInterface::class)->getMock();
  110. $uuidFactory->setNumberConverter($numberConverter);
  111. $this->assertSame($numberConverter, $uuidFactory->getNumberConverter());
  112. /** @var MockObject & UuidBuilderInterface $uuidBuilder */
  113. $uuidBuilder = $this->getMockBuilder(UuidBuilderInterface::class)->getMock();
  114. $uuidFactory->setUuidBuilder($uuidBuilder);
  115. $this->assertSame($uuidBuilder, $uuidFactory->getUuidBuilder());
  116. }
  117. /**
  118. * @dataProvider provideDateTime
  119. */
  120. public function testFromDateTime(
  121. DateTimeInterface $dateTime,
  122. ?Hexadecimal $node,
  123. ?int $clockSeq,
  124. string $expectedUuidFormat,
  125. string $expectedTime
  126. ): void {
  127. $factory = new UuidFactory();
  128. $uuid = $factory->fromDateTime($dateTime, $node, $clockSeq);
  129. $this->assertStringMatchesFormat($expectedUuidFormat, $uuid->toString());
  130. $this->assertSame($expectedTime, $uuid->getDateTime()->format('U.u'));
  131. }
  132. /**
  133. * @phpcsSuppress SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingTraversableTypeHintSpecification
  134. */
  135. public function provideDateTime(): array
  136. {
  137. return [
  138. [
  139. new DateTimeImmutable('2012-07-04 02:14:34.491000'),
  140. null,
  141. null,
  142. 'ff6f8cb0-c57d-11e1-%s',
  143. '1341368074.491000',
  144. ],
  145. [
  146. new DateTimeImmutable('1582-10-16 16:34:04'),
  147. new Hexadecimal('0800200c9a66'),
  148. 15137,
  149. '0901e600-0154-1000-%cb21-0800200c9a66',
  150. '-12219146756.000000',
  151. ],
  152. [
  153. new DateTime('5236-03-31 21:20:59.999999'),
  154. new Hexadecimal('00007ffffffe'),
  155. 1641,
  156. 'ff9785f6-ffff-1fff-%c669-00007ffffffe',
  157. '103072857659.999999',
  158. ],
  159. [
  160. new DateTime('1582-10-15 00:00:00'),
  161. new Hexadecimal('00007ffffffe'),
  162. 1641,
  163. '00000000-0000-1000-%c669-00007ffffffe',
  164. '-12219292800.000000',
  165. ],
  166. [
  167. new DateTimeImmutable('@103072857660.684697'),
  168. new Hexadecimal('0'),
  169. 0,
  170. 'fffffffa-ffff-1fff-%c000-000000000000',
  171. '103072857660.684697',
  172. ],
  173. [
  174. new DateTimeImmutable('5236-03-31 21:21:00.684697'),
  175. null,
  176. null,
  177. 'fffffffa-ffff-1fff-%s',
  178. '103072857660.684697',
  179. ],
  180. ];
  181. }
  182. public function testFactoryReturnsDefaultNameGenerator(): void
  183. {
  184. $factory = new UuidFactory();
  185. $this->assertInstanceOf(DefaultNameGenerator::class, $factory->getNameGenerator());
  186. }
  187. public function testFactoryReturnsSetNameGenerator(): void
  188. {
  189. $factory = new UuidFactory();
  190. $this->assertInstanceOf(DefaultNameGenerator::class, $factory->getNameGenerator());
  191. $nameGenerator = Mockery::mock(NameGeneratorInterface::class);
  192. $factory->setNameGenerator($nameGenerator);
  193. $this->assertSame($nameGenerator, $factory->getNameGenerator());
  194. }
  195. }