diff options
Diffstat (limited to 'src/main')
-rw-r--r-- | src/main/java/au/id/zancanaro/javacheck/Generator.java | 24 | ||||
-rw-r--r-- | src/main/java/au/id/zancanaro/javacheck/Generators.java | 18 | ||||
-rw-r--r-- | src/main/java/au/id/zancanaro/javacheck/ShrinkTree.java (renamed from src/main/java/au/id/zancanaro/javacheck/RoseTree.java) | 60 | ||||
-rw-r--r-- | src/main/java/au/id/zancanaro/javacheck/junit/Properties.java | 12 |
4 files changed, 57 insertions, 57 deletions
diff --git a/src/main/java/au/id/zancanaro/javacheck/Generator.java b/src/main/java/au/id/zancanaro/javacheck/Generator.java index 557cf97..9d88020 100644 --- a/src/main/java/au/id/zancanaro/javacheck/Generator.java +++ b/src/main/java/au/id/zancanaro/javacheck/Generator.java @@ -10,7 +10,7 @@ import java.util.function.Function; * trees in a controlled and deterministic way. * * A generator must implement one method: {@link #generate(Random, int)}. The - * {@link RoseTree} it produces defines both the value to be returned, as well + * {@link ShrinkTree} it produces defines both the value to be returned, as well * as the shrink tree for that value. * * Generators form a "monad", and hence have the {@link #map(Function)} and @@ -23,7 +23,7 @@ import java.util.function.Function; @SuppressWarnings("unused") public interface Generator<T> { /** - * Return a {@link RoseTree} containing a new random value of the required + * Return a {@link ShrinkTree} containing a new random value of the required * type, as well as its associated shrink tree. * * Generators also have an abstract notion of "size". Represented by an @@ -33,10 +33,10 @@ public interface Generator<T> { * * @param random The random source for generation purposes * @param size An integer specifying how "big" a thing to produce - * @return The {@link RoseTree} specifying the generated thing and its + * @return The {@link ShrinkTree} specifying the generated thing and its * shrink tree */ - RoseTree<T> generate(Random random, int size); + ShrinkTree<T> generate(Random random, int size); /** * A generator which simply generates the provided value. Does not shrink. @@ -46,7 +46,7 @@ public interface Generator<T> { * @return A {@link Generator} which generates the provided value */ static <T> Generator<T> pure(T value) { - return (random, size) -> RoseTree.pure(value); + return (random, size) -> ShrinkTree.pure(value); } /** @@ -66,12 +66,12 @@ public interface Generator<T> { static <T> Generator<List<T>> tuple(Generator<T>... generators) { return (random, size) -> { @SuppressWarnings("unchecked") - RoseTree<T>[] result = (RoseTree<T>[]) new RoseTree[generators.length]; + ShrinkTree<T>[] result = (ShrinkTree<T>[]) new ShrinkTree[generators.length]; int index = 0; for (Generator<T> generator : generators) { result[index++] = generator.generate(random, size); } - return RoseTree.zip(Function.identity(), result); + return ShrinkTree.zip(Function.identity(), result); }; } @@ -81,8 +81,8 @@ public interface Generator<T> { * * Shrinking for this type involves attempting to remove terms and shrink * each subtree in turn, recursively. (If the length must remain fixed then - * the {@link RoseTree} produced by this generator should be filtered with - * {@link RoseTree#filter(java.util.function.Predicate)}. + * the {@link ShrinkTree} produced by this generator should be filtered with + * {@link ShrinkTree#filter(java.util.function.Predicate)}. * * @param count The length of the list to generate * @param generator The generator to use for each term in the generated @@ -93,11 +93,11 @@ public interface Generator<T> { static <T> Generator<List<T>> list(int count, Generator<T> generator) { return (random, size) -> { @SuppressWarnings("unchecked") - RoseTree<T>[] result = (RoseTree<T>[]) new RoseTree[count]; + ShrinkTree<T>[] result = (ShrinkTree<T>[]) new ShrinkTree[count]; for (int i = 0; i < count; ++i) { result[i] = generator.generate(random, size); } - return RoseTree.shrink(Function.identity(), result); + return ShrinkTree.shrink(Function.identity(), result); }; } @@ -127,7 +127,7 @@ public interface Generator<T> { * result of this */ default <R> Generator<R> flatMap(Function<T, Generator<R>> action) { - return (random, size) -> RoseTree.join(this.generate(random, size).map(action).map(g -> g.generate(random, size))); + return (random, size) -> ShrinkTree.join(this.generate(random, size).map(action).map(g -> g.generate(random, size))); } default Iterator<T> sample(Random random, int maxSize) { diff --git a/src/main/java/au/id/zancanaro/javacheck/Generators.java b/src/main/java/au/id/zancanaro/javacheck/Generators.java index 4049149..5dee924 100644 --- a/src/main/java/au/id/zancanaro/javacheck/Generators.java +++ b/src/main/java/au/id/zancanaro/javacheck/Generators.java @@ -18,7 +18,7 @@ public final class Generators { public static <T> Generator<T> suchThat(Generator<T> gen, Predicate<T> predicate) { return (random, size) -> { - RoseTree<T> result = gen.generate(random, size); + ShrinkTree<T> result = gen.generate(random, size); if (predicate.test(result.getValue())) { return result.filter(predicate); } else { @@ -28,7 +28,7 @@ public final class Generators { } public static <T> Generator<T> noShrink(Generator<T> gen) { - return (random, size) -> new RoseTree<>( + return (random, size) -> new ShrinkTree<>( gen.generate(random, size).getValue(), Collections.emptyList()); } @@ -49,15 +49,15 @@ public final class Generators { public static Generator<Boolean> bool() { return (random, size) -> random.nextBoolean() ? - new RoseTree<>(true, Collections.singletonList(new RoseTree<>(false, Collections.emptyList()))) : - new RoseTree<>(false, Collections.emptyList()); + new ShrinkTree<>(true, Collections.singletonList(new ShrinkTree<>(false, Collections.emptyList()))) : + new ShrinkTree<>(false, Collections.emptyList()); } public static Generator<Integer> integer(int lower, int upper) { return (random, size) -> { int value = lower + random.nextInt(upper - lower); int bound = lower > 0 ? lower : (upper < 0 ? upper : 0); - return new RoseTree<>(value, intShrinkingIterable(value, bound)); + return new ShrinkTree<>(value, intShrinkingIterable(value, bound)); }; } @@ -69,8 +69,8 @@ public final class Generators { return sized(size -> integer(0, size)); } - private static Iterable<RoseTree<Integer>> intShrinkingIterable(final int value, final int bound) { - return () -> new Iterator<RoseTree<Integer>>() { + private static Iterable<ShrinkTree<Integer>> intShrinkingIterable(final int value, final int bound) { + return () -> new Iterator<ShrinkTree<Integer>>() { int curr = value - bound; @Override @@ -79,10 +79,10 @@ public final class Generators { } @Override - public RoseTree<Integer> next() { + public ShrinkTree<Integer> next() { int prevCurr = curr; curr = curr / 2; - return new RoseTree<>(value - prevCurr, intShrinkingIterable(value - prevCurr, bound)); + return new ShrinkTree<>(value - prevCurr, intShrinkingIterable(value - prevCurr, bound)); } }; } diff --git a/src/main/java/au/id/zancanaro/javacheck/RoseTree.java b/src/main/java/au/id/zancanaro/javacheck/ShrinkTree.java index c735b46..a424806 100644 --- a/src/main/java/au/id/zancanaro/javacheck/RoseTree.java +++ b/src/main/java/au/id/zancanaro/javacheck/ShrinkTree.java @@ -7,11 +7,11 @@ import java.util.function.Function; import java.util.function.Predicate; @SuppressWarnings("unused") -public class RoseTree<T> { +public class ShrinkTree<T> { private final T value; - private final Iterable<RoseTree<T>> children; + private final Iterable<ShrinkTree<T>> children; - public RoseTree(T value, Iterable<RoseTree<T>> children) { + public ShrinkTree(T value, Iterable<ShrinkTree<T>> children) { this.value = value; this.children = children; } @@ -20,28 +20,28 @@ public class RoseTree<T> { return value; } - public Iterator<RoseTree<T>> getChildren() { + public Iterator<ShrinkTree<T>> getChildren() { return children.iterator(); } - public static <T> RoseTree<T> pure(T value) { - return new RoseTree<>(value, Collections.emptyList()); + public static <T> ShrinkTree<T> pure(T value) { + return new ShrinkTree<>(value, Collections.emptyList()); } - public static <T> RoseTree<T> join(RoseTree<RoseTree<T>> tree) { - return new RoseTree<>( + public static <T> ShrinkTree<T> join(ShrinkTree<ShrinkTree<T>> tree) { + return new ShrinkTree<>( tree.getValue().getValue(), () -> Iterators.concat( - Iterators.mappingIterator(RoseTree::join, tree.children.iterator()), + Iterators.mappingIterator(ShrinkTree::join, tree.children.iterator()), tree.getValue().children.iterator())); } - private static <T> Iterator<RoseTree<T>[]> permutations(RoseTree<T>[] trees) { + private static <T> Iterator<ShrinkTree<T>[]> permutations(ShrinkTree<T>[] trees) { return Iterators.flatten( Iterators.rangeIterator(trees.length, index -> Iterators.mappingIterator(child -> { @SuppressWarnings("unchecked") - RoseTree<T>[] result = (RoseTree<T>[]) new RoseTree[trees.length]; + ShrinkTree<T>[] result = (ShrinkTree<T>[]) new ShrinkTree[trees.length]; for (int i = 0; i < trees.length; ++i) { result[i] = (i == index ? child : trees[i]); } @@ -50,27 +50,27 @@ public class RoseTree<T> { )); } - private static <T> List<T> makeHeadList(RoseTree<T>[] trees) { + private static <T> List<T> makeHeadList(ShrinkTree<T>[] trees) { List<T> heads = new ArrayList<>(trees.length); - for (RoseTree<T> tree : trees) { + for (ShrinkTree<T> tree : trees) { heads.add(tree.getValue()); } return heads; } - public static <T, R> RoseTree<R> zip(Function<List<T>, R> fn, RoseTree<T>[] trees) { - return new RoseTree<>( + public static <T, R> ShrinkTree<R> zip(Function<List<T>, R> fn, ShrinkTree<T>[] trees) { + return new ShrinkTree<>( fn.apply(makeHeadList(trees)), () -> Iterators.mappingIterator( - roses -> RoseTree.zip(fn, roses), - RoseTree.permutations(trees))); + shrinks -> ShrinkTree.zip(fn, shrinks), + ShrinkTree.permutations(trees))); } - private static <T> Iterator<RoseTree<T>[]> removeEach(RoseTree<T>[] trees) { + private static <T> Iterator<ShrinkTree<T>[]> removeEach(ShrinkTree<T>[] trees) { return Iterators.concat( Iterators.rangeIterator(trees.length, index -> { @SuppressWarnings("unchecked") - RoseTree<T>[] result = (RoseTree<T>[]) new RoseTree[trees.length - 1]; + ShrinkTree<T>[] result = (ShrinkTree<T>[]) new ShrinkTree[trees.length - 1]; for (int i = 0; i < trees.length - 1; ++i) { result[i] = trees[(i >= index ? i + 1 : i)]; } @@ -79,27 +79,27 @@ public class RoseTree<T> { permutations(trees)); } - public static <T, R> RoseTree<R> shrink(Function<List<T>, R> fn, RoseTree<T>[] trees) { - return new RoseTree<>( + public static <T, R> ShrinkTree<R> shrink(Function<List<T>, R> fn, ShrinkTree<T>[] trees) { + return new ShrinkTree<>( fn.apply(makeHeadList(trees)), () -> Iterators.mappingIterator( - roses -> RoseTree.shrink(fn, roses), - RoseTree.removeEach(trees))); + shrinks -> ShrinkTree.shrink(fn, shrinks), + ShrinkTree.removeEach(trees))); } - public <R> RoseTree<R> map(Function<T, R> f) { - return new RoseTree<>( + public <R> ShrinkTree<R> map(Function<T, R> f) { + return new ShrinkTree<>( f.apply(this.value), () -> Iterators.mappingIterator(tree -> tree.map(f), this.children.iterator())); } - public <R> RoseTree<R> flatMap(Function<T, RoseTree<R>> f) { - return RoseTree.join(this.map(f)); + public <R> ShrinkTree<R> flatMap(Function<T, ShrinkTree<R>> f) { + return ShrinkTree.join(this.map(f)); } - public RoseTree<T> filter(Predicate<T> predicate) { + public ShrinkTree<T> filter(Predicate<T> predicate) { if (predicate.test(this.getValue())) { - return new RoseTree<>( + return new ShrinkTree<>( this.getValue(), () -> Iterators.mappingIterator(tree -> tree.filter(predicate), Iterators.filteringIterator( @@ -119,7 +119,7 @@ public class RoseTree<T> { public void print(Writer output, Function<T, String> toString) throws IOException { output.write(toString.apply(this.getValue())); output.write('['); - for (RoseTree<T> child : children) { + for (ShrinkTree<T> child : children) { child.print(output, toString); } output.write(']'); diff --git a/src/main/java/au/id/zancanaro/javacheck/junit/Properties.java b/src/main/java/au/id/zancanaro/javacheck/junit/Properties.java index 1e3f502..b1cb375 100644 --- a/src/main/java/au/id/zancanaro/javacheck/junit/Properties.java +++ b/src/main/java/au/id/zancanaro/javacheck/junit/Properties.java @@ -1,7 +1,7 @@ package au.id.zancanaro.javacheck.junit; import au.id.zancanaro.javacheck.Generator; -import au.id.zancanaro.javacheck.RoseTree; +import au.id.zancanaro.javacheck.ShrinkTree; import au.id.zancanaro.javacheck.ShrinkResult; import au.id.zancanaro.javacheck.annotations.DataSource; import au.id.zancanaro.javacheck.annotations.Property; @@ -208,7 +208,7 @@ public class Properties extends BlockJUnit4ClassRunner { int numTests = property.runs(); for (int i = 0; i < numTests; ++i) { int size = Math.min(i + 1, maxSize); - RoseTree<Object[]> tree = generator.generate(random, size); + ShrinkTree<Object[]> tree = generator.generate(random, size); try { runTest(tree.getValue()); assumptionsViolated = 0; @@ -225,7 +225,7 @@ public class Properties extends BlockJUnit4ClassRunner { } } - private ShrinkResult shrink(RoseTree<Object[]> failed, Throwable originalEx) { + private ShrinkResult shrink(ShrinkTree<Object[]> failed, Throwable originalEx) { // this array is a mutable container so the shutdown handler can see the new version ShrinkResult[] smallest = new ShrinkResult[]{ new ShrinkResult(failed.getValue(), originalEx)}; @@ -233,10 +233,10 @@ public class Properties extends BlockJUnit4ClassRunner { Thread shutdownHandler = makeShutdownHandler(smallest, originalEx); Runtime.getRuntime().addShutdownHook(shutdownHandler); - Iterator<RoseTree<Object[]>> trees = failed.getChildren(); + Iterator<ShrinkTree<Object[]>> trees = failed.getChildren(); Set<List<Object>> seenArgs = new HashSet<>(); while (trees.hasNext()) { - RoseTree<Object[]> tree = trees.next(); + ShrinkTree<Object[]> tree = trees.next(); if (seenArgs.add(Arrays.asList(tree.getValue()))) { try { runTest(tree.getValue()); @@ -244,7 +244,7 @@ public class Properties extends BlockJUnit4ClassRunner { // ignore, because it's not useful } catch (Throwable ex) { smallest[0] = new ShrinkResult(tree.getValue(), ex); - Iterator<RoseTree<Object[]>> children = tree.getChildren(); + Iterator<ShrinkTree<Object[]>> children = tree.getChildren(); if (children.hasNext()) { trees = children; } else { |