summaryrefslogtreecommitdiff
path: root/src/main/java/au/id/zancanaro/javacheck/Generators.java
diff options
context:
space:
mode:
authorCarlo Zancanaro <carlo@zancanaro.id.au>2015-06-09 17:33:56 +1000
committerCarlo Zancanaro <carlo@zancanaro.id.au>2015-06-09 17:33:56 +1000
commitdd9f72b94eb7b2c37061c80457e74e8d7ac3e18f (patch)
tree17ac650c0c4a5045b1cbf0ef5c194b0ea7f7acd3 /src/main/java/au/id/zancanaro/javacheck/Generators.java
parent813e523e9e57dc38f81afc53340e216b948d87cf (diff)
Add an ObjectGenerator<>, and related machinery (also a mapOf generator)
Diffstat (limited to 'src/main/java/au/id/zancanaro/javacheck/Generators.java')
-rw-r--r--src/main/java/au/id/zancanaro/javacheck/Generators.java29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/main/java/au/id/zancanaro/javacheck/Generators.java b/src/main/java/au/id/zancanaro/javacheck/Generators.java
index f4ac025..63d4ece 100644
--- a/src/main/java/au/id/zancanaro/javacheck/Generators.java
+++ b/src/main/java/au/id/zancanaro/javacheck/Generators.java
@@ -1,8 +1,12 @@
package au.id.zancanaro.javacheck;
+import au.id.zancanaro.javacheck.object.GeneratorProvider;
+import au.id.zancanaro.javacheck.object.ObjectGenerator;
+
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
+import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
@@ -75,6 +79,7 @@ public final class Generators {
private static ShrinkStrategy<Long> longShrinkStrategy(final long bound) {
return value -> StreamSupport.stream(new Spliterators.AbstractSpliterator<Long>(Long.MAX_VALUE, Spliterator.ORDERED) {
long curr = value - bound;
+
@Override
public boolean tryAdvance(Consumer<? super Long> action) {
if (curr == 0) {
@@ -173,6 +178,22 @@ public final class Generators {
};
}
+ @SuppressWarnings("unchecked")
+ public static <K, V> Generator<Map<K, V>> mapOf(Generator<K> keyGen, Generator<V> valueGen) {
+ return (random, size) -> {
+ Generator<Integer> countGen = sized(s -> integer(0, s));
+ int count = countGen.generate(random, size).getValue();
+ return Generator.list(count, Generator.tuple(keyGen, valueGen))
+ .generate(random, size)
+ .map(pairs -> pairs.stream()
+ .collect(Collectors.toMap(
+ pair -> (K) pair.get(0),
+ pair -> (V) pair.get(1),
+ (first, second) -> second)))
+ .map(Collections::unmodifiableMap);
+ };
+ }
+
public static Generator<Character> character() {
return integer(0, 256).map(i -> (char) i.intValue());
}
@@ -216,4 +237,12 @@ public final class Generators {
return String.valueOf(chars);
});
}
+
+ public static <T> Generator<T> ofType(Class<T> type) {
+ return new ObjectGenerator<>(type);
+ }
+
+ public static <T> Generator<T> ofType(Class<T> type, GeneratorProvider provider) {
+ return new ObjectGenerator<>(type, provider);
+ }
}