[#6] Move v4 generators to UlidStruct
Moved v4 generators to UlidStruct List of Changes: Create UlidStruct.toUuid4() Create UlidStruct.toString4() Create UlidCreatorUuidTest // test cases Create UlidCreatorStringTest // test cases Add UlidUtil.extractUnixMilliseconds(UUID ulid) Add UlidUtil.extractUnixMilliseconds(String ulid)
This commit is contained in:
parent
686fec9ce8
commit
75d313c9ed
|
@ -33,7 +33,7 @@ Add these lines to your `pom.xml`.
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.f4b6a3</groupId>
|
<groupId>com.github.f4b6a3</groupId>
|
||||||
<artifactId>ulid-creator</artifactId>
|
<artifactId>ulid-creator</artifactId>
|
||||||
<version>2.3.0</version>
|
<version>2.3.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
See more options in [maven.org](https://search.maven.org/artifact/com.github.f4b6a3/ulid-creator).
|
See more options in [maven.org](https://search.maven.org/artifact/com.github.f4b6a3/ulid-creator).
|
||||||
|
|
|
@ -121,8 +121,7 @@ public class UlidSpecCreator {
|
||||||
* @return {@link UUID} a GUID value
|
* @return {@link UUID} a GUID value
|
||||||
*/
|
*/
|
||||||
public synchronized UUID create() {
|
public synchronized UUID create() {
|
||||||
final UlidStruct struct = new UlidStruct(this.getTimestamp(), random1, random2);
|
return UlidStruct.of(this.getTimestamp(), random1, random2).toUuid();
|
||||||
return struct.toUuid();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -134,7 +133,7 @@ public class UlidSpecCreator {
|
||||||
* @return {@link UUID} a GUID value
|
* @return {@link UUID} a GUID value
|
||||||
*/
|
*/
|
||||||
public synchronized UUID create4() {
|
public synchronized UUID create4() {
|
||||||
return applyVersion4(create());
|
return UlidStruct.of(this.getTimestamp(), random1, random2).toUuid4();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -148,8 +147,7 @@ public class UlidSpecCreator {
|
||||||
* @return a ULID string
|
* @return a ULID string
|
||||||
*/
|
*/
|
||||||
public synchronized String createString() {
|
public synchronized String createString() {
|
||||||
final UlidStruct struct = new UlidStruct(this.getTimestamp(), random1, random2);
|
return UlidStruct.of(this.getTimestamp(), random1, random2).toString();
|
||||||
return struct.toString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -165,9 +163,7 @@ public class UlidSpecCreator {
|
||||||
* @return a ULID string
|
* @return a ULID string
|
||||||
*/
|
*/
|
||||||
public synchronized String createString4() {
|
public synchronized String createString4() {
|
||||||
UUID uuid = applyVersion4(create());
|
return UlidStruct.of(this.getTimestamp(), random1, random2).toString4();
|
||||||
final UlidStruct struct = new UlidStruct(uuid);
|
|
||||||
return struct.toString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -275,18 +271,4 @@ public class UlidSpecCreator {
|
||||||
protected long extractRandom2(UUID uuid) {
|
protected long extractRandom2(UUID uuid) {
|
||||||
return uuid.getLeastSignificantBits() & HALF_RANDOM_COMPONENT;
|
return uuid.getLeastSignificantBits() & HALF_RANDOM_COMPONENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply the RFC-4122 version 4 to a given UUID.
|
|
||||||
*
|
|
||||||
* It makes the returning UUID compatible with RFC-4122 UUID v4.
|
|
||||||
*
|
|
||||||
* @param ulid a UUID
|
|
||||||
* @return a UUID
|
|
||||||
*/
|
|
||||||
private static UUID applyVersion4(UUID ulid) {
|
|
||||||
final long msb = (ulid.getMostSignificantBits() & 0xffffffffffff0fffL) | 0x0000000000004000L; // set version
|
|
||||||
final long lsb = (ulid.getLeastSignificantBits() & 0x3fffffffffffffffL) | 0x8000000000000000L; // set variant
|
|
||||||
return new UUID(msb, lsb);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,8 +43,7 @@ public final class UlidConverter {
|
||||||
* @return a ULID
|
* @return a ULID
|
||||||
*/
|
*/
|
||||||
public static String toString(final UUID ulid) {
|
public static String toString(final UUID ulid) {
|
||||||
UlidStruct struct = new UlidStruct(ulid);
|
return UlidStruct.of(ulid).toString();
|
||||||
return struct.toString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -60,8 +59,6 @@ public final class UlidConverter {
|
||||||
* @throws InvalidUlidException if invalid
|
* @throws InvalidUlidException if invalid
|
||||||
*/
|
*/
|
||||||
public static UUID fromString(final String ulid) {
|
public static UUID fromString(final String ulid) {
|
||||||
UlidStruct struct = new UlidStruct(ulid);
|
return UlidStruct.of(ulid).toUuid();
|
||||||
return struct.toUuid();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
package com.github.f4b6a3.ulid.util;
|
package com.github.f4b6a3.ulid.util;
|
||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
public final class UlidUtil {
|
public final class UlidUtil {
|
||||||
|
|
||||||
|
@ -37,20 +38,37 @@ public final class UlidUtil {
|
||||||
|
|
||||||
protected static final char[] ALPHABET_JAVA = "0123456789abcdefghijklmnopqrstuv011".toCharArray();
|
protected static final char[] ALPHABET_JAVA = "0123456789abcdefghijklmnopqrstuv011".toCharArray();
|
||||||
|
|
||||||
|
|
||||||
private UlidUtil() {
|
private UlidUtil() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static long extractTimestamp(String ulid) {
|
public static long extractUnixMilliseconds(UUID ulid) {
|
||||||
|
return extractTimestamp(ulid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long extractUnixMilliseconds(String ulid) {
|
||||||
UlidValidator.validate(ulid);
|
UlidValidator.validate(ulid);
|
||||||
return extractUnixMilliseconds(ulid);
|
return extractTimestamp(ulid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Instant extractInstant(UUID ulid) {
|
||||||
|
long milliseconds = extractTimestamp(ulid);
|
||||||
|
return Instant.ofEpochMilli(milliseconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Instant extractInstant(String ulid) {
|
public static Instant extractInstant(String ulid) {
|
||||||
|
UlidValidator.validate(ulid);
|
||||||
long milliseconds = extractTimestamp(ulid);
|
long milliseconds = extractTimestamp(ulid);
|
||||||
return Instant.ofEpochMilli(milliseconds);
|
return Instant.ofEpochMilli(milliseconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static long extractTimestamp(UUID ulid) {
|
||||||
|
return (ulid.getMostSignificantBits() >>> 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static long extractTimestamp(String ulid) {
|
||||||
|
return fromBase32Crockford(extractTimestampComponent(ulid).toCharArray());
|
||||||
|
}
|
||||||
|
|
||||||
public static String extractTimestampComponent(String ulid) {
|
public static String extractTimestampComponent(String ulid) {
|
||||||
UlidValidator.validate(ulid);
|
UlidValidator.validate(ulid);
|
||||||
return ulid.substring(0, 10);
|
return ulid.substring(0, 10);
|
||||||
|
@ -61,10 +79,6 @@ public final class UlidUtil {
|
||||||
return ulid.substring(10, ULID_LENGTH);
|
return ulid.substring(10, ULID_LENGTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static long extractUnixMilliseconds(String ulid) {
|
|
||||||
return fromBase32Crockford(extractTimestampComponent(ulid).toCharArray());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a number from a given array of bytes.
|
* Get a number from a given array of bytes.
|
||||||
*
|
*
|
||||||
|
|
|
@ -30,8 +30,8 @@ import static com.github.f4b6a3.ulid.util.internal.UlidStruct.BASE32_VALUES;
|
||||||
|
|
||||||
public final class UlidValidator {
|
public final class UlidValidator {
|
||||||
|
|
||||||
// Date: 10889-08-02T05:31:50.655Z (epoch time: 281474976710655)
|
// Date: 10889-08-02T05:31:50.655Z: 281474976710655 (2^48-1)
|
||||||
protected static final long TIMESTAMP_MAX = (long) Math.pow(2, 48) - 1;
|
private static final long TIMESTAMP_MAX = 0xffffffffffffL;
|
||||||
|
|
||||||
protected static final int ULID_LENGTH = 26;
|
protected static final int ULID_LENGTH = 26;
|
||||||
|
|
||||||
|
@ -74,10 +74,14 @@ public final class UlidValidator {
|
||||||
* @throws InvalidUlidException if invalid
|
* @throws InvalidUlidException if invalid
|
||||||
*/
|
*/
|
||||||
public static void validate(String ulid) {
|
public static void validate(String ulid) {
|
||||||
if (!isValid(ulid)) {
|
if(ulid != null) {
|
||||||
throw new InvalidUlidException(String.format("Invalid ULID: %s.", ulid));
|
final char[] chars = ulid.toCharArray();
|
||||||
|
if(isValidString(chars) && isValidTimestamp(chars)) {
|
||||||
|
return; // valid
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
throw new InvalidUlidException(String.format("Invalid ULID: %s.", ulid));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if the string is a valid ULID.
|
* Checks if the string is a valid ULID.
|
||||||
|
|
|
@ -118,13 +118,19 @@ public final class UlidStruct {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public UlidStruct(long time, long random1, long random2) {
|
private UlidStruct() {
|
||||||
|
this.time = 0;
|
||||||
|
this.random1 = 0;
|
||||||
|
this.random2 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private UlidStruct(long time, long random1, long random2) {
|
||||||
this.time = time & TIMESTAMP_COMPONENT;
|
this.time = time & TIMESTAMP_COMPONENT;
|
||||||
this.random1 = random1 & HALF_RANDOM_COMPONENT;
|
this.random1 = random1 & HALF_RANDOM_COMPONENT;
|
||||||
this.random2 = random2 & HALF_RANDOM_COMPONENT;
|
this.random2 = random2 & HALF_RANDOM_COMPONENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
public UlidStruct(UUID uuid) {
|
private UlidStruct(UUID uuid) {
|
||||||
final long msb = uuid.getMostSignificantBits();
|
final long msb = uuid.getMostSignificantBits();
|
||||||
final long lsb = uuid.getLeastSignificantBits();
|
final long lsb = uuid.getLeastSignificantBits();
|
||||||
|
|
||||||
|
@ -133,7 +139,7 @@ public final class UlidStruct {
|
||||||
this.random2 = (lsb & 0x000000ffffffffffL);
|
this.random2 = (lsb & 0x000000ffffffffffL);
|
||||||
}
|
}
|
||||||
|
|
||||||
public UlidStruct(String string) {
|
private UlidStruct(String string) {
|
||||||
|
|
||||||
UlidValidator.validate(string);
|
UlidValidator.validate(string);
|
||||||
|
|
||||||
|
@ -176,6 +182,18 @@ public final class UlidStruct {
|
||||||
this.random2 = r2;
|
this.random2 = r2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static UlidStruct of(long time, long random1, long random2) {
|
||||||
|
return new UlidStruct(time, random1, random2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UlidStruct of(UUID ulid) {
|
||||||
|
return new UlidStruct(ulid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UlidStruct of(String ulid) {
|
||||||
|
return new UlidStruct(ulid);
|
||||||
|
}
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
|
|
||||||
final char[] chars = new char[26];
|
final char[] chars = new char[26];
|
||||||
|
@ -212,6 +230,12 @@ public final class UlidStruct {
|
||||||
return new String(chars);
|
return new String(chars);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String toString4() {
|
||||||
|
// apply RFC-4122 version 4 and variant 2
|
||||||
|
final long newrandom1 = ((this.random1 & 0x0fff3fffffL) | 0x4000000000L) | 0x0000800000L;
|
||||||
|
return UlidStruct.of(this.time, newrandom1, this.random2).toString();
|
||||||
|
}
|
||||||
|
|
||||||
public UUID toUuid() {
|
public UUID toUuid() {
|
||||||
|
|
||||||
final long msb = (time << 16) | (random1 >>> 24);
|
final long msb = (time << 16) | (random1 >>> 24);
|
||||||
|
@ -220,6 +244,12 @@ public final class UlidStruct {
|
||||||
return new UUID(msb, lsb);
|
return new UUID(msb, lsb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public UUID toUuid4() {
|
||||||
|
// apply RFC-4122 version 4 and variant 2
|
||||||
|
final long newrandom1 = ((this.random1 & 0x0fff3fffffL) | 0x4000000000L) | 0x0000800000L;
|
||||||
|
return UlidStruct.of(this.time, newrandom1, this.random2).toUuid();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
final int prime = 31;
|
final int prime = 31;
|
||||||
|
|
|
@ -4,7 +4,8 @@ import org.junit.runner.RunWith;
|
||||||
import org.junit.runners.Suite;
|
import org.junit.runners.Suite;
|
||||||
|
|
||||||
import com.github.f4b6a3.ulid.creator.UlidSpecCreatorTest;
|
import com.github.f4b6a3.ulid.creator.UlidSpecCreatorTest;
|
||||||
import com.github.f4b6a3.ulid.ulid.UlidCreatorTest;
|
import com.github.f4b6a3.ulid.ulid.UlidCreatorUuidTest;
|
||||||
|
import com.github.f4b6a3.ulid.ulid.UlidCreatorStringTest;
|
||||||
import com.github.f4b6a3.ulid.util.UlidConverterTest;
|
import com.github.f4b6a3.ulid.util.UlidConverterTest;
|
||||||
import com.github.f4b6a3.ulid.util.UlidUtilTest;
|
import com.github.f4b6a3.ulid.util.UlidUtilTest;
|
||||||
import com.github.f4b6a3.ulid.util.UlidValidatorTest;
|
import com.github.f4b6a3.ulid.util.UlidValidatorTest;
|
||||||
|
@ -12,7 +13,8 @@ import com.github.f4b6a3.ulid.util.internal.UlidStructTest;
|
||||||
|
|
||||||
@RunWith(Suite.class)
|
@RunWith(Suite.class)
|
||||||
@Suite.SuiteClasses({
|
@Suite.SuiteClasses({
|
||||||
UlidCreatorTest.class,
|
UlidCreatorUuidTest.class,
|
||||||
|
UlidCreatorStringTest.class,
|
||||||
UlidSpecCreatorTest.class,
|
UlidSpecCreatorTest.class,
|
||||||
UlidConverterTest.class,
|
UlidConverterTest.class,
|
||||||
UlidUtilTest.class,
|
UlidUtilTest.class,
|
||||||
|
|
|
@ -12,7 +12,7 @@ import java.util.Arrays;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public class UlidCreatorTest {
|
public class UlidCreatorStringTest {
|
||||||
|
|
||||||
private static final int ULID_LENGTH = 26;
|
private static final int ULID_LENGTH = 26;
|
||||||
private static final int DEFAULT_LOOP_MAX = 100_000;
|
private static final int DEFAULT_LOOP_MAX = 100_000;
|
||||||
|
@ -79,7 +79,7 @@ public class UlidCreatorTest {
|
||||||
assertTrue("Start time was after end time", startTime <= endTime);
|
assertTrue("Start time was after end time", startTime <= endTime);
|
||||||
|
|
||||||
for (String ulid : list) {
|
for (String ulid : list) {
|
||||||
long creationTime = UlidUtil.extractTimestamp(ulid);
|
long creationTime = UlidUtil.extractUnixMilliseconds(ulid);
|
||||||
assertTrue("Creation time was before start time " + creationTime + " " + startTime,
|
assertTrue("Creation time was before start time " + creationTime + " " + startTime,
|
||||||
creationTime >= startTime);
|
creationTime >= startTime);
|
||||||
assertTrue("Creation time was after end time", creationTime <= endTime);
|
assertTrue("Creation time was after end time", creationTime <= endTime);
|
||||||
|
@ -98,7 +98,8 @@ public class UlidCreatorTest {
|
||||||
private void checkVersion4(String[] list) {
|
private void checkVersion4(String[] list) {
|
||||||
for (String ulid : list) {
|
for (String ulid : list) {
|
||||||
UUID uuid = UlidConverter.fromString(ulid);
|
UUID uuid = UlidConverter.fromString(ulid);
|
||||||
assertEquals(String.format("ULID is is not version 4 %s", uuid), 4, uuid.version());
|
assertEquals(String.format("ULID is is not RFC-4122 version 4 %s", uuid), 4, uuid.version());
|
||||||
|
assertEquals(String.format("ULID is is not RFC-4122 variant 2 %s", uuid), 2, uuid.variant());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,98 @@
|
||||||
|
package com.github.f4b6a3.ulid.ulid;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import com.github.f4b6a3.ulid.UlidCreator;
|
||||||
|
import com.github.f4b6a3.ulid.util.UlidUtil;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class UlidCreatorUuidTest {
|
||||||
|
|
||||||
|
private static final int DEFAULT_LOOP_MAX = 100_000;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetUlid() {
|
||||||
|
UUID[] list = new UUID[DEFAULT_LOOP_MAX];
|
||||||
|
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
for (int i = 0; i < DEFAULT_LOOP_MAX; i++) {
|
||||||
|
list[i] = UlidCreator.getUlid();
|
||||||
|
}
|
||||||
|
|
||||||
|
long endTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
checkNullOrInvalid(list);
|
||||||
|
checkUniqueness(list);
|
||||||
|
checkOrdering(list);
|
||||||
|
checkCreationTime(list, startTime, endTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetUlid4() {
|
||||||
|
UUID[] list = new UUID[DEFAULT_LOOP_MAX];
|
||||||
|
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
for (int i = 0; i < DEFAULT_LOOP_MAX; i++) {
|
||||||
|
list[i] = UlidCreator.getUlid4();
|
||||||
|
}
|
||||||
|
|
||||||
|
long endTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
checkNullOrInvalid(list);
|
||||||
|
checkUniqueness(list);
|
||||||
|
checkOrdering(list);
|
||||||
|
checkCreationTime(list, startTime, endTime);
|
||||||
|
checkVersion4(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkNullOrInvalid(UUID[] list) {
|
||||||
|
for (UUID ulid : list) {
|
||||||
|
assertNotNull("ULID is null", ulid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkUniqueness(UUID[] list) {
|
||||||
|
|
||||||
|
HashSet<UUID> set = new HashSet<>();
|
||||||
|
|
||||||
|
for (UUID ulid : list) {
|
||||||
|
assertTrue(String.format("ULID is duplicated %s", ulid), set.add(ulid));
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEquals("There are duplicated ULIDs", set.size(), list.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkCreationTime(UUID[] list, long startTime, long endTime) {
|
||||||
|
|
||||||
|
assertTrue("Start time was after end time", startTime <= endTime);
|
||||||
|
|
||||||
|
for (UUID ulid : list) {
|
||||||
|
long creationTime = UlidUtil.extractUnixMilliseconds(ulid);
|
||||||
|
assertTrue("Creation time was before start time " + creationTime + " " + startTime,
|
||||||
|
creationTime >= startTime);
|
||||||
|
assertTrue("Creation time was after end time", creationTime <= endTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkOrdering(UUID[] list) {
|
||||||
|
UUID[] other = Arrays.copyOf(list, list.length);
|
||||||
|
Arrays.sort(other);
|
||||||
|
|
||||||
|
for (int i = 0; i < list.length; i++) {
|
||||||
|
assertEquals("The ULID list is not ordered", list[i], other[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkVersion4(UUID[] list) {
|
||||||
|
for (UUID uuid : list) {
|
||||||
|
assertEquals(String.format("ULID is is not RFC-4122 version 4 %s", uuid), 4, uuid.version());
|
||||||
|
assertEquals(String.format("ULID is is not RFC-4122 variant 2 %s", uuid), 2, uuid.variant());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -45,10 +45,10 @@ public class UlidConverterTest {
|
||||||
final long time = random.nextLong();
|
final long time = random.nextLong();
|
||||||
final long random1 = random.nextLong();
|
final long random1 = random.nextLong();
|
||||||
final long random2 = random.nextLong();
|
final long random2 = random.nextLong();
|
||||||
UlidStruct struct0 = new UlidStruct(time, random1, random2);
|
UlidStruct struct0 = UlidStruct.of(time, random1, random2);
|
||||||
|
|
||||||
String string1 = struct0.toString();
|
String string1 = struct0.toString();
|
||||||
UlidStruct struct1 = new UlidStruct(string1);
|
UlidStruct struct1 = UlidStruct.of(string1);
|
||||||
|
|
||||||
assertEquals(struct0.time, struct1.time);
|
assertEquals(struct0.time, struct1.time);
|
||||||
assertEquals(struct0.random1, struct1.random1);
|
assertEquals(struct0.random1, struct1.random1);
|
||||||
|
@ -62,10 +62,10 @@ public class UlidConverterTest {
|
||||||
for (int i = 0; i < DEFAULT_LOOP_MAX; i++) {
|
for (int i = 0; i < DEFAULT_LOOP_MAX; i++) {
|
||||||
|
|
||||||
UUID ulid0 = UlidCreator.getUlid();
|
UUID ulid0 = UlidCreator.getUlid();
|
||||||
UlidStruct struct0 = new UlidStruct(ulid0);
|
UlidStruct struct0 = UlidStruct.of(ulid0);
|
||||||
|
|
||||||
String string1 = UlidConverter.toString(ulid0);
|
String string1 = UlidConverter.toString(ulid0);
|
||||||
UlidStruct struct1 = new UlidStruct(string1);
|
UlidStruct struct1 = UlidStruct.of(string1);
|
||||||
|
|
||||||
assertEquals(struct0.time, struct1.time);
|
assertEquals(struct0.time, struct1.time);
|
||||||
assertEquals(struct0.random1, struct1.random1);
|
assertEquals(struct0.random1, struct1.random1);
|
||||||
|
@ -79,10 +79,10 @@ public class UlidConverterTest {
|
||||||
for (int i = 0; i < DEFAULT_LOOP_MAX; i++) {
|
for (int i = 0; i < DEFAULT_LOOP_MAX; i++) {
|
||||||
|
|
||||||
UUID ulid0 = UlidCreator.getUlid();
|
UUID ulid0 = UlidCreator.getUlid();
|
||||||
UlidStruct struct0 = new UlidStruct(ulid0);
|
UlidStruct struct0 = UlidStruct.of(ulid0);
|
||||||
|
|
||||||
String string1 = struct0.toString();
|
String string1 = struct0.toString();
|
||||||
UlidStruct struct1 = new UlidStruct(string1);
|
UlidStruct struct1 = UlidStruct.of(string1);
|
||||||
|
|
||||||
assertEquals(struct0.time, struct1.time);
|
assertEquals(struct0.time, struct1.time);
|
||||||
assertEquals(struct0.random1, struct1.random1);
|
assertEquals(struct0.random1, struct1.random1);
|
||||||
|
@ -96,13 +96,13 @@ public class UlidConverterTest {
|
||||||
for (int i = 0; i < DEFAULT_LOOP_MAX; i++) {
|
for (int i = 0; i < DEFAULT_LOOP_MAX; i++) {
|
||||||
|
|
||||||
UUID ulid0 = UlidCreator.getUlid();
|
UUID ulid0 = UlidCreator.getUlid();
|
||||||
UlidStruct struct0 = new UlidStruct(ulid0);
|
UlidStruct struct0 = UlidStruct.of(ulid0);
|
||||||
|
|
||||||
String string1 = UlidConverter.toString(ulid0);
|
String string1 = UlidConverter.toString(ulid0);
|
||||||
UlidStruct struct1 = new UlidStruct(string1);
|
UlidStruct struct1 = UlidStruct.of(string1);
|
||||||
|
|
||||||
String string2 = struct0.toString();
|
String string2 = struct0.toString();
|
||||||
UlidStruct struct2 = new UlidStruct(string2);
|
UlidStruct struct2 = UlidStruct.of(string2);
|
||||||
|
|
||||||
assertEquals(string1, string2);
|
assertEquals(string1, string2);
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@ package com.github.f4b6a3.ulid.util;
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
@ -14,7 +15,8 @@ public class UlidUtilTest {
|
||||||
private static final String EXAMPLE_RANDOMNESS = "ABCDEFGHJKMNPQRS";
|
private static final String EXAMPLE_RANDOMNESS = "ABCDEFGHJKMNPQRS";
|
||||||
private static final String EXAMPLE_ULID = "0123456789ABCDEFGHJKMNPQRS";
|
private static final String EXAMPLE_ULID = "0123456789ABCDEFGHJKMNPQRS";
|
||||||
|
|
||||||
private static final long TIMESTAMP_MAX = 281474976710655l; // 2^48 - 1
|
// Date: 10889-08-02T05:31:50.655Z: 281474976710655 (2^48-1)
|
||||||
|
private static final long TIMESTAMP_MAX = 0xffffffffffffL;
|
||||||
|
|
||||||
private static final String[] EXAMPLE_DATES = { "1970-01-01T00:00:00.000Z", "1985-10-26T01:16:00.123Z",
|
private static final String[] EXAMPLE_DATES = { "1970-01-01T00:00:00.000Z", "1985-10-26T01:16:00.123Z",
|
||||||
"2001-09-09T01:46:40.456Z", "2020-01-15T14:30:33.789Z", "2038-01-19T03:14:07.321Z" };
|
"2001-09-09T01:46:40.456Z", "2020-01-15T14:30:33.789Z", "2038-01-19T03:14:07.321Z" };
|
||||||
|
@ -43,19 +45,46 @@ public class UlidUtilTest {
|
||||||
"4EHEM5", "XJDP47", "757B07", "X3J341", "4TFS7M", "FBP7NE", "86DWP0", "B6KZXG", "TSG99C", "W1TJBW",
|
"4EHEM5", "XJDP47", "757B07", "X3J341", "4TFS7M", "FBP7NE", "86DWP0", "B6KZXG", "TSG99C", "W1TJBW",
|
||||||
"X17F5F", "VVFP2X", "WJCER0" };
|
"X17F5F", "VVFP2X", "WJCER0" };
|
||||||
|
|
||||||
@Test(expected = InvalidUlidException.class)
|
@Test
|
||||||
public void testExtractTimestamp() {
|
public void testExtractTimestamp1() {
|
||||||
|
|
||||||
String ulid = "0000000000" + EXAMPLE_RANDOMNESS;
|
String ulid = "0000000000" + EXAMPLE_RANDOMNESS;
|
||||||
long milliseconds = extractTimestamp(ulid);
|
long milliseconds = extractUnixMilliseconds(ulid);
|
||||||
assertEquals(0, milliseconds);
|
assertEquals(0, milliseconds);
|
||||||
|
|
||||||
ulid = "7ZZZZZZZZZ" + EXAMPLE_RANDOMNESS;
|
ulid = "7ZZZZZZZZZ" + EXAMPLE_RANDOMNESS;
|
||||||
milliseconds = extractTimestamp(ulid);
|
milliseconds = extractUnixMilliseconds(ulid);
|
||||||
assertEquals(TIMESTAMP_MAX, milliseconds);
|
assertEquals(TIMESTAMP_MAX, milliseconds);
|
||||||
|
|
||||||
|
try {
|
||||||
ulid = "8ZZZZZZZZZ" + EXAMPLE_RANDOMNESS;
|
ulid = "8ZZZZZZZZZ" + EXAMPLE_RANDOMNESS;
|
||||||
extractTimestamp(ulid);
|
extractUnixMilliseconds(ulid);
|
||||||
|
fail("Should throw an InvalidUlidException");
|
||||||
|
} catch (InvalidUlidException e) {
|
||||||
|
// success
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testExtractTimestamp2() {
|
||||||
|
|
||||||
|
String string = "0000000000" + EXAMPLE_RANDOMNESS;
|
||||||
|
UUID ulid = UlidConverter.fromString(string);
|
||||||
|
long milliseconds = extractUnixMilliseconds(ulid);
|
||||||
|
assertEquals(0, milliseconds);
|
||||||
|
|
||||||
|
string = "7ZZZZZZZZZ" + EXAMPLE_RANDOMNESS;
|
||||||
|
ulid = UlidConverter.fromString(string);
|
||||||
|
milliseconds = extractUnixMilliseconds(ulid);
|
||||||
|
assertEquals(TIMESTAMP_MAX, milliseconds);
|
||||||
|
|
||||||
|
try {
|
||||||
|
string = "8ZZZZZZZZZ" + EXAMPLE_RANDOMNESS;
|
||||||
|
ulid = UlidConverter.fromString(string);
|
||||||
|
fail("Should throw an InvalidUlidException");
|
||||||
|
} catch (InvalidUlidException e) {
|
||||||
|
// success
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -68,7 +97,7 @@ public class UlidUtilTest {
|
||||||
|
|
||||||
String timestampComponent = new String(UlidUtil.zerofill(toBase32Crockford(milliseconds), 10));
|
String timestampComponent = new String(UlidUtil.zerofill(toBase32Crockford(milliseconds), 10));
|
||||||
String ulid = timestampComponent + randomnessComponent;
|
String ulid = timestampComponent + randomnessComponent;
|
||||||
long result = extractTimestamp(ulid);
|
long result = extractUnixMilliseconds(ulid);
|
||||||
|
|
||||||
assertEquals(milliseconds, result);
|
assertEquals(milliseconds, result);
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,7 @@ public class UlidStructTest {
|
||||||
final long time = random.nextLong();
|
final long time = random.nextLong();
|
||||||
final long random1 = random.nextLong();
|
final long random1 = random.nextLong();
|
||||||
final long random2 = random.nextLong();
|
final long random2 = random.nextLong();
|
||||||
UlidStruct struct0 = new UlidStruct(time, random1, random2); // <-- under test
|
UlidStruct struct0 = UlidStruct.of(time, random1, random2); // <-- under test
|
||||||
|
|
||||||
assertEquals(time & 0xffffffffffffL, struct0.time);
|
assertEquals(time & 0xffffffffffffL, struct0.time);
|
||||||
assertEquals(random1 & 0xffffffffffL, struct0.random1);
|
assertEquals(random1 & 0xffffffffffL, struct0.random1);
|
||||||
|
@ -36,10 +36,10 @@ public class UlidStructTest {
|
||||||
final long time = random.nextLong();
|
final long time = random.nextLong();
|
||||||
final long random1 = random.nextLong();
|
final long random1 = random.nextLong();
|
||||||
final long random2 = random.nextLong();
|
final long random2 = random.nextLong();
|
||||||
UlidStruct struct0 = new UlidStruct(time, random1, random2);
|
UlidStruct struct0 = UlidStruct.of(time, random1, random2);
|
||||||
|
|
||||||
String string1 = toString(struct0);
|
String string1 = toString(struct0);
|
||||||
UlidStruct struct1 = new UlidStruct(string1); // <-- under test
|
UlidStruct struct1 = UlidStruct.of(string1); // <-- under test
|
||||||
assertEquals(struct0, struct1);
|
assertEquals(struct0, struct1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,7 @@ public class UlidStructTest {
|
||||||
final long msb = random.nextLong();
|
final long msb = random.nextLong();
|
||||||
final long lsb = random.nextLong();
|
final long lsb = random.nextLong();
|
||||||
final UUID uuid0 = new UUID(msb, lsb);
|
final UUID uuid0 = new UUID(msb, lsb);
|
||||||
UlidStruct struct0 = new UlidStruct(uuid0); // <-- under test
|
UlidStruct struct0 = UlidStruct.of(uuid0); // <-- under test
|
||||||
|
|
||||||
UUID uuid1 = toUuid(struct0);
|
UUID uuid1 = toUuid(struct0);
|
||||||
assertEquals(uuid0, uuid1);
|
assertEquals(uuid0, uuid1);
|
||||||
|
@ -66,7 +66,7 @@ public class UlidStructTest {
|
||||||
final long time = random.nextLong();
|
final long time = random.nextLong();
|
||||||
final long random1 = random.nextLong();
|
final long random1 = random.nextLong();
|
||||||
final long random2 = random.nextLong();
|
final long random2 = random.nextLong();
|
||||||
UlidStruct struct0 = new UlidStruct(time, random1, random2);
|
UlidStruct struct0 = UlidStruct.of(time, random1, random2);
|
||||||
|
|
||||||
String string1 = toString(struct0);
|
String string1 = toString(struct0);
|
||||||
String string2 = struct0.toString(); // <-- under test
|
String string2 = struct0.toString(); // <-- under test
|
||||||
|
@ -82,7 +82,7 @@ public class UlidStructTest {
|
||||||
final long time = random.nextLong();
|
final long time = random.nextLong();
|
||||||
final long random1 = random.nextLong();
|
final long random1 = random.nextLong();
|
||||||
final long random2 = random.nextLong();
|
final long random2 = random.nextLong();
|
||||||
UlidStruct struct0 = new UlidStruct(time, random1, random2);
|
UlidStruct struct0 = UlidStruct.of(time, random1, random2);
|
||||||
|
|
||||||
UUID uuid1 = toUuid(struct0);
|
UUID uuid1 = toUuid(struct0);
|
||||||
UUID uuid2 = struct0.toUuid(); // <-- under test
|
UUID uuid2 = struct0.toUuid(); // <-- under test
|
||||||
|
@ -108,7 +108,7 @@ public class UlidStructTest {
|
||||||
random1 = Long.parseUnsignedLong(r1, 32);
|
random1 = Long.parseUnsignedLong(r1, 32);
|
||||||
random2 = Long.parseUnsignedLong(r2, 32);
|
random2 = Long.parseUnsignedLong(r2, 32);
|
||||||
|
|
||||||
return new UlidStruct(time, random1, random2);
|
return UlidStruct.of(time, random1, random2);
|
||||||
}
|
}
|
||||||
|
|
||||||
public UUID toUuid(UlidStruct struct) {
|
public UUID toUuid(UlidStruct struct) {
|
||||||
|
|
Loading…
Reference in New Issue