diff options
Diffstat (limited to 'src/main/java/au/id/zancanaro/javacheck')
7 files changed, 44 insertions, 49 deletions
diff --git a/src/main/java/au/id/zancanaro/javacheck/Generator.java b/src/main/java/au/id/zancanaro/javacheck/Generator.java index 076f7c2..2d2e556 100644 --- a/src/main/java/au/id/zancanaro/javacheck/Generator.java +++ b/src/main/java/au/id/zancanaro/javacheck/Generator.java @@ -40,8 +40,6 @@ public interface Generator<T> { } default <R> Generator<R> flatMap(Function<T, Generator<R>> action) { - return (random, size) -> { - return RoseTree.join(this.generate(random, size).map(action).map(g -> g.generate(random, size))); - }; + return (random, size) -> RoseTree.join(this.generate(random, size).map(action).map(g -> g.generate(random, size))); } } diff --git a/src/main/java/au/id/zancanaro/javacheck/Generators.java b/src/main/java/au/id/zancanaro/javacheck/Generators.java index 08b9989..bf1b1b3 100644 --- a/src/main/java/au/id/zancanaro/javacheck/Generators.java +++ b/src/main/java/au/id/zancanaro/javacheck/Generators.java @@ -15,13 +15,13 @@ public final class Generators { return (random, size) -> makeGenerator.apply(size).generate(random, size); } - public static <T> Generator<T> suchThat(Generator<T> gen, Predicate<T> pred) { + public static <T> Generator<T> suchThat(Generator<T> gen, Predicate<T> predicate) { return (random, size) -> { RoseTree<T> result = gen.generate(random, size); - if (pred.test(result.getValue())) { - return result.filter(pred); + if (predicate.test(result.getValue())) { + return result.filter(predicate); } else { - return suchThat(gen, pred).generate(random, size); + return suchThat(gen, predicate).generate(random, size); } }; } diff --git a/src/main/java/au/id/zancanaro/javacheck/Iterators.java b/src/main/java/au/id/zancanaro/javacheck/Iterators.java index 347a927..33652b2 100644 --- a/src/main/java/au/id/zancanaro/javacheck/Iterators.java +++ b/src/main/java/au/id/zancanaro/javacheck/Iterators.java @@ -3,6 +3,7 @@ package au.id.zancanaro.javacheck; import java.util.Collections; import java.util.Iterator; import java.util.List; +import java.util.NoSuchElementException; import java.util.function.Function; import java.util.function.Predicate; @@ -11,7 +12,7 @@ public final class Iterators { } public static <T> RangeIterator<T> rangeIterator(int countTo, Function<Integer,T> fn) { - return new RangeIterator<T>(countTo, fn); + return new RangeIterator<>(countTo, fn); } private static class RangeIterator<T> implements Iterator<T> { @@ -39,9 +40,9 @@ public final class Iterators { return new FlattenIterator<>(iterators); } public static class FlattenIterator<T> implements Iterator<T> { - private Iterator<T> current; + private final Iterator<Iterator<T>> iterators; - private Iterator<Iterator<T>> iterators; + private Iterator<T> current; public FlattenIterator(Iterator<Iterator<T>> iterators) { this.current = Iterators.emptyIterator(); @@ -105,7 +106,7 @@ public final class Iterators { } @Override public T next() { - return null; + throw new NoSuchElementException("Empty iterators contain no elements"); } } @@ -134,8 +135,8 @@ public final class Iterators { } - public static <T> FilteringIterator<T> filteringIterator(Predicate<T> pred, Iterator<T> iterator) { - return new FilteringIterator<>(pred, iterator); + public static <T> FilteringIterator<T> filteringIterator(Predicate<T> predicate, Iterator<T> iterator) { + return new FilteringIterator<>(predicate, iterator); } private static class FilteringIterator<T> implements Iterator<T> { @@ -143,8 +144,8 @@ public final class Iterators { private final Iterator<T> iterator; private List<T> nextValue; - public FilteringIterator(Predicate<T> pred, Iterator<T> iterator) { - this.predicate = pred; + public FilteringIterator(Predicate<T> predicate, Iterator<T> iterator) { + this.predicate = predicate; this.iterator = iterator; this.nextValue = null; } diff --git a/src/main/java/au/id/zancanaro/javacheck/RoseTree.java b/src/main/java/au/id/zancanaro/javacheck/RoseTree.java index 86952da..5a54d6f 100644 --- a/src/main/java/au/id/zancanaro/javacheck/RoseTree.java +++ b/src/main/java/au/id/zancanaro/javacheck/RoseTree.java @@ -36,8 +36,9 @@ public class RoseTree<T> { } private static <T> Iterator<RoseTree<T>[]> permutations(RoseTree<T>[] trees) { - return Iterators.flatten(Iterators.rangeIterator(trees.length, index -> - Iterators.mappingIterator(child -> { + return Iterators.flatten( + Iterators.rangeIterator(trees.length, + index -> Iterators.mappingIterator(child -> { @SuppressWarnings("unchecked") RoseTree<T>[] result = (RoseTree<T>[]) new RoseTree[trees.length]; for (int i = 0; i < trees.length; ++i) { @@ -45,14 +46,14 @@ public class RoseTree<T> { } return result; }, trees[index].getChildren()) - )); + )); } public static <T, R> RoseTree<R> zip(Function<List<T>, R> fn, RoseTree<T>[] trees) { @SuppressWarnings("unchecked") List<T> heads = new ArrayList(trees.length); - for (int i = 0; i < trees.length; ++i) { - heads.add(trees[i].getValue()); + for (RoseTree<T> tree : trees) { + heads.add(tree.getValue()); } return new RoseTree<>( fn.apply(heads), diff --git a/src/main/java/au/id/zancanaro/javacheck/ShrinkResult.java b/src/main/java/au/id/zancanaro/javacheck/ShrinkResult.java index e1463f0..8776f4e 100644 --- a/src/main/java/au/id/zancanaro/javacheck/ShrinkResult.java +++ b/src/main/java/au/id/zancanaro/javacheck/ShrinkResult.java @@ -1,11 +1,13 @@ package au.id.zancanaro.javacheck; +import java.util.Arrays; + public class ShrinkResult { public final Object[] args; public final Throwable thrown; public ShrinkResult(Object[] args, Throwable thrown) { - this.args = args; + this.args = Arrays.copyOf(args, args.length); this.thrown = thrown; } } 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 0507413..64bd9ab 100644 --- a/src/main/java/au/id/zancanaro/javacheck/junit/Properties.java +++ b/src/main/java/au/id/zancanaro/javacheck/junit/Properties.java @@ -16,12 +16,11 @@ import org.junit.runners.model.TestClass; import java.lang.reflect.*; import java.util.*; - public class Properties extends BlockJUnit4ClassRunner { private final Map<Type, Generator<?>> generators = new HashMap<>(); - public Properties(Class<?> klass) throws InitializationError { - super(klass); + public Properties(Class<?> classObject) throws InitializationError { + super(classObject); } @Override @@ -43,11 +42,11 @@ public class Properties extends BlockJUnit4ClassRunner { if (!(type instanceof ParameterizedType)) { continue; } - ParameterizedType ptype = (ParameterizedType) type; - if (!(ptype.getRawType() instanceof Class)) { + ParameterizedType parameterizedType = (ParameterizedType) type; + if (!(parameterizedType.getRawType() instanceof Class)) { continue; } - Class<?> c = (Class) ptype.getRawType(); + Class<?> c = (Class) parameterizedType.getRawType(); if (c != Generator.class) { continue; } @@ -61,7 +60,7 @@ public class Properties extends BlockJUnit4ClassRunner { error = true; } if (!error) { - result.add(ptype.getActualTypeArguments()[0]); + result.add(parameterizedType.getActualTypeArguments()[0]); } } return result; @@ -105,16 +104,16 @@ public class Properties extends BlockJUnit4ClassRunner { if (!(type instanceof ParameterizedType)) { continue; } - ParameterizedType ptype = (ParameterizedType) type; - if (!(ptype.getRawType() instanceof Class)) { + ParameterizedType parameterizedType = (ParameterizedType) type; + if (!(parameterizedType.getRawType() instanceof Class)) { continue; } - Class<?> c = (Class) ptype.getRawType(); + Class<?> c = (Class) parameterizedType.getRawType(); if (c != Generator.class) { continue; } try { - Type target = ptype.getActualTypeArguments()[0]; + Type target = parameterizedType.getActualTypeArguments()[0]; @SuppressWarnings("unchecked") Generator<Object> generator = (Generator<Object>) field.get(null); generators.put(target, generator); @@ -122,7 +121,7 @@ public class Properties extends BlockJUnit4ClassRunner { generators.put(rawTypes.get(target), generator); } } catch (IllegalAccessException ex) { - + throw new RuntimeException(ex); } } } @@ -213,7 +212,6 @@ public class Properties extends BlockJUnit4ClassRunner { if (assumptionsViolated++ == 50) { throw new Error("Violated 50 assumptions in a row: failing test"); } - ; } catch (Throwable ex) { // tree.print(new OutputStreamWriter(System.out), Arrays::toString); throw new PropertyError(method.getName(), seed, shrink(tree, ex)); diff --git a/src/main/java/au/id/zancanaro/javacheck/junit/PropertyError.java b/src/main/java/au/id/zancanaro/javacheck/junit/PropertyError.java index 138c47f..2cd1325 100644 --- a/src/main/java/au/id/zancanaro/javacheck/junit/PropertyError.java +++ b/src/main/java/au/id/zancanaro/javacheck/junit/PropertyError.java @@ -3,35 +3,30 @@ package au.id.zancanaro.javacheck.junit; import au.id.zancanaro.javacheck.ShrinkResult; import java.util.Arrays; -import java.util.Collection; import java.util.Iterator; public class PropertyError extends AssertionError { public PropertyError(String methodName, long seed, ShrinkResult shrunk) { super(shrunk.thrown.getMessage() == null ? - String.format("%s(%s)\n\tSeed: %s", - methodName, join(", ", shrunk.args), + String.format("%s(%s)%n\tSeed: %s", + methodName, joinArgs(shrunk.args), seed): - String.format("%s(%s)\n\tSeed: %s\n%s", - methodName, join(", ", shrunk.args), + String.format("%s(%s)%n\tSeed: %s%n%s", + methodName, joinArgs(shrunk.args), seed, shrunk.thrown.getMessage())); initCause(shrunk.thrown); } - public static String join(String delimiter, Object... params) { - return join(delimiter, Arrays.asList(params)); - } - - public static String join(String delimiter, Collection<Object> values) { + public static String joinArgs(Object... params) { StringBuilder sb = new StringBuilder(); - Iterator<Object> iter = values.iterator(); - while (iter.hasNext()) { - Object next = iter.next(); + Iterator<Object> iterator = Arrays.asList(params).iterator(); + while (iterator.hasNext()) { + Object next = iterator.next(); sb.append(stringValueOf(next)); - if (iter.hasNext()) { - sb.append(delimiter); + if (iterator.hasNext()) { + sb.append(", "); } } return sb.toString(); |