From 8c23256f467058c4d23ab42d09e132f5785b236d Mon Sep 17 00:00:00 2001 From: Alberto Scotto Date: Thu, 12 May 2016 16:23:42 +0100 Subject: [PATCH 1/8] add unit test showing bug --- .../results/ResultMatchersTest.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java b/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java index 024fe32b09fa..b1d34e1d0f01 100644 --- a/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java +++ b/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java @@ -1,12 +1,16 @@ package org.junit.tests.experimental.results; -import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; - import org.junit.Test; +import org.junit.experimental.results.PrintableResult; import org.junit.experimental.results.ResultMatchers; import org.junit.experimental.theories.Theory; +import org.junit.runner.notification.Failure; + +import java.util.ArrayList; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; public class ResultMatchersTest { @Test @@ -20,4 +24,10 @@ public void hasFailuresDescriptionReflectsInput(int i) { assertThat(ResultMatchers.failureCountIs(i).toString(), containsString("" + i)); } + + @Test + public void hasFailureContaining_givenNonMatchingScenario() { + PrintableResult resultWithNoFailures = new PrintableResult(new ArrayList()); + assertThat(ResultMatchers.hasFailureContaining("").matches(resultWithNoFailures), is(false)); + } } From e5e47b309bc408c7acc29aefb0674aaa0b011315 Mon Sep 17 00:00:00 2001 From: Alberto Scotto Date: Fri, 13 May 2016 01:46:14 +0100 Subject: [PATCH 2/8] add ResultMatchers#failureCount Also, introduce hamcrest-library as a dependency. hamcrest-library contains more Matchers. --- pom.xml | 2 +- .../experimental/results/ResultMatchers.java | 16 ++++++++++++++++ .../experimental/results/ResultMatchersTest.java | 9 +++++++-- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index c1d66d6354af..7e073a5298ed 100644 --- a/pom.xml +++ b/pom.xml @@ -110,7 +110,7 @@ org.hamcrest - hamcrest-core + hamcrest-library 1.3 diff --git a/src/main/java/org/junit/experimental/results/ResultMatchers.java b/src/main/java/org/junit/experimental/results/ResultMatchers.java index 98778a9f924e..f7a9946b8073 100644 --- a/src/main/java/org/junit/experimental/results/ResultMatchers.java +++ b/src/main/java/org/junit/experimental/results/ResultMatchers.java @@ -46,6 +46,22 @@ public boolean matchesSafely(PrintableResult item) { }; } + /** + * Matches if the number of failures matches {@code countMatcher} + */ + public static Matcher failureCount(final Matcher countMatcher) { + return new TypeSafeMatcher() { + public void describeTo(Description description) { + description.appendText("has a number of failures matching " + countMatcher); + } + + @Override + public boolean matchesSafely(PrintableResult item) { + return countMatcher.matches(item.failureCount()); + } + }; + } + /** * Matches if the result has exactly one failure, and it contains {@code string} */ diff --git a/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java b/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java index b1d34e1d0f01..57155c797439 100644 --- a/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java +++ b/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java @@ -8,8 +8,7 @@ import java.util.ArrayList; -import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.Matchers.*; import static org.junit.Assert.assertThat; public class ResultMatchersTest { @@ -30,4 +29,10 @@ public void hasFailureContaining_givenNonMatchingScenario() { PrintableResult resultWithNoFailures = new PrintableResult(new ArrayList()); assertThat(ResultMatchers.hasFailureContaining("").matches(resultWithNoFailures), is(false)); } + + @Test + public void failureCount_nonMatchingScenario() { + PrintableResult resultWithNoFailures = new PrintableResult(new ArrayList()); + assertThat(ResultMatchers.failureCount(greaterThanOrEqualTo(3)).matches(resultWithNoFailures), is(false)); + } } From 9b1bc4acb73042ded8a3a553631aa4f936a6918a Mon Sep 17 00:00:00 2001 From: Alberto Scotto Date: Fri, 13 May 2016 01:49:18 +0100 Subject: [PATCH 3/8] refactor: define failureCountIs in terms of failureCount --- .../junit/experimental/results/ResultMatchers.java | 13 +++---------- .../experimental/results/ResultMatchersTest.java | 3 ++- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/junit/experimental/results/ResultMatchers.java b/src/main/java/org/junit/experimental/results/ResultMatchers.java index f7a9946b8073..6c1590dad4e2 100644 --- a/src/main/java/org/junit/experimental/results/ResultMatchers.java +++ b/src/main/java/org/junit/experimental/results/ResultMatchers.java @@ -5,6 +5,8 @@ import org.hamcrest.Matcher; import org.hamcrest.TypeSafeMatcher; +import static org.hamcrest.Matchers.equalTo; + /** * Matchers on a PrintableResult, to enable JUnit self-tests. * For example: @@ -34,16 +36,7 @@ public static Matcher isSuccessful() { * Matches if there are {@code count} failures */ public static Matcher failureCountIs(final int count) { - return new TypeSafeMatcher() { - public void describeTo(Description description) { - description.appendText("has " + count + " failures"); - } - - @Override - public boolean matchesSafely(PrintableResult item) { - return item.failureCount() == count; - } - }; + return failureCount(equalTo(count)); } /** diff --git a/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java b/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java index 57155c797439..6885cd10c308 100644 --- a/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java +++ b/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java @@ -12,10 +12,11 @@ import static org.junit.Assert.assertThat; public class ResultMatchersTest { + @Test public void hasFailuresHasGoodDescription() { assertThat(ResultMatchers.failureCountIs(3).toString(), - is("has 3 failures")); + is("has a number of failures matching <3>")); } @Theory From 9f5dfd8c1a9a006bc2e5d93a9bc770f2449e7afa Mon Sep 17 00:00:00 2001 From: Alberto Scotto Date: Fri, 13 May 2016 01:53:21 +0100 Subject: [PATCH 4/8] fix ResultMatchers#hasFailureContaining It should not match when the given PrintableResult has no failures. --- .../java/org/junit/experimental/results/ResultMatchers.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/junit/experimental/results/ResultMatchers.java b/src/main/java/org/junit/experimental/results/ResultMatchers.java index 6c1590dad4e2..0b941c2eb444 100644 --- a/src/main/java/org/junit/experimental/results/ResultMatchers.java +++ b/src/main/java/org/junit/experimental/results/ResultMatchers.java @@ -6,6 +6,7 @@ import org.hamcrest.TypeSafeMatcher; import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.greaterThan; /** * Matchers on a PrintableResult, to enable JUnit self-tests. @@ -77,7 +78,7 @@ public void describeTo(Description description) { public static Matcher hasFailureContaining(final String string) { return new BaseMatcher() { public boolean matches(Object item) { - return item.toString().contains(string); + return failureCount(greaterThan(0)).matches(item) && item.toString().contains(string); } public void describeTo(Description description) { From 69e8a8a6b3d3d1074476463e85dcfef3b9feb0c7 Mon Sep 17 00:00:00 2001 From: Alberto Scotto Date: Sat, 14 May 2016 19:42:16 +0100 Subject: [PATCH 5/8] avoid depending on hamcrest-library also improve unit tests --- pom.xml | 2 +- .../experimental/results/ResultMatchers.java | 9 ++++----- .../results/ResultMatchersTest.java | 18 +++++++++++++----- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 7e073a5298ed..c1d66d6354af 100644 --- a/pom.xml +++ b/pom.xml @@ -110,7 +110,7 @@ org.hamcrest - hamcrest-library + hamcrest-core 1.3 diff --git a/src/main/java/org/junit/experimental/results/ResultMatchers.java b/src/main/java/org/junit/experimental/results/ResultMatchers.java index 0b941c2eb444..6da48379e4b0 100644 --- a/src/main/java/org/junit/experimental/results/ResultMatchers.java +++ b/src/main/java/org/junit/experimental/results/ResultMatchers.java @@ -5,8 +5,7 @@ import org.hamcrest.Matcher; import org.hamcrest.TypeSafeMatcher; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.CoreMatchers.equalTo; /** * Matchers on a PrintableResult, to enable JUnit self-tests. @@ -76,9 +75,9 @@ public void describeTo(Description description) { * contains {@code string} */ public static Matcher hasFailureContaining(final String string) { - return new BaseMatcher() { - public boolean matches(Object item) { - return failureCount(greaterThan(0)).matches(item) && item.toString().contains(string); + return new TypeSafeMatcher() { + public boolean matchesSafely(PrintableResult item) { + return item.failureCount() > 0 && item.toString().contains(string); } public void describeTo(Description description) { diff --git a/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java b/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java index 6885cd10c308..a5617961b28d 100644 --- a/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java +++ b/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java @@ -4,11 +4,15 @@ import org.junit.experimental.results.PrintableResult; import org.junit.experimental.results.ResultMatchers; import org.junit.experimental.theories.Theory; +import org.junit.runner.Description; import org.junit.runner.notification.Failure; import java.util.ArrayList; +import java.util.Collections; -import static org.hamcrest.Matchers.*; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; public class ResultMatchersTest { @@ -26,14 +30,18 @@ public void hasFailuresDescriptionReflectsInput(int i) { } @Test - public void hasFailureContaining_givenNonMatchingScenario() { + public void hasFailureContaining_givenResultWithNoFailures() { PrintableResult resultWithNoFailures = new PrintableResult(new ArrayList()); + assertThat(ResultMatchers.hasFailureContaining("").matches(resultWithNoFailures), is(false)); } @Test - public void failureCount_nonMatchingScenario() { - PrintableResult resultWithNoFailures = new PrintableResult(new ArrayList()); - assertThat(ResultMatchers.failureCount(greaterThanOrEqualTo(3)).matches(resultWithNoFailures), is(false)); + public void testFailureCount() { + PrintableResult resultWithOneFailure = new PrintableResult(Collections.singletonList( + new Failure(Description.EMPTY, new RuntimeException("failure 1")))); + + assertThat(ResultMatchers.failureCount(equalTo(3)).matches(resultWithOneFailure), is(false)); + assertThat(ResultMatchers.failureCount(equalTo(1)).matches(resultWithOneFailure), is(true)); } } From 9ff05fef10c8b944c19ddfc8b17c10d63854369e Mon Sep 17 00:00:00 2001 From: Alberto Scotto Date: Sat, 14 May 2016 19:53:50 +0100 Subject: [PATCH 6/8] hasFailureContaining: add unit test for the scenario givenResultWithOneFailure --- .../tests/experimental/results/ResultMatchersTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java b/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java index a5617961b28d..3bf94b455447 100644 --- a/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java +++ b/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java @@ -36,6 +36,14 @@ public void hasFailureContaining_givenResultWithNoFailures() { assertThat(ResultMatchers.hasFailureContaining("").matches(resultWithNoFailures), is(false)); } + @Test + public void hasFailureContaining_givenResultWithOneFailure() { + PrintableResult resultWithOneFailure = new PrintableResult(Collections.singletonList( + new Failure(Description.EMPTY, new RuntimeException("my failure")))); + + assertThat(ResultMatchers.hasFailureContaining("my failure").matches(resultWithOneFailure), is(true)); + } + @Test public void testFailureCount() { PrintableResult resultWithOneFailure = new PrintableResult(Collections.singletonList( From 8aa0d1d2d3e7d7915ebcff083da611f572aa9479 Mon Sep 17 00:00:00 2001 From: Alberto Scotto Date: Sat, 14 May 2016 19:57:29 +0100 Subject: [PATCH 7/8] improve hasFailureContaining_givenResultWithOneFailure --- .../org/junit/tests/experimental/results/ResultMatchersTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java b/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java index 3bf94b455447..3a1107d33be4 100644 --- a/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java +++ b/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java @@ -42,6 +42,7 @@ public void hasFailureContaining_givenResultWithOneFailure() { new Failure(Description.EMPTY, new RuntimeException("my failure")))); assertThat(ResultMatchers.hasFailureContaining("my failure").matches(resultWithOneFailure), is(true)); + assertThat(ResultMatchers.hasFailureContaining("his failure").matches(resultWithOneFailure), is(false)); } @Test From fd63612362cea9ce9df74bb90273206b215f6693 Mon Sep 17 00:00:00 2001 From: Alberto Scotto Date: Wed, 18 May 2016 10:42:51 +0100 Subject: [PATCH 8/8] rm failureCount: not relevant for this PR --- .../junit/experimental/results/ResultMatchers.java | 13 ++----------- .../experimental/results/ResultMatchersTest.java | 12 +----------- 2 files changed, 3 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/junit/experimental/results/ResultMatchers.java b/src/main/java/org/junit/experimental/results/ResultMatchers.java index 6da48379e4b0..c593a135661d 100644 --- a/src/main/java/org/junit/experimental/results/ResultMatchers.java +++ b/src/main/java/org/junit/experimental/results/ResultMatchers.java @@ -5,8 +5,6 @@ import org.hamcrest.Matcher; import org.hamcrest.TypeSafeMatcher; -import static org.hamcrest.CoreMatchers.equalTo; - /** * Matchers on a PrintableResult, to enable JUnit self-tests. * For example: @@ -36,21 +34,14 @@ public static Matcher isSuccessful() { * Matches if there are {@code count} failures */ public static Matcher failureCountIs(final int count) { - return failureCount(equalTo(count)); - } - - /** - * Matches if the number of failures matches {@code countMatcher} - */ - public static Matcher failureCount(final Matcher countMatcher) { return new TypeSafeMatcher() { public void describeTo(Description description) { - description.appendText("has a number of failures matching " + countMatcher); + description.appendText("has " + count + " failures"); } @Override public boolean matchesSafely(PrintableResult item) { - return countMatcher.matches(item.failureCount()); + return item.failureCount() == count; } }; } diff --git a/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java b/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java index 3a1107d33be4..4c121b965c93 100644 --- a/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java +++ b/src/test/java/org/junit/tests/experimental/results/ResultMatchersTest.java @@ -11,7 +11,6 @@ import java.util.Collections; import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @@ -20,7 +19,7 @@ public class ResultMatchersTest { @Test public void hasFailuresHasGoodDescription() { assertThat(ResultMatchers.failureCountIs(3).toString(), - is("has a number of failures matching <3>")); + is("has 3 failures")); } @Theory @@ -44,13 +43,4 @@ public void hasFailureContaining_givenResultWithOneFailure() { assertThat(ResultMatchers.hasFailureContaining("my failure").matches(resultWithOneFailure), is(true)); assertThat(ResultMatchers.hasFailureContaining("his failure").matches(resultWithOneFailure), is(false)); } - - @Test - public void testFailureCount() { - PrintableResult resultWithOneFailure = new PrintableResult(Collections.singletonList( - new Failure(Description.EMPTY, new RuntimeException("failure 1")))); - - assertThat(ResultMatchers.failureCount(equalTo(3)).matches(resultWithOneFailure), is(false)); - assertThat(ResultMatchers.failureCount(equalTo(1)).matches(resultWithOneFailure), is(true)); - } }