From abbc6da6f9dfe94df3fa4c73438b0a1ac072ad9e Mon Sep 17 00:00:00 2001 From: ivan-kripakov-m10 Date: Sun, 21 Jun 2026 16:14:50 -0300 Subject: [PATCH 1/5] Add typed UUID generators - change uuids() to return java.util.UUID values - add uuidStrings() alongside version configuration support - default UUID generation to version 4 and validate versions in [1, 8] - derive UUID.class via Generators.forType - move UUID coverage into dedicated generator tests --- src/main/java/dev/hegel/Generators.java | 24 +++++++++-- .../java/dev/hegel/generators/Derive.java | 3 ++ .../dev/hegel/generators/UuidGenerator.java | 41 +++++++++++++++++-- .../hegel/generators/UuidStringGenerator.java | 36 ++++++++++++++++ src/test/java/dev/hegel/ConformanceTest.java | 6 ++- src/test/java/dev/hegel/DerivationTest.java | 7 ++++ .../java/dev/hegel/UuidGeneratorTest.java | 30 ++++++++++++++ .../dev/hegel/UuidStringGeneratorTest.java | 30 ++++++++++++++ 8 files changed, 168 insertions(+), 9 deletions(-) create mode 100644 src/main/java/dev/hegel/generators/UuidStringGenerator.java create mode 100644 src/test/java/dev/hegel/UuidGeneratorTest.java create mode 100644 src/test/java/dev/hegel/UuidStringGeneratorTest.java diff --git a/src/main/java/dev/hegel/Generators.java b/src/main/java/dev/hegel/Generators.java index 17091a5..83d6d58 100644 --- a/src/main/java/dev/hegel/Generators.java +++ b/src/main/java/dev/hegel/Generators.java @@ -28,6 +28,7 @@ import dev.hegel.generators.TupleGenerator; import dev.hegel.generators.UrlGenerator; import dev.hegel.generators.UuidGenerator; +import dev.hegel.generators.UuidStringGenerator; import dev.hegel.generators.ZoneOffsetGenerator; import java.time.Duration; import java.time.LocalDate; @@ -37,6 +38,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.UUID; import java.util.function.Function; /** @@ -463,8 +465,9 @@ public static Deferred deferred() { * Derive a generator for {@code type} by reflection. * *

Supports scalar types ({@code int}, {@code long}, {@code boolean}, {@code float}, {@code - * double}, {@code String}, {@code byte[]} and their wrappers), enums, records (recursively), and - * {@code List}, {@code Set}, {@code Optional} and {@code Map} of supported element types. + * double}, {@code String}, {@code byte[]}, {@link UUID}, and their wrappers), enums, records + * (recursively), and {@code List}, {@code Set}, {@code Optional} and {@code Map} of supported + * element types. * * @param type the type to derive a generator for * @param the type @@ -519,12 +522,25 @@ public static IpAddressGenerator ipAddresses() { } /** - * @return a generator of UUID strings + * Generates version-4 {@link UUID} values by default. Use {@link UuidGenerator#version(int)} + * to override the RFC 4122 version. + * + * @return a UUID generator */ - public static Generator uuids() { + public static UuidGenerator uuids() { return new UuidGenerator(); } + /** + * Generates version-4 UUID strings by default. Use {@link UuidStringGenerator#version(int)} to + * override the RFC 4122 version. + * + * @return a generator of UUID strings + */ + public static UuidStringGenerator uuidStrings() { + return new UuidStringGenerator(); + } + /** * @return a generator of {@link LocalDate} values (the engine's {@code YYYY-MM-DD} output) */ diff --git a/src/main/java/dev/hegel/generators/Derive.java b/src/main/java/dev/hegel/generators/Derive.java index 79d94f1..c4efcb0 100644 --- a/src/main/java/dev/hegel/generators/Derive.java +++ b/src/main/java/dev/hegel/generators/Derive.java @@ -67,6 +67,9 @@ private static Generator scalar(Class cls) { if (cls == String.class) { return Generators.text(); } + if (cls == java.util.UUID.class) { + return Generators.uuids(); + } if (cls == byte[].class) { return Generators.binary(); } diff --git a/src/main/java/dev/hegel/generators/UuidGenerator.java b/src/main/java/dev/hegel/generators/UuidGenerator.java index f0b77f7..f58be86 100644 --- a/src/main/java/dev/hegel/generators/UuidGenerator.java +++ b/src/main/java/dev/hegel/generators/UuidGenerator.java @@ -3,14 +3,47 @@ import com.upokecenter.cbor.CBORObject; import dev.hegel.Cbor; import dev.hegel.Generator; +import java.util.UUID; /** - * Generates UUID strings. Always basic (one engine call). + * Generates {@link UUID} values. Always basic (one engine call). + * + *

Defaults to RFC 4122 version 4, matching {@link UUID#randomUUID()}; narrow it with {@link + * #version(int)}. */ -public final class UuidGenerator implements Generator { +public final class UuidGenerator implements Generator { + private final Integer version; + + public UuidGenerator() { + this(4); + } + + public UuidGenerator(Integer version) { + this.version = validateVersion(version); + } + + /** + * @param version the UUID version to generate; must be in {@code [1, 8]} + * @return a copy pinned to the requested version + */ + public UuidGenerator version(int version) { + return new UuidGenerator(version); + } + + private static Integer validateVersion(Integer version) { + if (version != null && (version < 1 || version > 8)) { + throw new IllegalArgumentException("uuids: version must be in [1, 8]"); + } + return version; + } + /** @hidden */ @Override - public BasicGenerator asBasic() { - return new BasicGenerator<>(CBORObject.NewMap().Add("type", "uuid"), Cbor::asString); + public BasicGenerator asBasic() { + CBORObject schema = CBORObject.NewMap().Add("type", "uuid"); + if (version != null) { + schema.Add("version", version); + } + return new BasicGenerator<>(schema, raw -> UUID.fromString(Cbor.asString(raw))); } } diff --git a/src/main/java/dev/hegel/generators/UuidStringGenerator.java b/src/main/java/dev/hegel/generators/UuidStringGenerator.java new file mode 100644 index 0000000..509974e --- /dev/null +++ b/src/main/java/dev/hegel/generators/UuidStringGenerator.java @@ -0,0 +1,36 @@ +package dev.hegel.generators; + +import dev.hegel.Generator; +import java.util.UUID; + +/** + * Generates UUID strings. Always basic (one engine call). + * + *

Defaults to RFC 4122 version 4, matching {@link UUID#randomUUID()}; narrow it with {@link + * #version(int)}. + */ +public final class UuidStringGenerator implements Generator { + private final UuidGenerator source; + + public UuidStringGenerator() { + this(new UuidGenerator()); + } + + private UuidStringGenerator(UuidGenerator source) { + this.source = source; + } + + /** + * @param version the UUID version to generate; must be in {@code [1, 8]} + * @return a copy pinned to the requested version + */ + public UuidStringGenerator version(int version) { + return new UuidStringGenerator(source.version(version)); + } + + /** @hidden */ + @Override + public BasicGenerator asBasic() { + return source.asBasic().mapBasic(UUID::toString); + } +} diff --git a/src/test/java/dev/hegel/ConformanceTest.java b/src/test/java/dev/hegel/ConformanceTest.java index 58638d7..e7073a3 100644 --- a/src/test/java/dev/hegel/ConformanceTest.java +++ b/src/test/java/dev/hegel/ConformanceTest.java @@ -27,6 +27,7 @@ import static dev.hegel.Generators.times; import static dev.hegel.Generators.tuples; import static dev.hegel.Generators.urls; +import static dev.hegel.Generators.uuidStrings; import static dev.hegel.Generators.uuids; import static dev.hegel.Generators.zoneIds; import static dev.hegel.Generators.zoneOffsets; @@ -42,6 +43,8 @@ import java.time.ZoneId; import java.time.ZoneOffset; import java.util.List; +import java.util.Objects; +import java.util.UUID; import org.junit.jupiter.api.Test; /** Behaviour/conformance suite exercising every generator against the real engine. */ @@ -192,7 +195,8 @@ void formatGenerators() { ipAddresses().v4(), s -> s.chars().filter(c -> c == '.').count() == 3); assertAllExamples(ipAddresses().v6(), s -> s.contains(":")); assertAllExamples(ipAddresses(), s -> s.contains(".") || s.contains(":")); - assertAllExamples(uuids(), s -> s.contains("-")); + assertAllExamples(uuids(), Objects::nonNull); + assertAllExamples(uuidStrings(), u -> UUID.fromString(u) != null); assertAllExamples(fromRegex("[0-9]{3}"), s -> s.matches(".*[0-9]{3}.*")); } diff --git a/src/test/java/dev/hegel/DerivationTest.java b/src/test/java/dev/hegel/DerivationTest.java index cd05193..cf1e3ca 100644 --- a/src/test/java/dev/hegel/DerivationTest.java +++ b/src/test/java/dev/hegel/DerivationTest.java @@ -11,8 +11,10 @@ import dev.hegel.generators.Derive; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Set; +import java.util.UUID; import org.junit.jupiter.api.Test; class DerivationTest { @@ -96,6 +98,11 @@ void derivesWrapperScalarsAndBytes() { w -> w.l() != null && w.b() != null && w.d() != null && w.data() != null && w.i() != null); } + @Test + void derivesUuidScalars() { + assertAllExamples(forType(UUID.class), Objects::nonNull); + } + record Temporal( java.time.Duration d, java.time.LocalDate date, diff --git a/src/test/java/dev/hegel/UuidGeneratorTest.java b/src/test/java/dev/hegel/UuidGeneratorTest.java new file mode 100644 index 0000000..d44aeb9 --- /dev/null +++ b/src/test/java/dev/hegel/UuidGeneratorTest.java @@ -0,0 +1,30 @@ +package dev.hegel; + +import static dev.hegel.Generators.uuids; +import static dev.hegel.Utils.assertAllExamples; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.util.UUID; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +class UuidGeneratorTest { + @Test + void defaultUuidsAreVersion4() { + assertAllExamples(uuids(), u -> UUID.fromString(u.toString()).equals(u) && u.version() == 4); + } + + @ParameterizedTest + @ValueSource(ints = {1, 2, 3, 4, 5, 6, 7, 8}) + void configuredUuidVersionsAreRespected(int version) { + assertAllExamples( + uuids().version(version), u -> UUID.fromString(u.toString()).equals(u) && u.version() == version); + } + + @ParameterizedTest + @ValueSource(ints = {0, 9}) + void invalidVersionsAreRejected(int version) { + assertThrows(IllegalArgumentException.class, () -> uuids().version(version)); + } +} diff --git a/src/test/java/dev/hegel/UuidStringGeneratorTest.java b/src/test/java/dev/hegel/UuidStringGeneratorTest.java new file mode 100644 index 0000000..1fe5ad6 --- /dev/null +++ b/src/test/java/dev/hegel/UuidStringGeneratorTest.java @@ -0,0 +1,30 @@ +package dev.hegel; + +import static dev.hegel.Generators.uuidStrings; +import static dev.hegel.Utils.assertAllExamples; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.util.UUID; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +class UuidStringGeneratorTest { + @Test + void defaultUuidStringsAreVersion4() { + assertAllExamples(uuidStrings(), s -> UUID.fromString(s).version() == 4); + } + + @ParameterizedTest + @ValueSource(ints = {1, 2, 3, 4, 5, 6, 7, 8}) + void configuredUuidStringVersionsAreRespected(int version) { + assertAllExamples( + uuidStrings().version(version), s -> UUID.fromString(s).version() == version); + } + + @ParameterizedTest + @ValueSource(ints = {0, 9}) + void invalidVersionsAreRejected(int version) { + assertThrows(IllegalArgumentException.class, () -> uuidStrings().version(version)); + } +} From cbafeb9028376dcdd7feffdd416c145602e4e373 Mon Sep 17 00:00:00 2001 From: ivan-kripakov-m10 Date: Thu, 25 Jun 2026 15:51:59 -0300 Subject: [PATCH 2/5] fix: handle anyVersion semantic clearly (null version in uuid schema) --- src/main/java/dev/hegel/Generators.java | 5 ++--- .../dev/hegel/generators/UuidGenerator.java | 13 +++++++++--- .../hegel/generators/UuidStringGenerator.java | 13 ++++++++++-- .../java/dev/hegel/UuidGeneratorTest.java | 20 +++++++++++++++++++ .../dev/hegel/UuidStringGeneratorTest.java | 20 +++++++++++++++++++ 5 files changed, 63 insertions(+), 8 deletions(-) diff --git a/src/main/java/dev/hegel/Generators.java b/src/main/java/dev/hegel/Generators.java index 83d6d58..e0fa1c9 100644 --- a/src/main/java/dev/hegel/Generators.java +++ b/src/main/java/dev/hegel/Generators.java @@ -522,8 +522,7 @@ public static IpAddressGenerator ipAddresses() { } /** - * Generates version-4 {@link UUID} values by default. Use {@link UuidGenerator#version(int)} - * to override the RFC 4122 version. + * Generates {@link UUID} values; see {@link UuidGenerator} for configuration capabilities. * * @return a UUID generator */ @@ -533,7 +532,7 @@ public static UuidGenerator uuids() { /** * Generates version-4 UUID strings by default. Use {@link UuidStringGenerator#version(int)} to - * override the RFC 4122 version. + * pin a version, or {@link UuidStringGenerator#anyVersion()} to let hegel-core choose it. * * @return a generator of UUID strings */ diff --git a/src/main/java/dev/hegel/generators/UuidGenerator.java b/src/main/java/dev/hegel/generators/UuidGenerator.java index f58be86..0397af8 100644 --- a/src/main/java/dev/hegel/generators/UuidGenerator.java +++ b/src/main/java/dev/hegel/generators/UuidGenerator.java @@ -8,8 +8,8 @@ /** * Generates {@link UUID} values. Always basic (one engine call). * - *

Defaults to RFC 4122 version 4, matching {@link UUID#randomUUID()}; narrow it with {@link - * #version(int)}. + *

Defaults to RFC 4122 version 4, matching {@link UUID#randomUUID()}; pin it with {@link + * #version(int)}, or call {@link #anyVersion()} to let hegel-core choose the version. */ public final class UuidGenerator implements Generator { private final Integer version; @@ -18,7 +18,7 @@ public UuidGenerator() { this(4); } - public UuidGenerator(Integer version) { + private UuidGenerator(Integer version) { this.version = validateVersion(version); } @@ -30,6 +30,13 @@ public UuidGenerator version(int version) { return new UuidGenerator(version); } + /** + * @return a copy that omits the version field and lets hegel-core choose the UUID version + */ + public UuidGenerator anyVersion() { + return new UuidGenerator(null); + } + private static Integer validateVersion(Integer version) { if (version != null && (version < 1 || version > 8)) { throw new IllegalArgumentException("uuids: version must be in [1, 8]"); diff --git a/src/main/java/dev/hegel/generators/UuidStringGenerator.java b/src/main/java/dev/hegel/generators/UuidStringGenerator.java index 509974e..b678f10 100644 --- a/src/main/java/dev/hegel/generators/UuidStringGenerator.java +++ b/src/main/java/dev/hegel/generators/UuidStringGenerator.java @@ -6,8 +6,8 @@ /** * Generates UUID strings. Always basic (one engine call). * - *

Defaults to RFC 4122 version 4, matching {@link UUID#randomUUID()}; narrow it with {@link - * #version(int)}. + *

Defaults to RFC 4122 version 4, matching {@link UUID#randomUUID()}; pin it with {@link + * #version(int)}, or call {@link #anyVersion()} to let hegel-core choose the version. */ public final class UuidStringGenerator implements Generator { private final UuidGenerator source; @@ -28,6 +28,15 @@ public UuidStringGenerator version(int version) { return new UuidStringGenerator(source.version(version)); } + /** + * @return a copy that omits the version field and lets hegel-core choose the UUID version. + * + * As for now it can return any version + */ + public UuidStringGenerator anyVersion() { + return new UuidStringGenerator(source.anyVersion()); + } + /** @hidden */ @Override public BasicGenerator asBasic() { diff --git a/src/test/java/dev/hegel/UuidGeneratorTest.java b/src/test/java/dev/hegel/UuidGeneratorTest.java index d44aeb9..03f0f05 100644 --- a/src/test/java/dev/hegel/UuidGeneratorTest.java +++ b/src/test/java/dev/hegel/UuidGeneratorTest.java @@ -2,6 +2,7 @@ import static dev.hegel.Generators.uuids; import static dev.hegel.Utils.assertAllExamples; +import static dev.hegel.Utils.findAny; import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.UUID; @@ -22,6 +23,25 @@ void configuredUuidVersionsAreRespected(int version) { uuids().version(version), u -> UUID.fromString(u.toString()).equals(u) && u.version() == version); } + /** + * This test reflects the current behavior of hegel-core: + * it generates uuids with these versions + */ + @ParameterizedTest + @ValueSource(ints = {0, 1, 2, 3, 4, 5, 7, 8, 9, 12, 14, 15}) + void anyVersionGeneratesDifferentUuids(int version) { + findAny(uuids().anyVersion(), u -> u.version() == version); + } + + /** + * Just reflects the current behavior - uuids with the 6th version are not generated. + */ + @ValueSource(ints = {6, 11, 13}) + @ParameterizedTest + void hegelCoreDoesntGenerateUuidWithSpecificVersions(int unsupportedVersion) { + assertAllExamples(uuids().anyVersion(), u -> u.version() != unsupportedVersion); + } + @ParameterizedTest @ValueSource(ints = {0, 9}) void invalidVersionsAreRejected(int version) { diff --git a/src/test/java/dev/hegel/UuidStringGeneratorTest.java b/src/test/java/dev/hegel/UuidStringGeneratorTest.java index 1fe5ad6..3ccff8f 100644 --- a/src/test/java/dev/hegel/UuidStringGeneratorTest.java +++ b/src/test/java/dev/hegel/UuidStringGeneratorTest.java @@ -2,9 +2,11 @@ import static dev.hegel.Generators.uuidStrings; import static dev.hegel.Utils.assertAllExamples; +import static dev.hegel.Utils.findAny; import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.UUID; + import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -22,6 +24,24 @@ void configuredUuidStringVersionsAreRespected(int version) { uuidStrings().version(version), s -> UUID.fromString(s).version() == version); } + /** + * This test reflects the current behavior of hegel-core: + * it generates uuids with these versions + */ + @ParameterizedTest + @ValueSource(ints = {1, 2, 3, 4, 5, 7, 8}) + void anyVersionGeneratesUuidStringsWithDifferentVersions(int version) { + findAny(uuidStrings().anyVersion(), u -> UUID.fromString(u).version() == version); + } + + /** + * Just reflects the current behavior - uuids with the 6th version are not generated. + */ + @Test + void hegelCoreDoesntGenerateUuidStringsWithVersion6() { + assertAllExamples(uuidStrings().anyVersion(), u -> UUID.fromString(u).version() != 6); + } + @ParameterizedTest @ValueSource(ints = {0, 9}) void invalidVersionsAreRejected(int version) { From 51ef88737706fdee7b95266f79f4cbf914a8cc51 Mon Sep 17 00:00:00 2001 From: ivan-kripakov-m10 Date: Thu, 25 Jun 2026 15:58:28 -0300 Subject: [PATCH 3/5] chore: add missing RELEASE.md --- RELEASE.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 RELEASE.md diff --git a/RELEASE.md b/RELEASE.md new file mode 100644 index 0000000..6cdbdf4 --- /dev/null +++ b/RELEASE.md @@ -0,0 +1,5 @@ +RELEASE_TYPE: minor + +1) the UUID generator return type is changed from String to java.util.UUID +2) version configuration is exposed in the Java API, with version validation currently done on the client side +3) uuidStrings() is retained as a separate generator From 9407ab8d43d1d5b8c658937438b6166921cd0066 Mon Sep 17 00:00:00 2001 From: ivan-kripakov-m10 Date: Fri, 26 Jun 2026 10:43:22 -0300 Subject: [PATCH 4/5] chore: fix formatting --- src/test/java/dev/hegel/UuidStringGeneratorTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/dev/hegel/UuidStringGeneratorTest.java b/src/test/java/dev/hegel/UuidStringGeneratorTest.java index 3ccff8f..4b45193 100644 --- a/src/test/java/dev/hegel/UuidStringGeneratorTest.java +++ b/src/test/java/dev/hegel/UuidStringGeneratorTest.java @@ -6,7 +6,6 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.UUID; - import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; From 0b6efc13ec73e4e5bb65e5e2a72312925ebb856f Mon Sep 17 00:00:00 2001 From: Liam DeVoe Date: Mon, 29 Jun 2026 12:06:18 -0400 Subject: [PATCH 5/5] adjust api --- RELEASE.md | 4 +- src/main/java/dev/hegel/Generators.java | 11 ----- .../dev/hegel/generators/UuidGenerator.java | 19 +++---- .../hegel/generators/UuidStringGenerator.java | 45 ----------------- src/test/java/dev/hegel/ConformanceTest.java | 3 -- .../java/dev/hegel/UuidGeneratorTest.java | 33 ++++--------- .../dev/hegel/UuidStringGeneratorTest.java | 49 ------------------- 7 files changed, 17 insertions(+), 147 deletions(-) delete mode 100644 src/main/java/dev/hegel/generators/UuidStringGenerator.java delete mode 100644 src/test/java/dev/hegel/UuidStringGeneratorTest.java diff --git a/RELEASE.md b/RELEASE.md index 6cdbdf4..5a35cd4 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,5 +1,3 @@ RELEASE_TYPE: minor -1) the UUID generator return type is changed from String to java.util.UUID -2) version configuration is exposed in the Java API, with version validation currently done on the client side -3) uuidStrings() is retained as a separate generator +Change the `Generators.uuids()` return type from `String` to `java.util.UUID`, and expose version configuration as a `uuids().version(v)` method. diff --git a/src/main/java/dev/hegel/Generators.java b/src/main/java/dev/hegel/Generators.java index e0fa1c9..d476cc6 100644 --- a/src/main/java/dev/hegel/Generators.java +++ b/src/main/java/dev/hegel/Generators.java @@ -28,7 +28,6 @@ import dev.hegel.generators.TupleGenerator; import dev.hegel.generators.UrlGenerator; import dev.hegel.generators.UuidGenerator; -import dev.hegel.generators.UuidStringGenerator; import dev.hegel.generators.ZoneOffsetGenerator; import java.time.Duration; import java.time.LocalDate; @@ -530,16 +529,6 @@ public static UuidGenerator uuids() { return new UuidGenerator(); } - /** - * Generates version-4 UUID strings by default. Use {@link UuidStringGenerator#version(int)} to - * pin a version, or {@link UuidStringGenerator#anyVersion()} to let hegel-core choose it. - * - * @return a generator of UUID strings - */ - public static UuidStringGenerator uuidStrings() { - return new UuidStringGenerator(); - } - /** * @return a generator of {@link LocalDate} values (the engine's {@code YYYY-MM-DD} output) */ diff --git a/src/main/java/dev/hegel/generators/UuidGenerator.java b/src/main/java/dev/hegel/generators/UuidGenerator.java index 0397af8..09ca3ab 100644 --- a/src/main/java/dev/hegel/generators/UuidGenerator.java +++ b/src/main/java/dev/hegel/generators/UuidGenerator.java @@ -8,14 +8,14 @@ /** * Generates {@link UUID} values. Always basic (one engine call). * - *

Defaults to RFC 4122 version 4, matching {@link UUID#randomUUID()}; pin it with {@link - * #version(int)}, or call {@link #anyVersion()} to let hegel-core choose the version. + *

By default generates UUIDs of any version; use {@link #version(int)} to restrict to a + * specific RFC 4122 version (1–5). */ public final class UuidGenerator implements Generator { private final Integer version; public UuidGenerator() { - this(4); + this((Integer) null); } private UuidGenerator(Integer version) { @@ -23,23 +23,16 @@ private UuidGenerator(Integer version) { } /** - * @param version the UUID version to generate; must be in {@code [1, 8]} + * @param version the UUID version to generate; must be an RFC 4122 version in {@code [1, 5]} * @return a copy pinned to the requested version */ public UuidGenerator version(int version) { return new UuidGenerator(version); } - /** - * @return a copy that omits the version field and lets hegel-core choose the UUID version - */ - public UuidGenerator anyVersion() { - return new UuidGenerator(null); - } - private static Integer validateVersion(Integer version) { - if (version != null && (version < 1 || version > 8)) { - throw new IllegalArgumentException("uuids: version must be in [1, 8]"); + if (version != null && (version < 1 || version > 5)) { + throw new IllegalArgumentException("uuids: version must be in [1, 5]"); } return version; } diff --git a/src/main/java/dev/hegel/generators/UuidStringGenerator.java b/src/main/java/dev/hegel/generators/UuidStringGenerator.java deleted file mode 100644 index b678f10..0000000 --- a/src/main/java/dev/hegel/generators/UuidStringGenerator.java +++ /dev/null @@ -1,45 +0,0 @@ -package dev.hegel.generators; - -import dev.hegel.Generator; -import java.util.UUID; - -/** - * Generates UUID strings. Always basic (one engine call). - * - *

Defaults to RFC 4122 version 4, matching {@link UUID#randomUUID()}; pin it with {@link - * #version(int)}, or call {@link #anyVersion()} to let hegel-core choose the version. - */ -public final class UuidStringGenerator implements Generator { - private final UuidGenerator source; - - public UuidStringGenerator() { - this(new UuidGenerator()); - } - - private UuidStringGenerator(UuidGenerator source) { - this.source = source; - } - - /** - * @param version the UUID version to generate; must be in {@code [1, 8]} - * @return a copy pinned to the requested version - */ - public UuidStringGenerator version(int version) { - return new UuidStringGenerator(source.version(version)); - } - - /** - * @return a copy that omits the version field and lets hegel-core choose the UUID version. - * - * As for now it can return any version - */ - public UuidStringGenerator anyVersion() { - return new UuidStringGenerator(source.anyVersion()); - } - - /** @hidden */ - @Override - public BasicGenerator asBasic() { - return source.asBasic().mapBasic(UUID::toString); - } -} diff --git a/src/test/java/dev/hegel/ConformanceTest.java b/src/test/java/dev/hegel/ConformanceTest.java index e7073a3..8289867 100644 --- a/src/test/java/dev/hegel/ConformanceTest.java +++ b/src/test/java/dev/hegel/ConformanceTest.java @@ -27,7 +27,6 @@ import static dev.hegel.Generators.times; import static dev.hegel.Generators.tuples; import static dev.hegel.Generators.urls; -import static dev.hegel.Generators.uuidStrings; import static dev.hegel.Generators.uuids; import static dev.hegel.Generators.zoneIds; import static dev.hegel.Generators.zoneOffsets; @@ -44,7 +43,6 @@ import java.time.ZoneOffset; import java.util.List; import java.util.Objects; -import java.util.UUID; import org.junit.jupiter.api.Test; /** Behaviour/conformance suite exercising every generator against the real engine. */ @@ -196,7 +194,6 @@ void formatGenerators() { assertAllExamples(ipAddresses().v6(), s -> s.contains(":")); assertAllExamples(ipAddresses(), s -> s.contains(".") || s.contains(":")); assertAllExamples(uuids(), Objects::nonNull); - assertAllExamples(uuidStrings(), u -> UUID.fromString(u) != null); assertAllExamples(fromRegex("[0-9]{3}"), s -> s.matches(".*[0-9]{3}.*")); } diff --git a/src/test/java/dev/hegel/UuidGeneratorTest.java b/src/test/java/dev/hegel/UuidGeneratorTest.java index 03f0f05..9081bdc 100644 --- a/src/test/java/dev/hegel/UuidGeneratorTest.java +++ b/src/test/java/dev/hegel/UuidGeneratorTest.java @@ -12,38 +12,25 @@ class UuidGeneratorTest { @Test - void defaultUuidsAreVersion4() { - assertAllExamples(uuids(), u -> UUID.fromString(u.toString()).equals(u) && u.version() == 4); + void defaultGeneratesValidUuids() { + assertAllExamples(uuids(), u -> UUID.fromString(u.toString()).equals(u)); + } + + /** By default the version is unconstrained, so the engine emits non-RFC versions too. */ + @Test + void defaultIsNotPinnedToAnRfcVersion() { + findAny(uuids(), u -> u.version() < 1 || u.version() > 5); } @ParameterizedTest - @ValueSource(ints = {1, 2, 3, 4, 5, 6, 7, 8}) + @ValueSource(ints = {1, 2, 3, 4, 5}) void configuredUuidVersionsAreRespected(int version) { assertAllExamples( uuids().version(version), u -> UUID.fromString(u.toString()).equals(u) && u.version() == version); } - /** - * This test reflects the current behavior of hegel-core: - * it generates uuids with these versions - */ - @ParameterizedTest - @ValueSource(ints = {0, 1, 2, 3, 4, 5, 7, 8, 9, 12, 14, 15}) - void anyVersionGeneratesDifferentUuids(int version) { - findAny(uuids().anyVersion(), u -> u.version() == version); - } - - /** - * Just reflects the current behavior - uuids with the 6th version are not generated. - */ - @ValueSource(ints = {6, 11, 13}) - @ParameterizedTest - void hegelCoreDoesntGenerateUuidWithSpecificVersions(int unsupportedVersion) { - assertAllExamples(uuids().anyVersion(), u -> u.version() != unsupportedVersion); - } - @ParameterizedTest - @ValueSource(ints = {0, 9}) + @ValueSource(ints = {0, 6, 7, 8, 9}) void invalidVersionsAreRejected(int version) { assertThrows(IllegalArgumentException.class, () -> uuids().version(version)); } diff --git a/src/test/java/dev/hegel/UuidStringGeneratorTest.java b/src/test/java/dev/hegel/UuidStringGeneratorTest.java deleted file mode 100644 index 4b45193..0000000 --- a/src/test/java/dev/hegel/UuidStringGeneratorTest.java +++ /dev/null @@ -1,49 +0,0 @@ -package dev.hegel; - -import static dev.hegel.Generators.uuidStrings; -import static dev.hegel.Utils.assertAllExamples; -import static dev.hegel.Utils.findAny; -import static org.junit.jupiter.api.Assertions.assertThrows; - -import java.util.UUID; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; - -class UuidStringGeneratorTest { - @Test - void defaultUuidStringsAreVersion4() { - assertAllExamples(uuidStrings(), s -> UUID.fromString(s).version() == 4); - } - - @ParameterizedTest - @ValueSource(ints = {1, 2, 3, 4, 5, 6, 7, 8}) - void configuredUuidStringVersionsAreRespected(int version) { - assertAllExamples( - uuidStrings().version(version), s -> UUID.fromString(s).version() == version); - } - - /** - * This test reflects the current behavior of hegel-core: - * it generates uuids with these versions - */ - @ParameterizedTest - @ValueSource(ints = {1, 2, 3, 4, 5, 7, 8}) - void anyVersionGeneratesUuidStringsWithDifferentVersions(int version) { - findAny(uuidStrings().anyVersion(), u -> UUID.fromString(u).version() == version); - } - - /** - * Just reflects the current behavior - uuids with the 6th version are not generated. - */ - @Test - void hegelCoreDoesntGenerateUuidStringsWithVersion6() { - assertAllExamples(uuidStrings().anyVersion(), u -> UUID.fromString(u).version() != 6); - } - - @ParameterizedTest - @ValueSource(ints = {0, 9}) - void invalidVersionsAreRejected(int version) { - assertThrows(IllegalArgumentException.class, () -> uuidStrings().version(version)); - } -}