From b2055f2a1dd2117cdd05ab6596c38c82d3d05240 Mon Sep 17 00:00:00 2001 From: Carlo Zancanaro Date: Thu, 11 Jun 2015 00:27:06 +1000 Subject: Report command lists more nicely (line breaks between commands); report number of nodes visited during shrinking; other small fixes --- src/main/java/au/id/zancanaro/javacheck/ShrinkResult.java | 6 +++++- .../java/au/id/zancanaro/javacheck/junit/Properties.java | 12 ++++++++---- .../java/au/id/zancanaro/javacheck/junit/PropertyError.java | 8 ++++---- .../java/au/id/zancanaro/javacheck/state/CommandList.java | 8 ++++++-- .../id/zancanaro/javacheck/state/CommandListGenerator.java | 7 +++++++ .../java/au/id/zancanaro/javacheck/state/CommandValue.java | 2 +- .../au/id/zancanaro/javacheck/state/GeneratedCommand.java | 6 +++++- 7 files changed, 36 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/main/java/au/id/zancanaro/javacheck/ShrinkResult.java b/src/main/java/au/id/zancanaro/javacheck/ShrinkResult.java index 6bf3882..f135cee 100644 --- a/src/main/java/au/id/zancanaro/javacheck/ShrinkResult.java +++ b/src/main/java/au/id/zancanaro/javacheck/ShrinkResult.java @@ -5,9 +5,13 @@ import java.util.List; public class ShrinkResult { public final List args; public final Throwable thrown; + public final int depth; + public final int visited; - public ShrinkResult(List args, Throwable thrown) { + public ShrinkResult(List args, Throwable thrown, int depth, int visited) { this.args = args; this.thrown = thrown; + this.depth = depth; + this.visited = visited; } } 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 c428edc..175cd6c 100644 --- a/src/main/java/au/id/zancanaro/javacheck/junit/Properties.java +++ b/src/main/java/au/id/zancanaro/javacheck/junit/Properties.java @@ -116,26 +116,30 @@ public class Properties extends BlockJUnit4ClassRunner { private ShrinkResult shrink(ShrinkTree> 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)}; + new ShrinkResult(failed.getValue(), originalEx, 0, 0)}; Thread shutdownHandler = makeShutdownHandler(smallest, originalEx); Runtime.getRuntime().addShutdownHook(shutdownHandler); + int depth = 0; + int visited = 0; Set> seenArgs = new HashSet<>(); Iterator>> trees = failed.getChildren().iterator(); while (trees.hasNext()) { ShrinkTree> tree = trees.next(); List value = tree.getValue(); - boolean haveSeen = seenArgs.add(Arrays.asList(value)); - if (haveSeen) { + boolean notSeen = seenArgs.add(Arrays.asList(value)); + if (notSeen) { + visited++; try { runTest(value.toArray()); } catch (AssumptionViolatedException ex) { // ignore, because it's not useful } catch (Throwable ex) { - smallest[0] = new ShrinkResult(tree.getValue(), ex); + smallest[0] = new ShrinkResult(tree.getValue(), ex, depth, visited); Iterator>> children = tree.getChildren().iterator(); if (children.hasNext()) { + depth++; trees = children; } else { break; 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 5f89ca8..4f02a56 100644 --- a/src/main/java/au/id/zancanaro/javacheck/junit/PropertyError.java +++ b/src/main/java/au/id/zancanaro/javacheck/junit/PropertyError.java @@ -9,12 +9,12 @@ import java.util.List; 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", + String.format("%s(%s)%n\tSeed: %s%n\tVisited: %s; Depth: %s", methodName, joinArgs(shrunk.args), - seed): - String.format("%s(%s)%n\tSeed: %s%n%s", + seed, shrunk.visited, shrunk.depth): + String.format("%s(%s)%n\tSeed: %s%n\tVisited: %s; Depth: %s%n%s", methodName, joinArgs(shrunk.args), - seed, + seed, shrunk.visited, shrunk.depth, shrunk.thrown.getMessage())); initCause(shrunk.thrown); } diff --git a/src/main/java/au/id/zancanaro/javacheck/state/CommandList.java b/src/main/java/au/id/zancanaro/javacheck/state/CommandList.java index 31fbc12..6dc8976 100644 --- a/src/main/java/au/id/zancanaro/javacheck/state/CommandList.java +++ b/src/main/java/au/id/zancanaro/javacheck/state/CommandList.java @@ -11,6 +11,10 @@ public class CommandList { this.commands = new ArrayList<>(commands); } + public int size() { + return commands.size(); + } + public CommandResult run(S initialState) { Map values = new HashMap<>(); CommandResult result = CommandResult.success(initialState); @@ -86,9 +90,9 @@ public class CommandList { while (iterator.hasNext()) { builder.append(iterator.next()); if (iterator.hasNext()) { - builder.append(", "); + builder.append(", \n\t"); } } - return builder.toString(); + return "\n\t" + builder.toString(); } } diff --git a/src/main/java/au/id/zancanaro/javacheck/state/CommandListGenerator.java b/src/main/java/au/id/zancanaro/javacheck/state/CommandListGenerator.java index c5cda59..0eb1793 100644 --- a/src/main/java/au/id/zancanaro/javacheck/state/CommandListGenerator.java +++ b/src/main/java/au/id/zancanaro/javacheck/state/CommandListGenerator.java @@ -3,8 +3,15 @@ package au.id.zancanaro.javacheck.state; import au.id.zancanaro.javacheck.Generator; import au.id.zancanaro.javacheck.ShrinkTree; +import java.util.Arrays; import java.util.Random; +import java.util.Spliterator; +import java.util.Spliterators; import java.util.function.Function; +import java.util.function.IntConsumer; +import java.util.stream.IntStream; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; import static au.id.zancanaro.javacheck.Generator.pure; import static au.id.zancanaro.javacheck.Generators.noShrink; diff --git a/src/main/java/au/id/zancanaro/javacheck/state/CommandValue.java b/src/main/java/au/id/zancanaro/javacheck/state/CommandValue.java index d2f3419..de0dfc5 100644 --- a/src/main/java/au/id/zancanaro/javacheck/state/CommandValue.java +++ b/src/main/java/au/id/zancanaro/javacheck/state/CommandValue.java @@ -46,7 +46,7 @@ public class CommandValue { @SuppressWarnings("unchecked") public T get() { - if (values.containsKey(id)) { + if (values != null && values.containsKey(id)) { return (T) values.get(id); } else { throw new NoSuchElementException("Concrete values cannot be supplied prior to being calculated"); diff --git a/src/main/java/au/id/zancanaro/javacheck/state/GeneratedCommand.java b/src/main/java/au/id/zancanaro/javacheck/state/GeneratedCommand.java index 92a90f9..85f6fdd 100644 --- a/src/main/java/au/id/zancanaro/javacheck/state/GeneratedCommand.java +++ b/src/main/java/au/id/zancanaro/javacheck/state/GeneratedCommand.java @@ -43,6 +43,10 @@ public class GeneratedCommand { @Override public String toString() { - return "#{" + id + "} = " + command + " <- " + args; + if (args == null) { + return "#{" + id + "} = " + command; + } else { + return "#{" + id + "} = " + command + " <- " + args; + } } } -- cgit v1.2.3