123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690 |
- <?php
- namespace Ramsey\Uuid\Test;
- use Brick\Math\BigInteger;
- use Ramsey\Uuid\Builder\DegradedUuidBuilder;
- use Ramsey\Uuid\Codec\CodecInterface;
- use Ramsey\Uuid\Codec\OrderedTimeCodec;
- use Ramsey\Uuid\Codec\TimestampFirstCombCodec;
- use Ramsey\Uuid\Converter\Number\DegradedNumberConverter;
- use Ramsey\Uuid\Converter\Time\DegradedTimeConverter;
- use Ramsey\Uuid\Converter\TimeConverterInterface;
- use Ramsey\Uuid\DegradedUuid;
- use Ramsey\Uuid\Generator\CombGenerator;
- use Ramsey\Uuid\Generator\DefaultTimeGenerator;
- use Ramsey\Uuid\Math\BrickMathCalculator;
- use Ramsey\Uuid\Type\Hexadecimal;
- use Ramsey\Uuid\Type\Time;
- use Ramsey\Uuid\Uuid;
- use Ramsey\Uuid\UuidFactory;
- use stdClass;
- /**
- * These tests exist to ensure a seamless upgrade path from 3.x to 4.x. If any
- * of these tests fail in 4.x, then it's because we've changed functionality
- * in such a way that compatibility with 3.x is broken.
- *
- * Naturally, there are some BC-breaks between 3.x and 4.x, but these tests
- * ensure that the base-level functionality that satisfies 80% of use-cases
- * does not change. The remaining 20% of use-cases should refer to the README
- * for details on the easiest path to transition from 3.x to 4.x.
- *
- * @codingStandardsIgnoreFile
- */
- class ExpectedBehaviorTest extends TestCase
- {
- /**
- * @dataProvider provideStaticCreationMethods
- */
- public function testStaticCreationMethodsAndStandardBehavior($method, $args)
- {
- $uuid = call_user_func_array(['Ramsey\Uuid\Uuid', $method], $args);
- $this->assertInstanceOf('Ramsey\Uuid\UuidInterface', $uuid);
- $this->assertIsInt($uuid->compareTo(Uuid::uuid1()));
- $this->assertNotSame(0, $uuid->compareTo(Uuid::uuid4()));
- $this->assertSame(0, $uuid->compareTo(clone $uuid));
- $this->assertFalse($uuid->equals(new stdClass()));
- $this->assertTrue($uuid->equals(clone $uuid));
- $this->assertIsString($uuid->getBytes());
- $this->assertInstanceOf('Ramsey\Uuid\Converter\NumberConverterInterface', $uuid->getNumberConverter());
- $this->assertIsString((string) $uuid->getHex());
- $this->assertIsArray($uuid->getFieldsHex());
- $this->assertArrayHasKey('time_low', $uuid->getFieldsHex());
- $this->assertArrayHasKey('time_mid', $uuid->getFieldsHex());
- $this->assertArrayHasKey('time_hi_and_version', $uuid->getFieldsHex());
- $this->assertArrayHasKey('clock_seq_hi_and_reserved', $uuid->getFieldsHex());
- $this->assertArrayHasKey('clock_seq_low', $uuid->getFieldsHex());
- $this->assertArrayHasKey('node', $uuid->getFieldsHex());
- $this->assertIsString($uuid->getTimeLowHex());
- $this->assertIsString($uuid->getTimeMidHex());
- $this->assertIsString($uuid->getTimeHiAndVersionHex());
- $this->assertIsString($uuid->getClockSeqHiAndReservedHex());
- $this->assertIsString($uuid->getClockSeqLowHex());
- $this->assertIsString($uuid->getNodeHex());
- $this->assertSame($uuid->getFieldsHex()['time_low'], $uuid->getTimeLowHex());
- $this->assertSame($uuid->getFieldsHex()['time_mid'], $uuid->getTimeMidHex());
- $this->assertSame($uuid->getFieldsHex()['time_hi_and_version'], $uuid->getTimeHiAndVersionHex());
- $this->assertSame($uuid->getFieldsHex()['clock_seq_hi_and_reserved'], $uuid->getClockSeqHiAndReservedHex());
- $this->assertSame($uuid->getFieldsHex()['clock_seq_low'], $uuid->getClockSeqLowHex());
- $this->assertSame($uuid->getFieldsHex()['node'], $uuid->getNodeHex());
- $this->assertSame(substr((string) $uuid->getHex(), 16), $uuid->getLeastSignificantBitsHex());
- $this->assertSame(substr((string) $uuid->getHex(), 0, 16), $uuid->getMostSignificantBitsHex());
- $this->assertSame(
- (string) $uuid->getHex(),
- $uuid->getTimeLowHex()
- . $uuid->getTimeMidHex()
- . $uuid->getTimeHiAndVersionHex()
- . $uuid->getClockSeqHiAndReservedHex()
- . $uuid->getClockSeqLowHex()
- . $uuid->getNodeHex()
- );
- $this->assertSame(
- (string) $uuid->getHex(),
- $uuid->getFieldsHex()['time_low']
- . $uuid->getFieldsHex()['time_mid']
- . $uuid->getFieldsHex()['time_hi_and_version']
- . $uuid->getFieldsHex()['clock_seq_hi_and_reserved']
- . $uuid->getFieldsHex()['clock_seq_low']
- . $uuid->getFieldsHex()['node']
- );
- $this->assertIsString($uuid->getUrn());
- $this->assertStringStartsWith('urn:uuid:', $uuid->getUrn());
- $this->assertSame('urn:uuid:' . (string) $uuid->getHex(), str_replace('-', '', $uuid->getUrn()));
- $this->assertSame((string) $uuid->getHex(), str_replace('-', '', $uuid->toString()));
- $this->assertSame((string) $uuid->getHex(), str_replace('-', '', (string) $uuid));
- $this->assertSame(
- $uuid->toString(),
- $uuid->getTimeLowHex() . '-'
- . $uuid->getTimeMidHex() . '-'
- . $uuid->getTimeHiAndVersionHex() . '-'
- . $uuid->getClockSeqHiAndReservedHex()
- . $uuid->getClockSeqLowHex() . '-'
- . $uuid->getNodeHex()
- );
- $this->assertSame(
- (string) $uuid,
- $uuid->getTimeLowHex() . '-'
- . $uuid->getTimeMidHex() . '-'
- . $uuid->getTimeHiAndVersionHex() . '-'
- . $uuid->getClockSeqHiAndReservedHex()
- . $uuid->getClockSeqLowHex() . '-'
- . $uuid->getNodeHex()
- );
- $this->assertSame(2, $uuid->getVariant());
- $this->assertSame((int) substr($method, -1), $uuid->getVersion());
- $this->assertSame(1, preg_match('/^\d+$/', (string) $uuid->getInteger()));
- }
- public function provideStaticCreationMethods()
- {
- return [
- ['uuid1', []],
- ['uuid1', ['00000fffffff']],
- ['uuid1', [null, 1234]],
- ['uuid1', ['00000fffffff', 1234]],
- ['uuid1', ['00000fffffff', null]],
- ['uuid1', [268435455]],
- ['uuid1', [268435455, 1234]],
- ['uuid1', [268435455, null]],
- ['uuid3', [Uuid::NAMESPACE_URL, 'https://example.com/foo']],
- ['uuid4', []],
- ['uuid5', [Uuid::NAMESPACE_URL, 'https://example.com/foo']],
- ];
- }
- public function testUuidVersion1MethodBehavior()
- {
- $uuid = Uuid::uuid1('00000fffffff', 0xffff);
- $this->assertInstanceOf('DateTimeInterface', $uuid->getDateTime());
- $this->assertSame('00000fffffff', $uuid->getNodeHex());
- $this->assertSame('3fff', $uuid->getClockSequenceHex());
- $this->assertSame('16383', (string) $uuid->getClockSequence());
- }
- public function testUuidVersion1MethodBehavior64Bit()
- {
- $uuid = Uuid::uuid1('ffffffffffff', 0xffff);
- $this->assertInstanceOf('DateTimeInterface', $uuid->getDateTime());
- $this->assertSame('ffffffffffff', $uuid->getNodeHex());
- $this->assertSame('281474976710655', (string) $uuid->getNode());
- $this->assertSame('3fff', $uuid->getClockSequenceHex());
- $this->assertSame('16383', (string) $uuid->getClockSequence());
- $this->assertSame(1, preg_match('/^\d+$/', (string) $uuid->getTimestamp()));
- }
- /**
- * @dataProvider provideIsValid
- */
- public function testIsValid($uuid, $expected)
- {
- $this->assertSame($expected, Uuid::isValid($uuid), "{$uuid} is not a valid UUID");
- $this->assertSame($expected, Uuid::isValid(strtoupper($uuid)), strtoupper($uuid) . ' is not a valid UUID');
- }
- public function provideIsValid()
- {
- return [
- // RFC 4122 UUIDs
- ['00000000-0000-0000-0000-000000000000', true],
- ['ff6f8cb0-c57d-11e1-8b21-0800200c9a66', true],
- ['ff6f8cb0-c57d-11e1-9b21-0800200c9a66', true],
- ['ff6f8cb0-c57d-11e1-ab21-0800200c9a66', true],
- ['ff6f8cb0-c57d-11e1-bb21-0800200c9a66', true],
- ['ff6f8cb0-c57d-21e1-8b21-0800200c9a66', true],
- ['ff6f8cb0-c57d-21e1-9b21-0800200c9a66', true],
- ['ff6f8cb0-c57d-21e1-ab21-0800200c9a66', true],
- ['ff6f8cb0-c57d-21e1-bb21-0800200c9a66', true],
- ['ff6f8cb0-c57d-31e1-8b21-0800200c9a66', true],
- ['ff6f8cb0-c57d-31e1-9b21-0800200c9a66', true],
- ['ff6f8cb0-c57d-31e1-ab21-0800200c9a66', true],
- ['ff6f8cb0-c57d-31e1-bb21-0800200c9a66', true],
- ['ff6f8cb0-c57d-41e1-8b21-0800200c9a66', true],
- ['ff6f8cb0-c57d-41e1-9b21-0800200c9a66', true],
- ['ff6f8cb0-c57d-41e1-ab21-0800200c9a66', true],
- ['ff6f8cb0-c57d-41e1-bb21-0800200c9a66', true],
- ['ff6f8cb0-c57d-51e1-8b21-0800200c9a66', true],
- ['ff6f8cb0-c57d-51e1-9b21-0800200c9a66', true],
- ['ff6f8cb0-c57d-51e1-ab21-0800200c9a66', true],
- ['ff6f8cb0-c57d-51e1-bb21-0800200c9a66', true],
- // Non RFC 4122 UUIDs
- ['ffffffff-ffff-ffff-ffff-ffffffffffff', true],
- ['00000000-0000-0000-0000-000000000000', true],
- ['ff6f8cb0-c57d-01e1-0b21-0800200c9a66', true],
- ['ff6f8cb0-c57d-01e1-1b21-0800200c9a66', true],
- ['ff6f8cb0-c57d-01e1-2b21-0800200c9a66', true],
- ['ff6f8cb0-c57d-01e1-3b21-0800200c9a66', true],
- ['ff6f8cb0-c57d-01e1-4b21-0800200c9a66', true],
- ['ff6f8cb0-c57d-01e1-5b21-0800200c9a66', true],
- ['ff6f8cb0-c57d-01e1-6b21-0800200c9a66', true],
- ['ff6f8cb0-c57d-01e1-7b21-0800200c9a66', true],
- ['ff6f8cb0-c57d-01e1-db21-0800200c9a66', true],
- ['ff6f8cb0-c57d-01e1-eb21-0800200c9a66', true],
- ['ff6f8cb0-c57d-01e1-fb21-0800200c9a66', true],
- // Other valid patterns
- ['{ff6f8cb0-c57d-01e1-fb21-0800200c9a66}', true],
- ['urn:uuid:ff6f8cb0-c57d-01e1-fb21-0800200c9a66', true],
- // Invalid UUIDs
- ['ffffffffffffffffffffffffffffffff', false],
- ['00000000000000000000000000000000', false],
- [0, false],
- ['foobar', false],
- ['ff6f8cb0c57d51e1bb210800200c9a66', false],
- ['gf6f8cb0-c57d-51e1-bb21-0800200c9a66', false],
- ];
- }
- /**
- * @dataProvider provideFromStringInteger
- */
- public function testSerialization($string)
- {
- $uuid = Uuid::fromString($string);
- $serialized = serialize($uuid);
- $unserialized = unserialize($serialized);
- $this->assertSame(0, $uuid->compareTo($unserialized));
- $this->assertTrue($uuid->equals($unserialized));
- $this->assertSame("\"{$string}\"", json_encode($uuid));
- }
- /**
- * @dataProvider provideFromStringInteger
- */
- public function testSerializationWithOrderedTimeCodec($string)
- {
- $factory = new UuidFactory();
- $factory->setCodec(new OrderedTimeCodec(
- $factory->getUuidBuilder()
- ));
- $previousFactory = Uuid::getFactory();
- Uuid::setFactory($factory);
- $uuid = Uuid::fromString($string);
- $serialized = serialize($uuid);
- $unserialized = unserialize($serialized);
- Uuid::setFactory($previousFactory);
- $this->assertSame(0, $uuid->compareTo($unserialized));
- $this->assertTrue($uuid->equals($unserialized));
- $this->assertSame("\"{$string}\"", json_encode($uuid));
- }
- /**
- * @dataProvider provideFromStringInteger
- */
- public function testNumericReturnValues($string)
- {
- $leastSignificantBitsHex = substr(str_replace('-', '', $string), 16);
- $mostSignificantBitsHex = substr(str_replace('-', '', $string), 0, 16);
- $leastSignificantBits = BigInteger::fromBase($leastSignificantBitsHex, 16)->__toString();
- $mostSignificantBits = BigInteger::fromBase($mostSignificantBitsHex, 16)->__toString();
- $components = explode('-', $string);
- array_walk($components, function (&$value) {
- $value = BigInteger::fromBase($value, 16)->__toString();
- });
- if (strtolower($string) === Uuid::MAX) {
- $clockSeq = (int) $components[3];
- } else {
- $clockSeq = (int) $components[3] & 0x3fff;
- }
- $clockSeqHiAndReserved = (int) $components[3] >> 8;
- $clockSeqLow = (int) $components[3] & 0x00ff;
- $uuid = Uuid::fromString($string);
- $this->assertSame($components[0], (string) $uuid->getTimeLow());
- $this->assertSame($components[1], (string) $uuid->getTimeMid());
- $this->assertSame($components[2], (string) $uuid->getTimeHiAndVersion());
- $this->assertSame((string) $clockSeq, (string) $uuid->getClockSequence());
- $this->assertSame((string) $clockSeqHiAndReserved, (string) $uuid->getClockSeqHiAndReserved());
- $this->assertSame((string) $clockSeqLow, (string) $uuid->getClockSeqLow());
- $this->assertSame($components[4], (string) $uuid->getNode());
- $this->assertSame($leastSignificantBits, (string) $uuid->getLeastSignificantBits());
- $this->assertSame($mostSignificantBits, (string) $uuid->getMostSignificantBits());
- }
- /**
- * @dataProvider provideFromStringInteger
- */
- public function testFromBytes($string, $version, $variant, $integer)
- {
- $bytes = hex2bin(str_replace('-', '', $string));
- $uuid = Uuid::fromBytes($bytes);
- $this->assertInstanceOf('Ramsey\Uuid\UuidInterface', $uuid);
- $this->assertSame($string, $uuid->toString());
- $this->assertSame($version, $uuid->getVersion());
- $this->assertSame($variant, $uuid->getVariant());
- $components = explode('-', $string);
- $this->assertSame($components[0], $uuid->getTimeLowHex());
- $this->assertSame($components[1], $uuid->getTimeMidHex());
- $this->assertSame($components[2], $uuid->getTimeHiAndVersionHex());
- $this->assertSame($components[3], $uuid->getClockSeqHiAndReservedHex() . $uuid->getClockSeqLowHex());
- $this->assertSame($components[4], $uuid->getNodeHex());
- $this->assertSame($integer, (string) $uuid->getInteger());
- $this->assertSame($bytes, $uuid->getBytes());
- }
- /**
- * @dataProvider provideFromStringInteger
- */
- public function testFromInteger($string, $version, $variant, $integer)
- {
- $bytes = hex2bin(str_replace('-', '', $string));
- $uuid = Uuid::fromInteger($integer);
- $this->assertInstanceOf('Ramsey\Uuid\UuidInterface', $uuid);
- $this->assertSame($string, $uuid->toString());
- $this->assertSame($version, $uuid->getVersion());
- $this->assertSame($variant, $uuid->getVariant());
- $components = explode('-', $string);
- $this->assertSame($components[0], $uuid->getTimeLowHex());
- $this->assertSame($components[1], $uuid->getTimeMidHex());
- $this->assertSame($components[2], $uuid->getTimeHiAndVersionHex());
- $this->assertSame($components[3], $uuid->getClockSeqHiAndReservedHex() . $uuid->getClockSeqLowHex());
- $this->assertSame($components[4], $uuid->getNodeHex());
- $this->assertSame($integer, (string) $uuid->getInteger());
- $this->assertSame($bytes, $uuid->getBytes());
- }
- /**
- * @dataProvider provideFromStringInteger
- */
- public function testFromString($string, $version, $variant, $integer)
- {
- $bytes = hex2bin(str_replace('-', '', $string));
- $uuid = Uuid::fromString($string);
- $this->assertInstanceOf('Ramsey\Uuid\UuidInterface', $uuid);
- $this->assertSame($string, $uuid->toString());
- $this->assertSame($version, $uuid->getVersion());
- $this->assertSame($variant, $uuid->getVariant());
- $components = explode('-', $string);
- $this->assertSame($components[0], $uuid->getTimeLowHex());
- $this->assertSame($components[1], $uuid->getTimeMidHex());
- $this->assertSame($components[2], $uuid->getTimeHiAndVersionHex());
- $this->assertSame($components[3], $uuid->getClockSeqHiAndReservedHex() . $uuid->getClockSeqLowHex());
- $this->assertSame($components[4], $uuid->getNodeHex());
- $this->assertSame($integer, (string) $uuid->getInteger());
- $this->assertSame($bytes, $uuid->getBytes());
- }
- public function provideFromStringInteger()
- {
- return [
- ['00000000-0000-0000-0000-000000000000', null, 2, '0'],
- ['ff6f8cb0-c57d-11e1-8b21-0800200c9a66', 1, 2, '339532337419071774304650190139318639206'],
- ['ff6f8cb0-c57d-11e1-9b21-0800200c9a66', 1, 2, '339532337419071774305803111643925486182'],
- ['ff6f8cb0-c57d-11e1-ab21-0800200c9a66', 1, 2, '339532337419071774306956033148532333158'],
- ['ff6f8cb0-c57d-11e1-bb21-0800200c9a66', 1, 2, '339532337419071774308108954653139180134'],
- ['ff6f8cb0-c57d-21e1-8b21-0800200c9a66', 2, 2, '339532337419071849862513916053642058342'],
- ['ff6f8cb0-c57d-21e1-9b21-0800200c9a66', 2, 2, '339532337419071849863666837558248905318'],
- ['ff6f8cb0-c57d-21e1-ab21-0800200c9a66', 2, 2, '339532337419071849864819759062855752294'],
- ['ff6f8cb0-c57d-21e1-bb21-0800200c9a66', 2, 2, '339532337419071849865972680567462599270'],
- ['ff6f8cb0-c57d-31e1-8b21-0800200c9a66', 3, 2, '339532337419071925420377641967965477478'],
- ['ff6f8cb0-c57d-31e1-9b21-0800200c9a66', 3, 2, '339532337419071925421530563472572324454'],
- ['ff6f8cb0-c57d-31e1-ab21-0800200c9a66', 3, 2, '339532337419071925422683484977179171430'],
- ['ff6f8cb0-c57d-31e1-bb21-0800200c9a66', 3, 2, '339532337419071925423836406481786018406'],
- ['ff6f8cb0-c57d-41e1-8b21-0800200c9a66', 4, 2, '339532337419072000978241367882288896614'],
- ['ff6f8cb0-c57d-41e1-9b21-0800200c9a66', 4, 2, '339532337419072000979394289386895743590'],
- ['ff6f8cb0-c57d-41e1-ab21-0800200c9a66', 4, 2, '339532337419072000980547210891502590566'],
- ['ff6f8cb0-c57d-41e1-bb21-0800200c9a66', 4, 2, '339532337419072000981700132396109437542'],
- ['ff6f8cb0-c57d-51e1-8b21-0800200c9a66', 5, 2, '339532337419072076536105093796612315750'],
- ['ff6f8cb0-c57d-51e1-9b21-0800200c9a66', 5, 2, '339532337419072076537258015301219162726'],
- ['ff6f8cb0-c57d-51e1-ab21-0800200c9a66', 5, 2, '339532337419072076538410936805826009702'],
- ['ff6f8cb0-c57d-51e1-bb21-0800200c9a66', 5, 2, '339532337419072076539563858310432856678'],
- ['ff6f8cb0-c57d-01e1-0b21-0800200c9a66', null, 0, '339532337419071698737563092188140444262'],
- ['ff6f8cb0-c57d-01e1-1b21-0800200c9a66', null, 0, '339532337419071698738716013692747291238'],
- ['ff6f8cb0-c57d-01e1-2b21-0800200c9a66', null, 0, '339532337419071698739868935197354138214'],
- ['ff6f8cb0-c57d-01e1-3b21-0800200c9a66', null, 0, '339532337419071698741021856701960985190'],
- ['ff6f8cb0-c57d-01e1-4b21-0800200c9a66', null, 0, '339532337419071698742174778206567832166'],
- ['ff6f8cb0-c57d-01e1-5b21-0800200c9a66', null, 0, '339532337419071698743327699711174679142'],
- ['ff6f8cb0-c57d-01e1-6b21-0800200c9a66', null, 0, '339532337419071698744480621215781526118'],
- ['ff6f8cb0-c57d-01e1-7b21-0800200c9a66', null, 0, '339532337419071698745633542720388373094'],
- ['ff6f8cb0-c57d-01e1-cb21-0800200c9a66', null, 6, '339532337419071698751398150243422607974'],
- ['ff6f8cb0-c57d-01e1-db21-0800200c9a66', null, 6, '339532337419071698752551071748029454950'],
- ['ff6f8cb0-c57d-01e1-eb21-0800200c9a66', null, 7, '339532337419071698753703993252636301926'],
- ['ff6f8cb0-c57d-01e1-fb21-0800200c9a66', null, 7, '339532337419071698754856914757243148902'],
- ['ffffffff-ffff-ffff-ffff-ffffffffffff', null, 2, '340282366920938463463374607431768211455'],
- ];
- }
- /**
- * @runInSeparateProcess
- * @preserveGlobalState disabled
- */
- public function testGetSetFactory()
- {
- $this->assertInstanceOf('Ramsey\Uuid\UuidFactory', Uuid::getFactory());
- $factory = \Mockery::mock('Ramsey\Uuid\UuidFactory');
- Uuid::setFactory($factory);
- $this->assertSame($factory, Uuid::getFactory());
- }
- /**
- * @runInSeparateProcess
- * @preserveGlobalState disabled
- */
- public function testFactoryProvidesFunctionality()
- {
- $uuid = \Mockery::mock('Ramsey\Uuid\UuidInterface');
- $factory = \Mockery::mock('Ramsey\Uuid\UuidFactoryInterface', [
- 'uuid1' => $uuid,
- 'uuid3' => $uuid,
- 'uuid4' => $uuid,
- 'uuid5' => $uuid,
- 'fromBytes' => $uuid,
- 'fromString' => $uuid,
- 'fromInteger' => $uuid,
- ]);
- Uuid::setFactory($factory);
- $this->assertSame($uuid, Uuid::uuid1('ffffffffffff', 0xffff));
- $this->assertSame($uuid, Uuid::uuid3(Uuid::NAMESPACE_URL, 'https://example.com/foo'));
- $this->assertSame($uuid, Uuid::uuid4());
- $this->assertSame($uuid, Uuid::uuid5(Uuid::NAMESPACE_URL, 'https://example.com/foo'));
- $this->assertSame($uuid, Uuid::fromBytes(hex2bin('ffffffffffffffffffffffffffffffff')));
- $this->assertSame($uuid, Uuid::fromString('ffffffff-ffff-ffff-ffff-ffffffffffff'));
- $this->assertSame($uuid, Uuid::fromInteger('340282366920938463463374607431768211455'));
- }
- /**
- * @runInSeparateProcess
- * @preserveGlobalState disabled
- */
- public function testUsingDegradedFeatures()
- {
- $numberConverter = new DegradedNumberConverter();
- $builder = new DegradedUuidBuilder($numberConverter);
- $factory = new UuidFactory();
- $factory->setNumberConverter($numberConverter);
- $factory->setUuidBuilder($builder);
- Uuid::setFactory($factory);
- $uuid = Uuid::uuid1();
- $this->assertInstanceOf('Ramsey\Uuid\UuidInterface', $uuid);
- $this->assertInstanceOf('Ramsey\Uuid\DegradedUuid', $uuid);
- $this->assertInstanceOf('Ramsey\Uuid\Converter\Number\DegradedNumberConverter', $uuid->getNumberConverter());
- }
- /**
- * @runInSeparateProcess
- * @preserveGlobalState disabled
- */
- public function testUsingCustomCodec()
- {
- $mockUuid = \Mockery::mock('Ramsey\Uuid\UuidInterface');
- $codec = \Mockery::mock('Ramsey\Uuid\Codec\CodecInterface', [
- 'encode' => 'abcd1234',
- 'encodeBinary' => hex2bin('abcd1234'),
- 'decode' => $mockUuid,
- 'decodeBytes' => $mockUuid,
- ]);
- $factory = new UuidFactory();
- $factory->setCodec($codec);
- Uuid::setFactory($factory);
- $uuid = Uuid::uuid4();
- $this->assertSame('abcd1234', $uuid->toString());
- $this->assertSame(hex2bin('abcd1234'), $uuid->getBytes());
- $this->assertSame($mockUuid, Uuid::fromString('f00ba2'));
- $this->assertSame($mockUuid, Uuid::fromBytes(hex2bin('f00ba2')));
- }
- /**
- * @runInSeparateProcess
- * @preserveGlobalState disabled
- */
- public function testUsingCustomRandomGenerator()
- {
- $generator = \Mockery::mock('Ramsey\Uuid\Generator\RandomGeneratorInterface', [
- 'generate' => hex2bin('01234567abcd5432dcba0123456789ab'),
- ]);
- $factory = new UuidFactory();
- $factory->setRandomGenerator($generator);
- Uuid::setFactory($factory);
- $uuid = Uuid::uuid4();
- $this->assertSame('01234567-abcd-4432-9cba-0123456789ab', $uuid->toString());
- }
- /**
- * @runInSeparateProcess
- * @preserveGlobalState disabled
- */
- public function testUsingCustomTimeGenerator()
- {
- $generator = \Mockery::mock('Ramsey\Uuid\Generator\TimeGeneratorInterface', [
- 'generate' => hex2bin('01234567abcd5432dcba0123456789ab'),
- ]);
- $factory = new UuidFactory();
- $factory->setTimeGenerator($generator);
- Uuid::setFactory($factory);
- $uuid = Uuid::uuid1();
- $this->assertSame('01234567-abcd-1432-9cba-0123456789ab', $uuid->toString());
- }
- /**
- * @runInSeparateProcess
- * @preserveGlobalState disabled
- */
- public function testUsingDefaultTimeGeneratorWithCustomProviders()
- {
- $nodeProvider = \Mockery::mock('Ramsey\Uuid\Provider\NodeProviderInterface', [
- 'getNode' => new Hexadecimal('0123456789ab'),
- ]);
- $timeConverter = \Mockery::mock('Ramsey\Uuid\Converter\TimeConverterInterface');
- $timeConverter
- ->shouldReceive('calculateTime')
- ->andReturnUsing(function ($seconds, $microseconds) {
- return new Hexadecimal('abcd' . dechex($microseconds) . dechex($seconds));
- });
- $timeProvider = \Mockery::mock('Ramsey\Uuid\Provider\TimeProviderInterface', [
- 'currentTime' => [
- 'sec' => 1578522046,
- 'usec' => 10000,
- ],
- 'getTime' => new Time(1578522046, 10000),
- ]);
- $generator = new DefaultTimeGenerator($nodeProvider, $timeConverter, $timeProvider);
- $factory = new UuidFactory();
- $factory->setTimeGenerator($generator);
- Uuid::setFactory($factory);
- $uuid = Uuid::uuid1(null, 4095);
- $this->assertSame('5e1655be-2710-1bcd-8fff-0123456789ab', $uuid->toString());
- }
- /**
- * @runInSeparateProcess
- * @preserveGlobalState disabled
- */
- public function testHelperFunctions()
- {
- $uuid1 = \Mockery::mock('Ramsey\Uuid\UuidInterface', [
- 'toString' => 'aVersion1Uuid',
- ]);
- $uuid3 = \Mockery::mock('Ramsey\Uuid\UuidInterface', [
- 'toString' => 'aVersion3Uuid',
- ]);
- $uuid4 = \Mockery::mock('Ramsey\Uuid\UuidInterface', [
- 'toString' => 'aVersion4Uuid',
- ]);
- $uuid5 = \Mockery::mock('Ramsey\Uuid\UuidInterface', [
- 'toString' => 'aVersion5Uuid',
- ]);
- $factory = \Mockery::mock('Ramsey\Uuid\UuidFactoryInterface', [
- 'uuid1' => $uuid1,
- 'uuid3' => $uuid3,
- 'uuid4' => $uuid4,
- 'uuid5' => $uuid5,
- ]);
- Uuid::setFactory($factory);
- $this->assertSame('aVersion1Uuid', \Ramsey\Uuid\v1('ffffffffffff', 0xffff));
- $this->assertSame('aVersion3Uuid', \Ramsey\Uuid\v3(Uuid::NAMESPACE_URL, 'https://example.com/foo'));
- $this->assertSame('aVersion4Uuid', \Ramsey\Uuid\v4());
- $this->assertSame('aVersion5Uuid', \Ramsey\Uuid\v5(Uuid::NAMESPACE_URL, 'https://example.com/foo'));
- }
- /**
- * @link https://git.io/JvJZo Use of TimestampFirstCombCodec in laravel/framework
- */
- public function testUseOfTimestampFirstCombCodec()
- {
- $factory = new UuidFactory();
- $factory->setRandomGenerator(new CombGenerator(
- $factory->getRandomGenerator(),
- $factory->getNumberConverter()
- ));
- $factory->setCodec(new TimestampFirstCombCodec(
- $factory->getUuidBuilder()
- ));
- $uuid = $factory->uuid4();
- // Swap fields according to the rules for TimestampFirstCombCodec.
- $fields = array_values($uuid->getFieldsHex());
- $last48Bits = $fields[5];
- $fields[5] = $fields[0] . $fields[1];
- $fields[0] = substr($last48Bits, 0, 8);
- $fields[1] = substr($last48Bits, 8, 4);
- $expectedHex = implode('', $fields);
- $expectedBytes = hex2bin($expectedHex);
- $this->assertInstanceOf('Ramsey\Uuid\UuidInterface', $uuid);
- $this->assertSame(2, $uuid->getVariant());
- $this->assertSame(4, $uuid->getVersion());
- $this->assertSame($expectedBytes, $uuid->getBytes());
- $this->assertSame($expectedHex, (string) $uuid->getHex());
- }
- /**
- * @dataProvider provideUuidConstantTests
- */
- public function testUuidConstants($constantName, $expected)
- {
- $this->assertSame($expected, constant("Ramsey\\Uuid\\Uuid::{$constantName}"));
- }
- public function provideUuidConstantTests()
- {
- return [
- ['NAMESPACE_DNS', '6ba7b810-9dad-11d1-80b4-00c04fd430c8'],
- ['NAMESPACE_URL', '6ba7b811-9dad-11d1-80b4-00c04fd430c8'],
- ['NAMESPACE_OID', '6ba7b812-9dad-11d1-80b4-00c04fd430c8'],
- ['NAMESPACE_X500', '6ba7b814-9dad-11d1-80b4-00c04fd430c8'],
- ['NIL', '00000000-0000-0000-0000-000000000000'],
- ['MAX', 'ffffffff-ffff-ffff-ffff-ffffffffffff'],
- ['RESERVED_NCS', 0],
- ['RFC_4122', 2],
- ['RESERVED_MICROSOFT', 6],
- ['RESERVED_FUTURE', 7],
- ['VALID_PATTERN', '^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$'],
- ['UUID_TYPE_TIME', 1],
- ['UUID_TYPE_IDENTIFIER', 2],
- ['UUID_TYPE_HASH_MD5', 3],
- ['UUID_TYPE_RANDOM', 4],
- ['UUID_TYPE_HASH_SHA1', 5],
- ['UUID_TYPE_REORDERED_TIME', 6],
- ['UUID_TYPE_UNIX_TIME', 7],
- ];
- }
- }
|