From 27fcf37206591c774d79ec60de8d404ed83378ac Mon Sep 17 00:00:00 2001 From: Carlo Zancanaro Date: Tue, 2 Jun 2015 18:10:13 +1000 Subject: Fix up some static analysis warnings and improve @DataPoint detection --- .../java/au/id/zancanaro/javacheck/Generator.java | 7 +-- .../java/au/id/zancanaro/javacheck/Generators.java | 9 +++- .../java/au/id/zancanaro/javacheck/Iterators.java | 1 + .../java/au/id/zancanaro/javacheck/RoseTree.java | 19 ++++---- .../id/zancanaro/javacheck/junit/Properties.java | 57 ++++++++++++---------- .../zancanaro/javacheck/junit/PropertyError.java | 4 +- 6 files changed, 54 insertions(+), 43 deletions(-) diff --git a/src/main/java/au/id/zancanaro/javacheck/Generator.java b/src/main/java/au/id/zancanaro/javacheck/Generator.java index 4b9113c..c28d967 100644 --- a/src/main/java/au/id/zancanaro/javacheck/Generator.java +++ b/src/main/java/au/id/zancanaro/javacheck/Generator.java @@ -19,6 +19,7 @@ import java.util.function.Function; * * @param The type generated by this generator. */ +@SuppressWarnings("unused") public interface Generator { /** * Return a {@link RoseTree} containing a new random value of the required @@ -115,9 +116,9 @@ public interface Generator { /** * Produce a new generator relying on the value generated by this generator * - * Shrinking is a bit hard to predict under {@link #flatMap}, as it will - * first attempt to shrink this, resulting in the re-evaluation of action, - * and hence the re-generation of the subtree. + * Shrinking is a bit hard to predict under flatMap, as it will first + * attempt to shrink this, resulting in the re-evaluation of action, and + * hence the re-generation of the subtree. * * @param action A function to produce the new generator * @param The type of the returned generator diff --git a/src/main/java/au/id/zancanaro/javacheck/Generators.java b/src/main/java/au/id/zancanaro/javacheck/Generators.java index eab3eed..548bd29 100644 --- a/src/main/java/au/id/zancanaro/javacheck/Generators.java +++ b/src/main/java/au/id/zancanaro/javacheck/Generators.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.function.Function; import java.util.function.Predicate; +@SuppressWarnings("unused") public final class Generators { private Generators() { } @@ -26,6 +27,12 @@ public final class Generators { }; } + public static Generator noShrink(Generator gen) { + return (random, size) -> new RoseTree<>( + gen.generate(random, size).getValue(), + Collections.emptyList()); + } + @SafeVarargs public static Generator oneOf(Generator... gens) { return integer(0, gens.length).flatMap(index -> gens[index]); @@ -91,8 +98,6 @@ public final class Generators { }; } - ; - public static Generator> listOf(Generator gen) { return (random, size) -> { Generator countGen = sized(s -> integer(0, s)); diff --git a/src/main/java/au/id/zancanaro/javacheck/Iterators.java b/src/main/java/au/id/zancanaro/javacheck/Iterators.java index 33652b2..3f365eb 100644 --- a/src/main/java/au/id/zancanaro/javacheck/Iterators.java +++ b/src/main/java/au/id/zancanaro/javacheck/Iterators.java @@ -95,6 +95,7 @@ public final class Iterators { } + @SuppressWarnings("WeakerAccess") public static EmptyIterator emptyIterator() { return new EmptyIterator<>(); } diff --git a/src/main/java/au/id/zancanaro/javacheck/RoseTree.java b/src/main/java/au/id/zancanaro/javacheck/RoseTree.java index 5a54d6f..c735b46 100644 --- a/src/main/java/au/id/zancanaro/javacheck/RoseTree.java +++ b/src/main/java/au/id/zancanaro/javacheck/RoseTree.java @@ -6,6 +6,7 @@ import java.util.*; import java.util.function.Function; import java.util.function.Predicate; +@SuppressWarnings("unused") public class RoseTree { private final T value; private final Iterable> children; @@ -49,14 +50,17 @@ public class RoseTree { )); } - public static RoseTree zip(Function, R> fn, RoseTree[] trees) { - @SuppressWarnings("unchecked") - List heads = new ArrayList(trees.length); + private static List makeHeadList(RoseTree[] trees) { + List heads = new ArrayList<>(trees.length); for (RoseTree tree : trees) { heads.add(tree.getValue()); } + return heads; + } + + public static RoseTree zip(Function, R> fn, RoseTree[] trees) { return new RoseTree<>( - fn.apply(heads), + fn.apply(makeHeadList(trees)), () -> Iterators.mappingIterator( roses -> RoseTree.zip(fn, roses), RoseTree.permutations(trees))); @@ -76,13 +80,8 @@ public class RoseTree { } public static RoseTree shrink(Function, R> fn, RoseTree[] trees) { - @SuppressWarnings("unchecked") - List heads = new ArrayList(trees.length); - for (RoseTree tree : trees) { - heads.add(tree.getValue()); - } return new RoseTree<>( - fn.apply(heads), + fn.apply(makeHeadList(trees)), () -> Iterators.mappingIterator( roses -> RoseTree.shrink(fn, roses), RoseTree.removeEach(trees))); 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 6ff0538..1e3f502 100644 --- a/src/main/java/au/id/zancanaro/javacheck/junit/Properties.java +++ b/src/main/java/au/id/zancanaro/javacheck/junit/Properties.java @@ -16,6 +16,7 @@ import org.junit.runners.model.TestClass; import java.lang.reflect.*; import java.util.*; +@SuppressWarnings("WeakerAccess") public class Properties extends BlockJUnit4ClassRunner { private final Map> generators = new HashMap<>(); @@ -35,32 +36,36 @@ public class Properties extends BlockJUnit4ClassRunner { Field[] fields = getTestClass().getJavaClass().getDeclaredFields(); for (Field field : fields) { - if (!field.isAnnotationPresent(DataSource.class)) { - continue; - } - Type type = field.getGenericType(); - if (!(type instanceof ParameterizedType)) { - continue; - } - ParameterizedType parameterizedType = (ParameterizedType) type; - if (!(parameterizedType.getRawType() instanceof Class)) { - continue; - } - Class c = (Class) parameterizedType.getRawType(); - if (c != Generator.class) { - continue; - } - boolean error = false; - if (!Modifier.isStatic(field.getModifiers())) { - errors.add(new Error("Generator field " + field.getName() + " must be static")); - error = true; - } - if (!Modifier.isPublic(field.getModifiers())) { - errors.add(new Error("Generator field " + field.getName() + " must be public")); - error = true; - } - if (!error) { - result.add(parameterizedType.getActualTypeArguments()[0]); + if (field.isAnnotationPresent(DataSource.class)) { + boolean error = false; + if (!Modifier.isStatic(field.getModifiers())) { + errors.add(new Error("@DataSource field " + field.getName() + " must be static")); + error = true; + } + if (!Modifier.isPublic(field.getModifiers())) { + errors.add(new Error("@DataSource field " + field.getName() + " must be public")); + error = true; + } + + Type type = field.getGenericType(); + ParameterizedType parameterizedType;; + if (type instanceof ParameterizedType) { + parameterizedType = (ParameterizedType) type; + if (parameterizedType.getRawType() instanceof Class) { + Class c = (Class) parameterizedType.getRawType(); + if (c == Generator.class) { + if (!error) { + result.add(parameterizedType.getActualTypeArguments()[0]); + } + } else { + errors.add(new Error("@DataSource fields must be of type Generator")); + } + } else { + errors.add(new Error("@DataSource fields must be of type Generator")); + } + } else { + errors.add(new Error("@DataSource fields must be of type Generator")); + } } } return result; 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 2cd1325..44c071b 100644 --- a/src/main/java/au/id/zancanaro/javacheck/junit/PropertyError.java +++ b/src/main/java/au/id/zancanaro/javacheck/junit/PropertyError.java @@ -5,6 +5,7 @@ import au.id.zancanaro.javacheck.ShrinkResult; import java.util.Arrays; import java.util.Iterator; +@SuppressWarnings("WeakerAccess") public class PropertyError extends AssertionError { public PropertyError(String methodName, long seed, ShrinkResult shrunk) { super(shrunk.thrown.getMessage() == null ? @@ -18,8 +19,7 @@ public class PropertyError extends AssertionError { initCause(shrunk.thrown); } - - public static String joinArgs(Object... params) { + private static String joinArgs(Object... params) { StringBuilder sb = new StringBuilder(); Iterator iterator = Arrays.asList(params).iterator(); while (iterator.hasNext()) { -- cgit v1.2.3