summaryrefslogtreecommitdiff
path: root/src/main/java/au/id/zancanaro/javacheck
diff options
context:
space:
mode:
authorCarlo Zancanaro <carlo@zancanaro.id.au>2015-06-02 18:10:13 +1000
committerCarlo Zancanaro <carlo@zancanaro.id.au>2015-06-02 18:10:13 +1000
commit27fcf37206591c774d79ec60de8d404ed83378ac (patch)
tree26e71761085a282bc9f31dad4f9624c86ea3aac4 /src/main/java/au/id/zancanaro/javacheck
parent140b4d41d695f32e75c785f6179430f677d244ae (diff)
Fix up some static analysis warnings and improve @DataPoint detection
Diffstat (limited to 'src/main/java/au/id/zancanaro/javacheck')
-rw-r--r--src/main/java/au/id/zancanaro/javacheck/Generator.java7
-rw-r--r--src/main/java/au/id/zancanaro/javacheck/Generators.java9
-rw-r--r--src/main/java/au/id/zancanaro/javacheck/Iterators.java1
-rw-r--r--src/main/java/au/id/zancanaro/javacheck/RoseTree.java19
-rw-r--r--src/main/java/au/id/zancanaro/javacheck/junit/Properties.java57
-rw-r--r--src/main/java/au/id/zancanaro/javacheck/junit/PropertyError.java4
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 <T> The type generated by this generator.
*/
+@SuppressWarnings("unused")
public interface Generator<T> {
/**
* Return a {@link RoseTree} containing a new random value of the required
@@ -115,9 +116,9 @@ public interface Generator<T> {
/**
* 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 <R> 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 <T> Generator<T> noShrink(Generator<T> gen) {
+ return (random, size) -> new RoseTree<>(
+ gen.generate(random, size).getValue(),
+ Collections.emptyList());
+ }
+
@SafeVarargs
public static <T> Generator<T> oneOf(Generator<T>... gens) {
return integer(0, gens.length).flatMap(index -> gens[index]);
@@ -91,8 +98,6 @@ public final class Generators {
};
}
- ;
-
public static <T> Generator<List<T>> listOf(Generator<T> gen) {
return (random, size) -> {
Generator<Integer> 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 <T> EmptyIterator<T> 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<T> {
private final T value;
private final Iterable<RoseTree<T>> children;
@@ -49,14 +50,17 @@ public class RoseTree<T> {
));
}
- public static <T, R> RoseTree<R> zip(Function<List<T>, R> fn, RoseTree<T>[] trees) {
- @SuppressWarnings("unchecked")
- List<T> heads = new ArrayList(trees.length);
+ private static <T> List<T> makeHeadList(RoseTree<T>[] trees) {
+ List<T> heads = new ArrayList<>(trees.length);
for (RoseTree<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<>(
- fn.apply(heads),
+ fn.apply(makeHeadList(trees)),
() -> Iterators.mappingIterator(
roses -> RoseTree.zip(fn, roses),
RoseTree.permutations(trees)));
@@ -76,13 +80,8 @@ public class RoseTree<T> {
}
public static <T, R> RoseTree<R> shrink(Function<List<T>, R> fn, RoseTree<T>[] trees) {
- @SuppressWarnings("unchecked")
- List<T> heads = new ArrayList(trees.length);
- for (RoseTree<T> 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<Type, Generator<?>> 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<T>"));
+ }
+ } else {
+ errors.add(new Error("@DataSource fields must be of type Generator<T>"));
+ }
+ } else {
+ errors.add(new Error("@DataSource fields must be of type Generator<T>"));
+ }
}
}
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<Object> iterator = Arrays.asList(params).iterator();
while (iterator.hasNext()) {