diff --git a/engine/src/main/java/net/jqwik/engine/properties/arbitraries/DefaultStringArbitrary.java b/engine/src/main/java/net/jqwik/engine/properties/arbitraries/DefaultStringArbitrary.java index a96cf703a..903d5febd 100644 --- a/engine/src/main/java/net/jqwik/engine/properties/arbitraries/DefaultStringArbitrary.java +++ b/engine/src/main/java/net/jqwik/engine/properties/arbitraries/DefaultStringArbitrary.java @@ -83,7 +83,7 @@ private boolean hasSingleCharEdgeCases() { } private EdgeCases emptyStringEdgeCase() { - return EdgeCases.fromSupplier(() -> new ShrinkableString(Collections.emptyList(), minLength, maxLength(), characterArbitrary)); + return EdgeCases.fromSupplier(() -> new ShrinkableString(Collections.emptyList(), minLength, maxLength(), characterArbitrary, uniqueChars)); } private EdgeCases fixedSizedEdgeCases(int fixedSize, int maxEdgeCases) { @@ -91,7 +91,7 @@ private EdgeCases fixedSizedEdgeCases(int fixedSize, int maxEdgeCases) { effectiveCharacterArbitrary().edgeCases(maxEdgeCases), shrinkableChar -> { List> shrinkableChars = new ArrayList<>(Collections.nCopies(fixedSize, shrinkableChar)); - return new ShrinkableString(shrinkableChars, minLength, maxLength(), characterArbitrary); + return new ShrinkableString(shrinkableChars, minLength, maxLength(), characterArbitrary, uniqueChars); } ); } diff --git a/engine/src/main/java/net/jqwik/engine/properties/arbitraries/randomized/RandomGenerators.java b/engine/src/main/java/net/jqwik/engine/properties/arbitraries/randomized/RandomGenerators.java index ea3276ca6..cf1a30fd2 100644 --- a/engine/src/main/java/net/jqwik/engine/properties/arbitraries/randomized/RandomGenerators.java +++ b/engine/src/main/java/net/jqwik/engine/properties/arbitraries/randomized/RandomGenerators.java @@ -103,8 +103,8 @@ public static RandomGenerator strings( Arbitrary characterArbitrary, boolean uniqueChars ) { - Function>, Shrinkable> createShrinkable = elements -> new ShrinkableString(elements, minLength, maxLength, characterArbitrary, false); - Set> featureExtractors = uniqueChars ? Collections.singleton(FeatureExtractor.identity()) : Collections.emptySet(); + Function>, Shrinkable> createShrinkable = elements -> new ShrinkableString(elements, minLength, maxLength, characterArbitrary, uniqueChars); + Set> featureExtractors = uniqueChars ? ShrinkableString.UNIQUE_CHARS_EXTRACTOR : Collections.emptySet(); return container(elementGenerator, createShrinkable, minLength, maxLength, maxUniqueChars, genSize, lengthDistribution, featureExtractors); } diff --git a/engine/src/test/java/net/jqwik/engine/properties/arbitraries/DefaultStringArbitraryTests.java b/engine/src/test/java/net/jqwik/engine/properties/arbitraries/DefaultStringArbitraryTests.java index 17a56e413..7ebe4f3f3 100644 --- a/engine/src/test/java/net/jqwik/engine/properties/arbitraries/DefaultStringArbitraryTests.java +++ b/engine/src/test/java/net/jqwik/engine/properties/arbitraries/DefaultStringArbitraryTests.java @@ -318,7 +318,7 @@ void uniqueCharsWithImpossibleLength(@ForAll Random random) { } @Group - @PropertyDefaults(tries = 100) + @PropertyDefaults(tries = 10) class Shrinking { @Property @@ -345,7 +345,7 @@ void alpha3IsShrunkToTripleA(@ForAll Random random) { ); } - // @Property // Currently failing + @Property void alpha3UniqueCharsIsShrunkToABC(@ForAll Random random) { StringArbitrary arbitrary = Arbitraries.strings().alpha().uniqueChars().ofLength(3); @@ -353,7 +353,7 @@ void alpha3UniqueCharsIsShrunkToABC(@ForAll Random random) { assertWhileShrinking( random, arbitrary, - s -> s.length() == 3 && s.chars().allMatch(c -> c >= 'A' && c <= 'z') + s -> s.length() == 3 && s.chars().distinct().count() == 3 ); }