From 0828f4528e2f560c0e5a96b863a0dc8045963406 Mon Sep 17 00:00:00 2001 From: Andy Turner Date: Mon, 10 Feb 2020 21:32:44 -0500 Subject: [PATCH 1/3] Theories: only get all data points from enum and boolean types if there is no @FromDataPoints annotation, or the named data points represent a non-empty set of the same type. Fixes #1648 --- .../theories/internal/Assignments.java | 20 +++-- .../runner/AllTheoriesRunnerTests.java | 1 + .../WhenNoParametersMatchEnumeratedTypes.java | 83 +++++++++++++++++++ 3 files changed, 95 insertions(+), 9 deletions(-) create mode 100644 src/test/java/org/junit/tests/experimental/theories/runner/WhenNoParametersMatchEnumeratedTypes.java diff --git a/src/main/java/org/junit/experimental/theories/internal/Assignments.java b/src/main/java/org/junit/experimental/theories/internal/Assignments.java index 6626797ef089..3b1172e99716 100644 --- a/src/main/java/org/junit/experimental/theories/internal/Assignments.java +++ b/src/main/java/org/junit/experimental/theories/internal/Assignments.java @@ -6,7 +6,7 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; - +import org.junit.experimental.theories.FromDataPoints; import org.junit.experimental.theories.ParameterSignature; import org.junit.experimental.theories.ParameterSupplier; import org.junit.experimental.theories.ParametersSuppliedBy; @@ -85,14 +85,16 @@ public List potentialsForNextUnassigned() private List generateAssignmentsFromTypeAlone(ParameterSignature unassigned) { Class paramType = unassigned.getType(); - - if (paramType.isEnum()) { - return new EnumSupplier(paramType).getValueSources(unassigned); - } else if (paramType.equals(Boolean.class) || paramType.equals(boolean.class)) { - return new BooleanSupplier().getValueSources(unassigned); - } else { - return emptyList(); + + FromDataPoints fromDataPoints = unassigned.getAnnotation(FromDataPoints.class); + if (fromDataPoints == null) { + if (paramType.isEnum()) { + return new EnumSupplier(paramType).getValueSources(unassigned); + } else if (paramType.equals(Boolean.class) || paramType.equals(boolean.class)) { + return new BooleanSupplier().getValueSources(unassigned); + } } + return emptyList(); } private ParameterSupplier getSupplier(ParameterSignature unassigned) @@ -150,4 +152,4 @@ public Object[] getArgumentStrings(boolean nullsOk) } return values; } -} \ No newline at end of file +} diff --git a/src/test/java/org/junit/tests/experimental/theories/runner/AllTheoriesRunnerTests.java b/src/test/java/org/junit/tests/experimental/theories/runner/AllTheoriesRunnerTests.java index 26465caecc9a..91ace6de0ad4 100644 --- a/src/test/java/org/junit/tests/experimental/theories/runner/AllTheoriesRunnerTests.java +++ b/src/test/java/org/junit/tests/experimental/theories/runner/AllTheoriesRunnerTests.java @@ -12,6 +12,7 @@ TypeMatchingBetweenMultiDataPointsMethod.class, UnsuccessfulWithDataPointFields.class, WhenNoParametersMatch.class, + WhenNoParametersMatchEnumeratedTypes.class, WithAutoGeneratedDataPoints.class, WithDataPointMethod.class, WithExtendedParameterSources.class, diff --git a/src/test/java/org/junit/tests/experimental/theories/runner/WhenNoParametersMatchEnumeratedTypes.java b/src/test/java/org/junit/tests/experimental/theories/runner/WhenNoParametersMatchEnumeratedTypes.java new file mode 100644 index 000000000000..0359716064a7 --- /dev/null +++ b/src/test/java/org/junit/tests/experimental/theories/runner/WhenNoParametersMatchEnumeratedTypes.java @@ -0,0 +1,83 @@ +package org.junit.tests.experimental.theories.runner; + +import static org.junit.Assert.assertThat; +import static org.junit.experimental.results.PrintableResult.testResult; +import static org.junit.experimental.results.ResultMatchers.failureCountIs; +import static org.junit.experimental.results.ResultMatchers.hasFailureContaining; +import static org.junit.experimental.results.ResultMatchers.hasSingleFailureContaining; + +import org.junit.Test; +import org.junit.experimental.results.PrintableResult; +import org.junit.experimental.theories.DataPoints; +import org.junit.experimental.theories.FromDataPoints; +import org.junit.experimental.theories.Theories; +import org.junit.experimental.theories.Theory; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class WhenNoParametersMatchEnumeratedTypes { + public enum SomeEnum { + FIRST, SECOND + } + + @RunWith(Theories.class) + public static class AssumptionsFailBoolean { + @Theory + public void shouldFailBecauseExplicitFromDataPointsNotKnown( + @FromDataPoints("unknown") boolean b) {} + + @Theory + public void shouldSucceedBecauseNoExplicitFromDataPoints(boolean b) {} + } + + @Test + public void showFailedAssumptionsWhenNoParametersFoundBoolean() { + assertThat( + testResult(AssumptionsFailBoolean.class), + hasSingleFailureContaining( + "Never found parameters that satisfied method assumptions")); + } + + @RunWith(Theories.class) + public static class AssumptionsFailEnum { + @Theory + public void shouldFailBecauseExplicitFromDataPointsNotKnown( + @FromDataPoints("unknown") SomeEnum e) {} + + @Theory + public void shouldSucceedBecauseNoExplicitFromDataPoints(SomeEnum e) {} + } + + @Test + public void showFailedAssumptionsWhenNoParametersFoundEnum() { + assertThat( + testResult(AssumptionsFailEnum.class), + hasSingleFailureContaining( + "Never found parameters that satisfied method assumptions")); + } + + @RunWith(Theories.class) + public static class AssumptionsFailWrongType { + @DataPoints("known") public static final String[] known = {"known"}; + + @Theory + public void shouldSucceedBecauseRightType(@FromDataPoints("known") String s) {} + + @Theory + public void shouldFailBecauseWrongTypeBoolean(@FromDataPoints("known") boolean b) {} + + @Theory + public void shouldFailBecauseWrongTypeEnum(@FromDataPoints("known") SomeEnum e) {} + } + + @Test + public void showFailedAssumptionsWhenWrongType() { + PrintableResult result = testResult(AssumptionsFailWrongType.class); + assertThat(result, failureCountIs(2)); + assertThat( + result, + hasFailureContaining( + "Never found parameters that satisfied method assumptions")); + } +} From 180142fdeb248dd335d052dadd2685d7d895a471 Mon Sep 17 00:00:00 2001 From: awturner Date: Tue, 21 Apr 2020 17:19:50 +0100 Subject: [PATCH 2/3] Update src/main/java/org/junit/experimental/theories/internal/Assignments.java Co-Authored-By: Stefan Birkner --- .../org/junit/experimental/theories/internal/Assignments.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/junit/experimental/theories/internal/Assignments.java b/src/main/java/org/junit/experimental/theories/internal/Assignments.java index 3b1172e99716..9c86091da20d 100644 --- a/src/main/java/org/junit/experimental/theories/internal/Assignments.java +++ b/src/main/java/org/junit/experimental/theories/internal/Assignments.java @@ -94,7 +94,9 @@ private List generateAssignmentsFromTypeAlone(ParameterSign return new BooleanSupplier().getValueSources(unassigned); } } - return emptyList(); + } else { + return emptyList(); + } } private ParameterSupplier getSupplier(ParameterSignature unassigned) From cfcb3f15a9dec289ec5a2c25dc49a06809029817 Mon Sep 17 00:00:00 2001 From: awturner Date: Tue, 21 Apr 2020 17:30:06 +0100 Subject: [PATCH 3/3] Update src/main/java/org/junit/experimental/theories/internal/Assignments.java --- .../org/junit/experimental/theories/internal/Assignments.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/junit/experimental/theories/internal/Assignments.java b/src/main/java/org/junit/experimental/theories/internal/Assignments.java index 9c86091da20d..2662fae10340 100644 --- a/src/main/java/org/junit/experimental/theories/internal/Assignments.java +++ b/src/main/java/org/junit/experimental/theories/internal/Assignments.java @@ -93,7 +93,6 @@ private List generateAssignmentsFromTypeAlone(ParameterSign } else if (paramType.equals(Boolean.class) || paramType.equals(boolean.class)) { return new BooleanSupplier().getValueSources(unassigned); } - } } else { return emptyList(); }