diff --git a/src/test/java/org/codetracker/util/OracleTest.java b/src/test/java/org/codetracker/util/OracleTest.java index 07a4867f9ff..25bc86d0d7e 100644 --- a/src/test/java/org/codetracker/util/OracleTest.java +++ b/src/test/java/org/codetracker/util/OracleTest.java @@ -64,7 +64,7 @@ protected static void loadExpected(String filePath) { public void testCodeTracker(CheckedBiFunction> tracker, H historyInfo, String fileName) throws Exception { String repositoryWebURL = historyInfo.getRepositoryWebURL(); //TODO temporary if check, remove when all local files are created - if(fileName.startsWith("checkstyle") || fileName.startsWith("commons-lang") || fileName.startsWith("flink") || fileName.startsWith("hibernate-orm") || fileName.startsWith("javaparser") || fileName.startsWith("jgit")) { + if(fileName.startsWith("checkstyle") || fileName.startsWith("commons-lang") || fileName.startsWith("flink") || fileName.startsWith("hibernate-orm") || fileName.startsWith("javaparser") || fileName.startsWith("jgit") || fileName.startsWith("junit")) { HashMap oracleChanges = oracle(historyInfo.getExpectedChanges()); History history = tracker.apply(historyInfo, repositoryWebURL); HashMap detectedChanges = new HashMap<>(); diff --git a/src/test/resources/oracle/commits/junit4-02c328028b4d32c15bbf0becc9838e54ecbafcbf.json b/src/test/resources/oracle/commits/junit4-02c328028b4d32c15bbf0becc9838e54ecbafcbf.json index 2cb38385aa3..bbcef985f2b 100644 --- a/src/test/resources/oracle/commits/junit4-02c328028b4d32c15bbf0becc9838e54ecbafcbf.json +++ b/src/test/resources/oracle/commits/junit4-02c328028b4d32c15bbf0becc9838e54ecbafcbf.json @@ -1 +1 @@ -{"parentCommitId":"64eb7302653c1263767eee550e5b53d9af66ba0d","currentCommitId":"02c328028b4d32c15bbf0becc9838e54ecbafcbf","filesBefore":["src/main/java/junit/framework/JUnit4TestAdapter.java","src/main/java/org/junit/internal/requests/ClassRequest.java","src/main/java/org/junit/internal/runners/JUnit38ClassRunner.java","src/main/java/org/junit/runner/Request.java","src/main/java/org/junit/runner/manipulation/Sorter.java","src/main/java/org/junit/runners/ParentRunner.java","src/main/java/org/junit/runners/model/RunnerBuilder.java","src/test/java/org/junit/tests/manipulation/AllManipulationTests.java","src/test/java/org/junit/tests/manipulation/SortableTest.java"],"filesCurrent":["src/main/java/junit/framework/JUnit4TestAdapter.java","src/main/java/org/junit/internal/requests/ClassRequest.java","src/main/java/org/junit/internal/requests/MemoizingRequest.java","src/main/java/org/junit/internal/requests/OrderingRequest.java","src/main/java/org/junit/internal/runners/JUnit38ClassRunner.java","src/main/java/org/junit/runner/OrderWith.java","src/main/java/org/junit/runner/Request.java","src/main/java/org/junit/runner/manipulation/Alphanumeric.java","src/main/java/org/junit/runner/manipulation/InvalidOrderingException.java","src/main/java/org/junit/runner/manipulation/Orderable.java","src/main/java/org/junit/runner/manipulation/Orderer.java","src/main/java/org/junit/runner/manipulation/Ordering.java","src/main/java/org/junit/runner/manipulation/Sorter.java","src/main/java/org/junit/runners/ParentRunner.java","src/main/java/org/junit/runners/model/RunnerBuilder.java","src/test/java/org/junit/tests/manipulation/AllManipulationTests.java","src/test/java/org/junit/tests/manipulation/AlphanumericOrdering.java","src/test/java/org/junit/tests/manipulation/ComparatorBasedOrdering.java","src/test/java/org/junit/tests/manipulation/Comparators.java","src/test/java/org/junit/tests/manipulation/OrderWithTest.java","src/test/java/org/junit/tests/manipulation/OrderableTest.java","src/test/java/org/junit/tests/manipulation/ReverseAlphanumericOrdering.java","src/test/java/org/junit/tests/manipulation/ReverseAlphanumericSorter.java","src/test/java/org/junit/tests/manipulation/SortableTest.java", "src/main/java/org/junit/runners/BlockJUnit4ClassRunner.java"],"renamedFilesHint":{},"repositoryDirectoriesBefore":["src/test/java/org/junit/samples/money","src/main/java/org/junit/experimental/theories/suppliers","src/test/java/org/junit/internal","src/test/java/org/junit/tests/assertion","src/test/java/org/junit/tests/experimental/theories/extendingwithstubs","src/test/java/org/junit/tests/junit3compatibility","src/test/java/org/junit/tests/running/methods","src/test/java/junit/tests","src/main/java","src/main/java/org/junit/experimental/theories/internal","src/test/java/org/junit/tests/experimental/results","src/test/java/junit/tests/runner","src/test/java/org/junit/rules","src/main/java/junit/framework","src/test/java/org/junit/runner/notification","src/test/java/org/junit/tests/running/classes/parent","src/test/java/org/junit/internal/builders","src/test/java/org/junit/runners/model","src/test/java/org/junit/tests/experimental/parallel","src/main/java/org/junit/runners/model","src/test/java/org/junit/runners/parameterized","src/test/java/org/junit/samples","src/main/java/org/junit/experimental/max","src/main/java/org/junit/matchers","src/main/java/junit","src/test/java/org/junit","src/main/java/org/junit/experimental/runners","src/test/java/org/junit/tests/running","src/main/java/org/junit/runner/notification","src/test","src/test/java/org/junit/tests/validation","src/test/java/org/junit/tests/experimental/max","src/main/java/org/junit/function","src/main/java/org/junit","src/test/java/org/junit/tests/running/classes","src/test/java/org/junit/tests/validation/anotherpackage","src/main/java/org","src/test/java/org/junit/tests/running/core","src/main/java/org/junit/experimental/categories","src/test/java/junit/tests/extensions","src/test/java/org/junit/tests/description","src/test/java/org/junit/tests/experimental/theories/internal","src/test/java/junit/samples","src/main/java/org/junit/internal","src/test/java/org","src/main/java/org/junit/experimental/results","src/main/java/org/junit/internal/matchers","src/test/java/org/junit/runners","src/test/java/org/junit/tests/deprecated","src/test/java/org/junit/tests/experimental","src/test/java/junit/tests/framework","src/test/java/org/junit/validator","src/main/java/junit/runner","src/test/java/org/junit/internal/matchers","src/test/java/org/junit/tests/listening","src/main/java/org/junit/internal/runners/model","src/main/java/org/junit/rules","src/main/java/org/junit/runners","src/test/java/org/junit/internal/runners","src/main/java/org/junit/runner/manipulation","src/main/java/org/junit/validator","src/test/java/org/junit/experimental/categories","src/main","src/test/java/org/junit/experimental","src/test/java/org/junit/tests/manipulation","src/main/java/junit/extensions","src/main/java/org/junit/internal/requests","src/main/java/org/junit/runners/parameterized","src/main/java/org/junit/internal/runners","src/test/java/org/junit/runner","src","src/test/java/org/junit/tests","src/test/java/junit","src/main/java/junit/textui","src/main/java/org/junit/internal/builders","src/main/java/org/junit/experimental","src/test/java/org/junit/internal/runners/statements","src/test/java/junit/samples/money","src/main/java/org/junit/internal/management","src/test/java","src/main/java/org/junit/internal/runners/rules","src/test/java/org/junit/tests/experimental/theories/runner","src/main/java/org/junit/runner","src/main/java/org/junit/internal/runners/statements","src/test/java/org/junit/tests/experimental/theories","src/main/java/org/junit/experimental/theories"],"repositoryDirectoriesCurrent":["src/test/java/org/junit/samples/money","src/main/java/org/junit/experimental/theories/suppliers","src/test/java/org/junit/internal","src/test/java/org/junit/tests/assertion","src/test/java/org/junit/tests/experimental/theories/extendingwithstubs","src/test/java/org/junit/tests/junit3compatibility","src/test/java/org/junit/tests/running/methods","src/test/java/junit/tests","src/main/java","src/main/java/org/junit/experimental/theories/internal","src/test/java/org/junit/tests/experimental/results","src/test/java/junit/tests/runner","src/test/java/org/junit/rules","src/main/java/junit/framework","src/test/java/org/junit/runner/notification","src/test/java/org/junit/tests/running/classes/parent","src/test/java/org/junit/internal/builders","src/test/java/org/junit/runners/model","src/test/java/org/junit/tests/experimental/parallel","src/main/java/org/junit/runners/model","src/test/java/org/junit/runners/parameterized","src/test/java/org/junit/samples","src/main/java/org/junit/experimental/max","src/main/java/org/junit/matchers","src/main/java/junit","src/test/java/org/junit","src/main/java/org/junit/experimental/runners","src/test/java/org/junit/tests/running","src/main/java/org/junit/runner/notification","src/test","src/test/java/org/junit/tests/validation","src/test/java/org/junit/tests/experimental/max","src/main/java/org/junit/function","src/main/java/org/junit","src/test/java/org/junit/tests/running/classes","src/test/java/org/junit/tests/validation/anotherpackage","src/main/java/org","src/test/java/org/junit/tests/running/core","src/main/java/org/junit/experimental/categories","src/test/java/junit/tests/extensions","src/test/java/org/junit/tests/description","src/test/java/org/junit/tests/experimental/theories/internal","src/test/java/junit/samples","src/main/java/org/junit/internal","src/test/java/org","src/main/java/org/junit/experimental/results","src/main/java/org/junit/internal/matchers","src/test/java/org/junit/runners","src/test/java/org/junit/tests/deprecated","src/test/java/org/junit/tests/experimental","src/test/java/junit/tests/framework","src/test/java/org/junit/validator","src/main/java/junit/runner","src/test/java/org/junit/internal/matchers","src/test/java/org/junit/tests/listening","src/main/java/org/junit/internal/runners/model","src/main/java/org/junit/rules","src/main/java/org/junit/runners","src/test/java/org/junit/internal/runners","src/main/java/org/junit/runner/manipulation","src/main/java/org/junit/validator","src/test/java/org/junit/experimental/categories","src/main","src/test/java/org/junit/experimental","src/test/java/org/junit/tests/manipulation","src/main/java/junit/extensions","src/main/java/org/junit/internal/requests","src/main/java/org/junit/runners/parameterized","src/main/java/org/junit/internal/runners","src/test/java/org/junit/runner","src","src/test/java/org/junit/tests","src/test/java/junit","src/main/java/junit/textui","src/main/java/org/junit/internal/builders","src/main/java/org/junit/experimental","src/test/java/org/junit/internal/runners/statements","src/test/java/junit/samples/money","src/main/java/org/junit/internal/management","src/test/java","src/main/java/org/junit/internal/runners/rules","src/test/java/org/junit/tests/experimental/theories/runner","src/main/java/org/junit/runner","src/main/java/org/junit/internal/runners/statements","src/test/java/org/junit/tests/experimental/theories","src/main/java/org/junit/experimental/theories"]} \ No newline at end of file +{"parentCommitId":"64eb7302653c1263767eee550e5b53d9af66ba0d","currentCommitId":"02c328028b4d32c15bbf0becc9838e54ecbafcbf","filesBefore":["src/main/java/junit/framework/JUnit4TestAdapter.java","src/main/java/org/junit/internal/requests/ClassRequest.java","src/main/java/org/junit/internal/runners/JUnit38ClassRunner.java","src/main/java/org/junit/runner/Request.java","src/main/java/org/junit/runner/manipulation/Sorter.java","src/main/java/org/junit/runners/ParentRunner.java","src/main/java/org/junit/runners/model/RunnerBuilder.java","src/test/java/org/junit/tests/manipulation/AllManipulationTests.java","src/test/java/org/junit/tests/manipulation/SortableTest.java"],"filesCurrent":["src/main/java/junit/framework/JUnit4TestAdapter.java","src/main/java/org/junit/internal/requests/ClassRequest.java","src/main/java/org/junit/internal/requests/MemoizingRequest.java","src/main/java/org/junit/internal/requests/OrderingRequest.java","src/main/java/org/junit/internal/runners/JUnit38ClassRunner.java","src/main/java/org/junit/runner/OrderWith.java","src/main/java/org/junit/runner/Request.java","src/main/java/org/junit/runner/manipulation/Alphanumeric.java","src/main/java/org/junit/runner/manipulation/InvalidOrderingException.java","src/main/java/org/junit/runner/manipulation/Orderable.java","src/main/java/org/junit/runner/manipulation/Orderer.java","src/main/java/org/junit/runner/manipulation/Ordering.java","src/main/java/org/junit/runner/manipulation/Sorter.java","src/main/java/org/junit/runners/ParentRunner.java","src/main/java/org/junit/runners/model/RunnerBuilder.java","src/test/java/org/junit/tests/manipulation/AllManipulationTests.java","src/test/java/org/junit/tests/manipulation/AlphanumericOrdering.java","src/test/java/org/junit/tests/manipulation/ComparatorBasedOrdering.java","src/test/java/org/junit/tests/manipulation/Comparators.java","src/test/java/org/junit/tests/manipulation/OrderWithTest.java","src/test/java/org/junit/tests/manipulation/OrderableTest.java","src/test/java/org/junit/tests/manipulation/ReverseAlphanumericOrdering.java","src/test/java/org/junit/tests/manipulation/ReverseAlphanumericSorter.java","src/test/java/org/junit/tests/manipulation/SortableTest.java", "src/main/java/org/junit/runners/BlockJUnit4ClassRunner.java", "src/main/java/org/junit/runners/Parameterized.java", "src/main/java/junit/runner/Version.java"],"renamedFilesHint":{},"repositoryDirectoriesBefore":["src/test/java/org/junit/samples/money","src/main/java/org/junit/experimental/theories/suppliers","src/test/java/org/junit/internal","src/test/java/org/junit/tests/assertion","src/test/java/org/junit/tests/experimental/theories/extendingwithstubs","src/test/java/org/junit/tests/junit3compatibility","src/test/java/org/junit/tests/running/methods","src/test/java/junit/tests","src/main/java","src/main/java/org/junit/experimental/theories/internal","src/test/java/org/junit/tests/experimental/results","src/test/java/junit/tests/runner","src/test/java/org/junit/rules","src/main/java/junit/framework","src/test/java/org/junit/runner/notification","src/test/java/org/junit/tests/running/classes/parent","src/test/java/org/junit/internal/builders","src/test/java/org/junit/runners/model","src/test/java/org/junit/tests/experimental/parallel","src/main/java/org/junit/runners/model","src/test/java/org/junit/runners/parameterized","src/test/java/org/junit/samples","src/main/java/org/junit/experimental/max","src/main/java/org/junit/matchers","src/main/java/junit","src/test/java/org/junit","src/main/java/org/junit/experimental/runners","src/test/java/org/junit/tests/running","src/main/java/org/junit/runner/notification","src/test","src/test/java/org/junit/tests/validation","src/test/java/org/junit/tests/experimental/max","src/main/java/org/junit/function","src/main/java/org/junit","src/test/java/org/junit/tests/running/classes","src/test/java/org/junit/tests/validation/anotherpackage","src/main/java/org","src/test/java/org/junit/tests/running/core","src/main/java/org/junit/experimental/categories","src/test/java/junit/tests/extensions","src/test/java/org/junit/tests/description","src/test/java/org/junit/tests/experimental/theories/internal","src/test/java/junit/samples","src/main/java/org/junit/internal","src/test/java/org","src/main/java/org/junit/experimental/results","src/main/java/org/junit/internal/matchers","src/test/java/org/junit/runners","src/test/java/org/junit/tests/deprecated","src/test/java/org/junit/tests/experimental","src/test/java/junit/tests/framework","src/test/java/org/junit/validator","src/main/java/junit/runner","src/test/java/org/junit/internal/matchers","src/test/java/org/junit/tests/listening","src/main/java/org/junit/internal/runners/model","src/main/java/org/junit/rules","src/main/java/org/junit/runners","src/test/java/org/junit/internal/runners","src/main/java/org/junit/runner/manipulation","src/main/java/org/junit/validator","src/test/java/org/junit/experimental/categories","src/main","src/test/java/org/junit/experimental","src/test/java/org/junit/tests/manipulation","src/main/java/junit/extensions","src/main/java/org/junit/internal/requests","src/main/java/org/junit/runners/parameterized","src/main/java/org/junit/internal/runners","src/test/java/org/junit/runner","src","src/test/java/org/junit/tests","src/test/java/junit","src/main/java/junit/textui","src/main/java/org/junit/internal/builders","src/main/java/org/junit/experimental","src/test/java/org/junit/internal/runners/statements","src/test/java/junit/samples/money","src/main/java/org/junit/internal/management","src/test/java","src/main/java/org/junit/internal/runners/rules","src/test/java/org/junit/tests/experimental/theories/runner","src/main/java/org/junit/runner","src/main/java/org/junit/internal/runners/statements","src/test/java/org/junit/tests/experimental/theories","src/main/java/org/junit/experimental/theories"],"repositoryDirectoriesCurrent":["src/test/java/org/junit/samples/money","src/main/java/org/junit/experimental/theories/suppliers","src/test/java/org/junit/internal","src/test/java/org/junit/tests/assertion","src/test/java/org/junit/tests/experimental/theories/extendingwithstubs","src/test/java/org/junit/tests/junit3compatibility","src/test/java/org/junit/tests/running/methods","src/test/java/junit/tests","src/main/java","src/main/java/org/junit/experimental/theories/internal","src/test/java/org/junit/tests/experimental/results","src/test/java/junit/tests/runner","src/test/java/org/junit/rules","src/main/java/junit/framework","src/test/java/org/junit/runner/notification","src/test/java/org/junit/tests/running/classes/parent","src/test/java/org/junit/internal/builders","src/test/java/org/junit/runners/model","src/test/java/org/junit/tests/experimental/parallel","src/main/java/org/junit/runners/model","src/test/java/org/junit/runners/parameterized","src/test/java/org/junit/samples","src/main/java/org/junit/experimental/max","src/main/java/org/junit/matchers","src/main/java/junit","src/test/java/org/junit","src/main/java/org/junit/experimental/runners","src/test/java/org/junit/tests/running","src/main/java/org/junit/runner/notification","src/test","src/test/java/org/junit/tests/validation","src/test/java/org/junit/tests/experimental/max","src/main/java/org/junit/function","src/main/java/org/junit","src/test/java/org/junit/tests/running/classes","src/test/java/org/junit/tests/validation/anotherpackage","src/main/java/org","src/test/java/org/junit/tests/running/core","src/main/java/org/junit/experimental/categories","src/test/java/junit/tests/extensions","src/test/java/org/junit/tests/description","src/test/java/org/junit/tests/experimental/theories/internal","src/test/java/junit/samples","src/main/java/org/junit/internal","src/test/java/org","src/main/java/org/junit/experimental/results","src/main/java/org/junit/internal/matchers","src/test/java/org/junit/runners","src/test/java/org/junit/tests/deprecated","src/test/java/org/junit/tests/experimental","src/test/java/junit/tests/framework","src/test/java/org/junit/validator","src/main/java/junit/runner","src/test/java/org/junit/internal/matchers","src/test/java/org/junit/tests/listening","src/main/java/org/junit/internal/runners/model","src/main/java/org/junit/rules","src/main/java/org/junit/runners","src/test/java/org/junit/internal/runners","src/main/java/org/junit/runner/manipulation","src/main/java/org/junit/validator","src/test/java/org/junit/experimental/categories","src/main","src/test/java/org/junit/experimental","src/test/java/org/junit/tests/manipulation","src/main/java/junit/extensions","src/main/java/org/junit/internal/requests","src/main/java/org/junit/runners/parameterized","src/main/java/org/junit/internal/runners","src/test/java/org/junit/runner","src","src/test/java/org/junit/tests","src/test/java/junit","src/main/java/junit/textui","src/main/java/org/junit/internal/builders","src/main/java/org/junit/experimental","src/test/java/org/junit/internal/runners/statements","src/test/java/junit/samples/money","src/main/java/org/junit/internal/management","src/test/java","src/main/java/org/junit/internal/runners/rules","src/test/java/org/junit/tests/experimental/theories/runner","src/main/java/org/junit/runner","src/main/java/org/junit/internal/runners/statements","src/test/java/org/junit/tests/experimental/theories","src/main/java/org/junit/experimental/theories"]} \ No newline at end of file diff --git a/src/test/resources/oracle/commits/junit4-02c328028b4d32c15bbf0becc9838e54ecbafcbf/src/main/java/junit/runner/Version.java b/src/test/resources/oracle/commits/junit4-02c328028b4d32c15bbf0becc9838e54ecbafcbf/src/main/java/junit/runner/Version.java new file mode 100644 index 00000000000..975ef7ce07c --- /dev/null +++ b/src/test/resources/oracle/commits/junit4-02c328028b4d32c15bbf0becc9838e54ecbafcbf/src/main/java/junit/runner/Version.java @@ -0,0 +1,18 @@ +package junit.runner; + +/** + * This class defines the current version of JUnit + */ +public class Version { + private Version() { + // don't instantiate + } + + public static String id() { + return "4.13-SNAPSHOT"; + } + + public static void main(String[] args) { + System.out.println(id()); + } +} diff --git a/src/test/resources/oracle/commits/junit4-02c328028b4d32c15bbf0becc9838e54ecbafcbf/src/main/java/org/junit/runners/Parameterized.java b/src/test/resources/oracle/commits/junit4-02c328028b4d32c15bbf0becc9838e54ecbafcbf/src/main/java/org/junit/runners/Parameterized.java new file mode 100644 index 00000000000..9dffb54b853 --- /dev/null +++ b/src/test/resources/oracle/commits/junit4-02c328028b4d32c15bbf0becc9838e54ecbafcbf/src/main/java/org/junit/runners/Parameterized.java @@ -0,0 +1,488 @@ +package org.junit.runners; + +import java.lang.annotation.Annotation; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import org.junit.internal.AssumptionViolatedException; +import org.junit.runner.Description; +import org.junit.runner.Runner; +import org.junit.runner.notification.Failure; +import org.junit.runner.notification.RunNotifier; +import org.junit.runners.model.FrameworkMethod; +import org.junit.runners.model.InvalidTestClassError; +import org.junit.runners.model.TestClass; +import org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParametersFactory; +import org.junit.runners.parameterized.ParametersRunnerFactory; +import org.junit.runners.parameterized.TestWithParameters; + +/** + * The custom runner Parameterized implements parameterized tests. + * When running a parameterized test class, instances are created for the + * cross-product of the test methods and the test data elements. + *

+ * For example, to test the + operator, write: + *

+ * @RunWith(Parameterized.class)
+ * public class AdditionTest {
+ *     @Parameters(name = "{index}: {0} + {1} = {2}")
+ *     public static Iterable<Object[]> data() {
+ *         return Arrays.asList(new Object[][] { { 0, 0, 0 }, { 1, 1, 2 },
+ *                 { 3, 2, 5 }, { 4, 3, 7 } });
+ *     }
+ *
+ *     private int firstSummand;
+ *
+ *     private int secondSummand;
+ *
+ *     private int sum;
+ *
+ *     public AdditionTest(int firstSummand, int secondSummand, int sum) {
+ *         this.firstSummand = firstSummand;
+ *         this.secondSummand = secondSummand;
+ *         this.sum = sum;
+ *     }
+ *
+ *     @Test
+ *     public void test() {
+ *         assertEquals(sum, firstSummand + secondSummand);
+ *     }
+ * }
+ * 
+ *

+ * Each instance of AdditionTest will be constructed using the + * three-argument constructor and the data values in the + * @Parameters method. + *

+ * In order that you can easily identify the individual tests, you may provide a + * name for the @Parameters annotation. This name is allowed + * to contain placeholders, which are replaced at runtime. The placeholders are + *

+ *
{index}
+ *
the current parameter index
+ *
{0}
+ *
the first parameter value
+ *
{1}
+ *
the second parameter value
+ *
...
+ *
...
+ *
+ *

+ * In the example given above, the Parameterized runner creates + * names like [2: 3 + 2 = 5]. If you don't use the name parameter, + * then the current parameter index is used as name. + *

+ * You can also write: + *

+ * @RunWith(Parameterized.class)
+ * public class AdditionTest {
+ *     @Parameters(name = "{index}: {0} + {1} = {2}")
+ *     public static Iterable<Object[]> data() {
+ *         return Arrays.asList(new Object[][] { { 0, 0, 0 }, { 1, 1, 2 },
+ *                 { 3, 2, 5 }, { 4, 3, 7 } });
+ *     }
+ *
+ *     @Parameter(0)
+ *     public int firstSummand;
+ *
+ *     @Parameter(1)
+ *     public int secondSummand;
+ *
+ *     @Parameter(2)
+ *     public int sum;
+ *
+ *     @Test
+ *     public void test() {
+ *         assertEquals(sum, firstSummand + secondSummand);
+ *     }
+ * }
+ * 
+ *

+ * Each instance of AdditionTest will be constructed with the default constructor + * and fields annotated by @Parameter will be initialized + * with the data values in the @Parameters method. + * + *

+ * The parameters can be provided as an array, too: + * + *

+ * @Parameters
+ * public static Object[][] data() {
+ * 	return new Object[][] { { 0, 0, 0 }, { 1, 1, 2 }, { 3, 2, 5 }, { 4, 3, 7 } } };
+ * }
+ * 
+ * + *

Tests with single parameter

+ *

+ * If your test needs a single parameter only, you don't have to wrap it with an + * array. Instead you can provide an Iterable or an array of + * objects. + *

+ * @Parameters
+ * public static Iterable<? extends Object> data() {
+ * 	return Arrays.asList("first test", "second test");
+ * }
+ * 
+ *

+ * or + *

+ * @Parameters
+ * public static Object[] data() {
+ * 	return new Object[] { "first test", "second test" };
+ * }
+ * 
+ * + *

Executing code before/after executing tests for specific parameters

+ *

+ * If your test needs to perform some preparation or cleanup based on the + * parameters, this can be done by adding public static methods annotated with + * {@code @BeforeParam}/{@code @AfterParam}. Such methods should either have no + * parameters or the same parameters as the test. + *

+ * @BeforeParam
+ * public static void beforeTestsForParameter(String onlyParameter) {
+ *     System.out.println("Testing " + onlyParameter);
+ * }
+ * 
+ * + *

Create different runners

+ *

+ * By default the {@code Parameterized} runner creates a slightly modified + * {@link BlockJUnit4ClassRunner} for each set of parameters. You can build an + * own {@code Parameterized} runner that creates another runner for each set of + * parameters. Therefore you have to build a {@link ParametersRunnerFactory} + * that creates a runner for each {@link TestWithParameters}. ( + * {@code TestWithParameters} are bundling the parameters and the test name.) + * The factory must have a public zero-arg constructor. + * + *

+ * public class YourRunnerFactory implements ParametersRunnerFactory {
+ *     public Runner createRunnerForTestWithParameters(TestWithParameters test)
+ *             throws InitializationError {
+ *         return YourRunner(test);
+ *     }
+ * }
+ * 
+ *

+ * Use the {@link UseParametersRunnerFactory} to tell the {@code Parameterized} + * runner that it should use your factory. + * + *

+ * @RunWith(Parameterized.class)
+ * @UseParametersRunnerFactory(YourRunnerFactory.class)
+ * public class YourTest {
+ *     ...
+ * }
+ * 
+ * + * @since 4.0 + */ +public class Parameterized extends Suite { + /** + * Annotation for a method which provides parameters to be injected into the + * test class constructor by Parameterized. The method has to + * be public and static. + */ + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.METHOD) + public @interface Parameters { + /** + * Optional pattern to derive the test's name from the parameters. Use + * numbers in braces to refer to the parameters or the additional data + * as follows: + *
+         * {index} - the current parameter index
+         * {0} - the first parameter value
+         * {1} - the second parameter value
+         * etc...
+         * 
+ *

+ * Default value is "{index}" for compatibility with previous JUnit + * versions. + * + * @return {@link MessageFormat} pattern string, except the index + * placeholder. + * @see MessageFormat + */ + String name() default "{index}"; + } + + /** + * Annotation for fields of the test class which will be initialized by the + * method annotated by Parameters. + * By using directly this annotation, the test class constructor isn't needed. + * Index range must start at 0. + * Default value is 0. + */ + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.FIELD) + public @interface Parameter { + /** + * Method that returns the index of the parameter in the array + * returned by the method annotated by Parameters. + * Index range must start at 0. + * Default value is 0. + * + * @return the index of the parameter. + */ + int value() default 0; + } + + /** + * Add this annotation to your test class if you want to generate a special + * runner. You have to specify a {@link ParametersRunnerFactory} class that + * creates such runners. The factory must have a public zero-arg + * constructor. + */ + @Retention(RetentionPolicy.RUNTIME) + @Inherited + @Target(ElementType.TYPE) + public @interface UseParametersRunnerFactory { + /** + * @return a {@link ParametersRunnerFactory} class (must have a default + * constructor) + */ + Class value() default BlockJUnit4ClassRunnerWithParametersFactory.class; + } + + /** + * Annotation for {@code public static void} methods which should be executed before + * evaluating tests with particular parameters. + * + * @see org.junit.BeforeClass + * @see org.junit.Before + * @since 4.13 + */ + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.METHOD) + public @interface BeforeParam { + } + + /** + * Annotation for {@code public static void} methods which should be executed after + * evaluating tests with particular parameters. + * + * @see org.junit.AfterClass + * @see org.junit.After + * @since 4.13 + */ + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.METHOD) + public @interface AfterParam { + } + + /** + * Only called reflectively. Do not use programmatically. + */ + public Parameterized(Class klass) throws Throwable { + this(klass, new RunnersFactory(klass)); + } + + private Parameterized(Class klass, RunnersFactory runnersFactory) throws Exception { + super(klass, runnersFactory.createRunners()); + validateBeforeParamAndAfterParamMethods(runnersFactory.parameterCount); + } + + private void validateBeforeParamAndAfterParamMethods(Integer parameterCount) + throws InvalidTestClassError { + List errors = new ArrayList(); + validatePublicStaticVoidMethods(Parameterized.BeforeParam.class, parameterCount, errors); + validatePublicStaticVoidMethods(Parameterized.AfterParam.class, parameterCount, errors); + if (!errors.isEmpty()) { + throw new InvalidTestClassError(getTestClass().getJavaClass(), errors); + } + } + + private void validatePublicStaticVoidMethods( + Class annotation, Integer parameterCount, + List errors) { + List methods = getTestClass().getAnnotatedMethods(annotation); + for (FrameworkMethod fm : methods) { + fm.validatePublicVoid(true, errors); + if (parameterCount != null) { + int methodParameterCount = fm.getMethod().getParameterTypes().length; + if (methodParameterCount != 0 && methodParameterCount != parameterCount) { + errors.add(new Exception("Method " + fm.getName() + + "() should have 0 or " + parameterCount + " parameter(s)")); + } + } + } + } + + private static class AssumptionViolationRunner extends Runner { + private final Description description; + private final AssumptionViolatedException exception; + + AssumptionViolationRunner(TestClass testClass, String methodName, + AssumptionViolatedException exception) { + this.description = Description + .createTestDescription(testClass.getJavaClass(), + methodName + "() assumption violation"); + this.exception = exception; + } + + @Override + public Description getDescription() { + return description; + } + + @Override + public void run(RunNotifier notifier) { + notifier.fireTestAssumptionFailed(new Failure(description, exception)); + } + } + + private static class RunnersFactory { + private static final ParametersRunnerFactory DEFAULT_FACTORY = new BlockJUnit4ClassRunnerWithParametersFactory(); + + private final TestClass testClass; + private final FrameworkMethod parametersMethod; + private final List allParameters; + private final int parameterCount; + private final Runner runnerOverride; + + private RunnersFactory(Class klass) throws Throwable { + testClass = new TestClass(klass); + parametersMethod = getParametersMethod(testClass); + List allParametersResult; + AssumptionViolationRunner assumptionViolationRunner = null; + try { + allParametersResult = allParameters(testClass, parametersMethod); + } catch (AssumptionViolatedException e) { + allParametersResult = Collections.emptyList(); + assumptionViolationRunner = new AssumptionViolationRunner(testClass, + parametersMethod.getName(), e); + } + allParameters = allParametersResult; + runnerOverride = assumptionViolationRunner; + parameterCount = + allParameters.isEmpty() ? 0 : normalizeParameters(allParameters.get(0)).length; + } + + private List createRunners() throws Exception { + if (runnerOverride != null) { + return Collections.singletonList(runnerOverride); + } + Parameters parameters = parametersMethod.getAnnotation(Parameters.class); + return Collections.unmodifiableList(createRunnersForParameters( + allParameters, parameters.name(), + getParametersRunnerFactory())); + } + + private ParametersRunnerFactory getParametersRunnerFactory() + throws InstantiationException, IllegalAccessException { + UseParametersRunnerFactory annotation = testClass + .getAnnotation(UseParametersRunnerFactory.class); + if (annotation == null) { + return DEFAULT_FACTORY; + } else { + Class factoryClass = annotation + .value(); + return factoryClass.newInstance(); + } + } + + private TestWithParameters createTestWithNotNormalizedParameters( + String pattern, int index, Object parametersOrSingleParameter) { + Object[] parameters = normalizeParameters(parametersOrSingleParameter); + return createTestWithParameters(testClass, pattern, index, parameters); + } + + private static Object[] normalizeParameters(Object parametersOrSingleParameter) { + return (parametersOrSingleParameter instanceof Object[]) ? (Object[]) parametersOrSingleParameter + : new Object[] { parametersOrSingleParameter }; + } + + @SuppressWarnings("unchecked") + private static List allParameters( + TestClass testClass, FrameworkMethod parametersMethod) throws Throwable { + Object parameters = parametersMethod.invokeExplosively(null); + if (parameters instanceof List) { + return (List) parameters; + } else if (parameters instanceof Collection) { + return new ArrayList((Collection) parameters); + } else if (parameters instanceof Iterable) { + List result = new ArrayList(); + for (Object entry : ((Iterable) parameters)) { + result.add(entry); + } + return result; + } else if (parameters instanceof Object[]) { + return Arrays.asList((Object[]) parameters); + } else { + throw parametersMethodReturnedWrongType(testClass, parametersMethod); + } + } + + private static FrameworkMethod getParametersMethod(TestClass testClass) throws Exception { + List methods = testClass + .getAnnotatedMethods(Parameters.class); + for (FrameworkMethod each : methods) { + if (each.isStatic() && each.isPublic()) { + return each; + } + } + + throw new Exception("No public static parameters method on class " + + testClass.getName()); + } + + private List createRunnersForParameters( + Iterable allParameters, String namePattern, + ParametersRunnerFactory runnerFactory) throws Exception { + try { + List tests = createTestsForParameters( + allParameters, namePattern); + List runners = new ArrayList(); + for (TestWithParameters test : tests) { + runners.add(runnerFactory + .createRunnerForTestWithParameters(test)); + } + return runners; + } catch (ClassCastException e) { + throw parametersMethodReturnedWrongType(testClass, parametersMethod); + } + } + + private List createTestsForParameters( + Iterable allParameters, String namePattern) + throws Exception { + int i = 0; + List children = new ArrayList(); + for (Object parametersOfSingleTest : allParameters) { + children.add(createTestWithNotNormalizedParameters(namePattern, + i++, parametersOfSingleTest)); + } + return children; + } + + private static Exception parametersMethodReturnedWrongType( + TestClass testClass, FrameworkMethod parametersMethod) throws Exception { + String className = testClass.getName(); + String methodName = parametersMethod.getName(); + String message = MessageFormat.format( + "{0}.{1}() must return an Iterable of arrays.", className, + methodName); + return new Exception(message); + } + + private TestWithParameters createTestWithParameters( + TestClass testClass, String pattern, int index, + Object[] parameters) { + String finalPattern = pattern.replaceAll("\\{index\\}", + Integer.toString(index)); + String name = MessageFormat.format(finalPattern, parameters); + return new TestWithParameters("[" + name + "]", testClass, + Arrays.asList(parameters)); + } + } +} diff --git a/src/test/resources/oracle/commits/junit5-77cfe71e7f787c59626198e25350545f41e968bd.json b/src/test/resources/oracle/commits/junit5-77cfe71e7f787c59626198e25350545f41e968bd.json index 622f0d20677..a55472a9031 100644 --- a/src/test/resources/oracle/commits/junit5-77cfe71e7f787c59626198e25350545f41e968bd.json +++ b/src/test/resources/oracle/commits/junit5-77cfe71e7f787c59626198e25350545f41e968bd.json @@ -1 +1 @@ -{"parentCommitId":"b72a5a061004d562771c44a56f92f1f92831dde1","currentCommitId":"77cfe71e7f787c59626198e25350545f41e968bd","filesBefore":[],"filesCurrent":[],"renamedFilesHint":{},"repositoryDirectoriesBefore":["junit-platform-engine/src/test/java/org/junit/platform/engine/test/event","platform-tooling-support-tests/projects/gradle-starter/src/test/java/com/example/project","platform-tests/src/test/java/org/junit/jupiter","platform-tooling-support-tests/projects/maven-starter/src/test/java/com/example","documentation/src/test/java/org","junit-platform-commons/src/main/java/org/junit/platform/commons/logging","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/execution","junit-platform-runner/src/main/java/org","junit-jupiter-params/src/test/java","junit-vintage-engine","platform-tooling-support-tests/projects/maven-starter/src/main/java/com/example/project","junit-jupiter-engine/src/test","junit-jupiter-params/src/main/java/org/junit","junit-platform-suite-api","junit-vintage-engine/src/test","platform-tests/src/test/java/org/junit/platform/launcher/tagexpression","platform-tooling-support-tests/src/test/java/platform/tooling/support/tests","junit-jupiter-params/src/test/java/org/junit","junit-jupiter-migrationsupport/src/main/java/org/junit/jupiter/migrationsupport/rules/member","junit-platform-surefire-provider/src/test/java/org/junit/platform/surefire","junit-jupiter-params","junit-jupiter-params/src/main/java/org/junit/jupiter","junit-vintage-engine/src/test/java/org/junit/vintage/engine/support","documentation","platform-tooling-support-tests/projects/ant-starter","junit-jupiter-migrationsupport/src/main","junit-platform-runner/src/main","junit-platform-console/src/main","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension","junit-platform-commons/src/main","documentation/src/test/java/example/exception","junit-platform-console-standalone/src/test/java/standalone","junit-platform-console-standalone","junit-vintage-engine/src/main/java/org/junit/vintage","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/execution/injection","documentation/src","junit-platform-engine/src/test/java/org","junit-platform-engine/src/main","junit-platform-commons/src/main/java","junit-platform-launcher/src/main/java/org/junit","platform-tooling-support-tests/projects","platform-tooling-support-tests/projects/ant-starter/src/test/java/com/example","junit-jupiter-migrationsupport/src/test/java/org","platform-tooling-support-tests/projects/maven-starter/src/main","junit-jupiter-migrationsupport/src/main/java/org/junit/jupiter/migrationsupport/rules","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine","junit-platform-commons-java-9/src/test/java/org/junit/platform/commons","junit-jupiter-migrationsupport/src/main/java/org/junit/jupiter","junit-jupiter-engine/src/main/java/org","platform-tests/src/test/java/org/junit/platform/console","platform-tests/src/test/java/org/junit/platform/engine","junit-platform-console-standalone/src","platform-tooling-support-tests/src/main/java/platform/tooling","documentation/src/test/java/org/junit/api/tools","documentation/src/test/java/org/junit/api","platform-tooling-support-tests/src/test/java/platform","junit-jupiter-api/src/main/java/org","junit-platform-surefire-provider/src/main/java/org","junit-jupiter-params/src/test","junit-vintage-engine/src/main/java","junit-jupiter-engine/src/test/java/org/junit","junit-platform-console/src","junit-platform-runner/src/main/java/org/junit/platform","junit-platform-runner","platform-tooling-support-tests/projects/maven-starter/src","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/script","junit-platform-engine/src/main/java/org","junit-platform-surefire-provider/src/main/java/org/junit/platform","platform-tests/src","platform-tooling-support-tests/projects/gradle-starter/src/test/java","junit-jupiter-engine/src/main/java/org/junit","platform-tests/src/test/java/org/junit/platform/launcher","junit-platform-engine/src/main/java/org/junit/platform/engine/support/filter","junit-platform-commons-java-9/src/main","junit-jupiter-params/src/main/java","platform-tests/src/jmh/java/org","junit-platform-console/src/main/java/org","junit-platform-engine/src/test/java","platform-tests/src/test/java/org/junit/platform","junit-jupiter-params/src/test/java/org","junit-jupiter-engine/src/test/java","junit-platform-engine/src/test/java/org/junit/platform/engine","platform-tests/src/test/java/org/junit/platform/console/options","platform-tooling-support-tests/projects/gradle-starter/src/main/java/com/example/project","junit-jupiter-api/src/main/java/org/junit/jupiter/api/parallel","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/bridge","junit-platform-runner/src","junit-platform-launcher/src/main/java/org","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery/predicates","platform-tooling-support-tests/src/test/java","junit-platform-commons-java-9/src","junit-platform-suite-api/src/main/java/org","platform-tooling-support-tests/projects/maven-starter/src/main/java/com/example","junit-platform-commons-java-9/src/main/java/org","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/extension/sub","junit-jupiter-engine/src/test/java/org","platform-tests","junit-jupiter-params/src/test/java/org/junit/jupiter","junit-platform-commons/src","junit-platform-suite-api/src","junit-platform-surefire-provider/src/test/java/org/junit/platform/surefire/provider","platform-tooling-support-tests/projects/gradle-starter/src/test/java/com/example","platform-tooling-support-tests/projects/maven-starter/src/test/java/com/example/project","junit-platform-console/src/main/java/org/junit/platform/console","platform-tooling-support-tests/projects/gradle-missing-engine","junit-platform-commons/src/main/java/org","junit-jupiter-params/src/main/java/org/junit/jupiter/params/support","platform-tooling-support-tests/projects/ant-starter/src/main","platform-tests/src/test/java/org/junit/platform/engine/support/descriptor","junit-vintage-engine/src/main/java/org/junit/vintage/engine/execution","junit-vintage-engine/src/test/java/org","junit-vintage-engine/src/test/java/org/junit/vintage/engine/samples","junit-platform-commons-java-9/src/test/java/integration","junit-platform-engine/src/main/java/org/junit/platform/engine/reporting","junit-platform-launcher/src/main/java","junit-vintage-engine/src","junit-vintage-engine/src/test/java/org/junit/vintage/engine/samples/junit4","platform-tooling-support-tests/projects/gradle-starter/src/test/java/com","junit-vintage-engine/src/test/java/org/junit/vintage/engine/samples/junit3","platform-tooling-support-tests/src/main/java/platform","junit-platform-launcher/src/main/java/org/junit/platform","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/discovery","junit-platform-runner/src/main/java/org/junit","platform-tests/src/test/java/org/junit/platform/engine/support","junit-jupiter-params/src/main/java/org","junit-jupiter-engine/src/test/java/org/junit/jupiter/api/subpackage","junit-platform-commons/src/main/java/org/junit/platform/commons/util","platform-tooling-support-tests/projects/gradle-starter/src/main/java","junit-platform-engine/src/main/java","platform-tooling-support-tests/projects/gradle-starter","platform-tooling-support-tests/src/test","junit-vintage-engine/src/test/java","documentation/src/test/java/example/defaultmethods","junit-jupiter-migrationsupport/src/test/java/org/junit/jupiter","junit-jupiter-api/src/main/java/org/junit/jupiter/api/function","junit-jupiter-params/src/test/java/org/junit/jupiter/params/converter","junit-vintage-engine/src/main/java/org/junit/vintage/engine/discovery","platform-tooling-support-tests/projects/ant-starter/src/test/java","platform-tests/src/test/java/org/junit/platform/launcher/core","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/discovery/predicates","junit-platform-engine/src/main/java/org/junit/platform/engine/support","junit-platform-commons-java-9/src/test/java/org/junit/platform/commons/util","platform-tooling-support-tests","platform-tooling-support-tests/projects/gradle-starter/src","junit-platform-suite-api/src/main/java","junit-platform-surefire-provider","documentation/src/test/java/extensions","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/execution/injection/sample","junit-platform-commons","junit-platform-launcher/src/main/java/org/junit/platform/launcher/core","platform-tests/src/test/java/org/junit/platform/engine/support/hierarchical","junit-platform-surefire-provider/src/test/java/org/junit/platform","platform-tooling-support-tests/projects/gradle-missing-engine/src/test/java","junit-platform-launcher/src/main/java/org/junit/platform/launcher","junit-platform-engine/src/test/java/org/junit/platform","junit-jupiter-engine/src/test/java/org/junit/jupiter","junit-vintage-engine/src/test/java/org/junit/vintage/engine/execution","documentation/src/test/java/org/junit","junit-platform-commons-java-9/src/test/java/org/junit","platform-tooling-support-tests/projects/ant-starter/src/main/java","junit-platform-commons-java-9/src/main/java/org/junit","documentation/src/test/java/example/registration","junit-platform-launcher","platform-tooling-support-tests/projects/gradle-starter/src/main/java/com","junit-jupiter-params/src/main/java/org/junit/jupiter/params/provider","junit-platform-commons-java-9","junit-vintage-engine/src/test/java/org/junit","junit-platform-commons/src/main/java/org/junit/platform/commons","junit-jupiter-params/src/main/java/org/junit/jupiter/params/converter","junit-jupiter-migrationsupport/src/main/java","junit-platform-launcher/src/main","platform-tests/src/test/java/org/junit/jupiter/extensions","platform-tooling-support-tests/projects/gradle-starter/src/main/java/com/example","platform-tests/src/test/java/org","src/spotless","junit-jupiter-engine/src/test/java/org/junit/jupiter/api","junit-platform-console/src/main/java/org/junit/platform","junit-jupiter-params/src/main","junit-platform-console/src/main/java/org/junit","platform-tooling-support-tests/src/main/java/platform/tooling/support","platform-tests/src/jmh/java/org/junit/jupiter/jmh","platform-tooling-support-tests/projects/ant-starter/src/test/java/com/example/project","platform-tests/src/test/java/org/junit/platform/console/subpackage","junit-platform-commons-java-9/src/test/java","junit-platform-commons-java-9/src/test","platform-tooling-support-tests/src","junit-jupiter-migrationsupport/src/test/java","junit-jupiter-api/src/main/java/org/junit/jupiter/api","junit-jupiter-api/src/main/java","junit-platform-commons-java-9/src/main/java/org/junit/platform","junit-jupiter-migrationsupport/src/main/java/org/junit","junit-vintage-engine/src/main/java/org/junit/vintage/engine/descriptor","platform-tests/src/test/java","platform-tooling-support-tests/projects/ant-starter/src/main/java/com/example","junit-jupiter-migrationsupport/src/main/java/org/junit/jupiter/migrationsupport","junit-jupiter-migrationsupport/src/test/java/org/junit/jupiter/migrationsupport/rules","junit-platform-runner/src/main/java/org/junit/platform/runner","junit-platform-engine/src/test","junit-platform-suite-api/src/main","platform-tests/src/test/java/org/junit/platform/engine/support/config","platform-tooling-support-tests/projects/ant-starter/src/main/java/com","junit-jupiter-migrationsupport/src/test/java/org/junit","platform-tooling-support-tests/projects/gradle-missing-engine/src/test","platform-tests/src/jmh/java","junit-vintage-engine/src/main","platform-tooling-support-tests/projects/gradle-starter/src/test","junit-platform-surefire-provider/src/test/java","junit-platform-commons-java-9/src/main/java/org/junit/platform/commons/util","platform-tests/src/test/java/org/junit","junit-vintage-engine/src/test/java/org/junit/vintage/engine/descriptor","junit-platform-surefire-provider/src/main/java/org/junit","junit-vintage-engine/src/main/java/org","junit-platform-surefire-provider/src/main","junit-jupiter-api/src/main","junit-platform-engine/src/test/java/org/junit/platform/engine/test","platform-tooling-support-tests/projects/maven-starter/src/main/java","junit-platform-commons/src/main/java/org/junit/platform/commons/annotation","junit-platform-commons-java-9/src/test/java/org","junit-platform-surefire-provider/src/main/java/org/junit/platform/surefire/provider","platform-tooling-support-tests/src/test/java/platform/tooling","platform-tooling-support-tests/projects/maven-starter/src/test/java/com","junit-platform-commons-java-9/src/main/java","platform-tooling-support-tests/projects/maven-starter","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/descriptor","documentation/src/test/java/example/testinterface","junit-vintage-engine/src/main/java/org/junit/vintage/engine","junit-platform-engine/src/main/java/org/junit/platform","junit-platform-engine/src","junit-platform-suite-api/src/main/java/org/junit/platform/suite/api","junit-platform-suite-api/src/main/java/org/junit/platform","platform-tests/src/test/java/org/junit/platform/engine/discovery","junit-jupiter-params/src/test/java/org/junit/jupiter/params/provider","junit-jupiter-migrationsupport","junit-platform-surefire-provider/src","junit-platform-launcher/src","platform-tooling-support-tests/projects/ant-starter/src/test/java/com","junit-jupiter-engine/src","junit-jupiter-engine","junit-jupiter-migrationsupport/src/test","platform-tooling-support-tests/projects/maven-starter/src/test","junit-platform-engine/src/main/java/org/junit/platform/engine","junit-jupiter-engine/src/main/java","junit-vintage-engine/src/main/java/org/junit","platform-tests/src/test/java/org/junit/platform/console/tasks","junit-platform-console","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution","junit-platform-console/src/main/java","junit-jupiter-api","junit-platform-engine/src/main/java/org/junit/platform/engine/support/config","junit-platform-engine/src/main/java/org/junit/platform/engine/support/descriptor","junit-jupiter-migrationsupport/src/main/java/org","platform-tooling-support-tests/projects/maven-starter/src/test/java","junit-platform-console/src/main/java/org/junit/platform/console/options","documentation/src/test/java/example","junit-jupiter-api/src/main/java/org/junit","junit-platform-suite-api/src/main/java/org/junit","junit-platform-suite-api/src/main/java/org/junit/platform/suite","junit-platform-launcher/src/main/java/org/junit/platform/launcher/listeners","platform-tests/src/test/java/org/junit/platform/runner","junit-platform-commons/src/main/java/org/junit/platform","platform-tests/src/jmh/java/org/junit","junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression","junit-jupiter-engine/src/main/java/org/junit/jupiter","platform-tests/src/test/java/org/junit/platform/commons/util","documentation/src/test/java/example/timing","junit-platform-console-standalone/src/test","junit-platform-surefire-provider/src/test","documentation/src/test","platform-tooling-support-tests/src/test/java/platform/tooling/support","junit-vintage-engine/src/test/java/org/junit/vintage","junit-platform-surefire-provider/src/test/java/org","junit-platform-engine/src/main/java/org/junit/platform/engine/discovery","junit-platform-surefire-provider/src/test/java/org/junit","junit-platform-commons/src/main/java/org/junit/platform/commons/support","junit-jupiter-migrationsupport/src/test/java/org/junit/jupiter/migrationsupport","junit-jupiter-params/src/test/java/org/junit/jupiter/params/aggregator","junit-jupiter-params/src/test/java/org/junit/jupiter/params","junit-platform-runner/src/main/java","platform-tooling-support-tests/src/main/java","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/extension","junit-platform-console/src/main/java/org/junit/platform/console/tasks","platform-tests/src/test/java/org/junit/platform/commons/support","junit-jupiter-migrationsupport/src","junit-jupiter-api/src/main/java/org/junit/jupiter","junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical","junit-vintage-engine/src/main/java/org/junit/vintage/engine/support","platform-tooling-support-tests/projects/ant-starter/src/test","platform-tests/src/test/java/org/junit/platform/launcher/listeners","platform-tests/src/jmh/java/org/junit/jupiter","junit-jupiter-engine/src/main","junit-vintage-engine/src/test/java/org/junit/vintage/engine/discovery","junit-platform-commons-java-9/src/test/java/org/junit/platform","documentation/src/test/java","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/descriptor/subpackage","platform-tests/src/test","platform-tooling-support-tests/projects/ant-starter/src/main/java/com/example/project","platform-tests/src/jmh","junit-jupiter-params/src/main/java/org/junit/jupiter/params","platform-tooling-support-tests/projects/gradle-starter/src/main","junit-platform-surefire-provider/src/main/java/org/junit/platform/surefire","junit-jupiter-api/src","platform-tests/src/test/java/org/junit/platform/commons","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/script","platform-tooling-support-tests/projects/ant-starter/src","junit-platform-commons-java-9/src/main/java/org/junit/platform/commons","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor","junit-vintage-engine/src/test/java/org/junit/vintage/engine","src","junit-jupiter-params/src","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery","junit-platform-surefire-provider/src/main/java","junit-jupiter-api/src/main/java/org/junit/jupiter/api/extension","junit-platform-engine/src/main/java/org/junit","platform-tooling-support-tests/projects/gradle-missing-engine/src","junit-platform-commons/src/main/java/org/junit","junit-platform-console-standalone/src/test/java","platform-tooling-support-tests/projects/maven-starter/src/main/java/com","junit-jupiter-migrationsupport/src/main/java/org/junit/jupiter/migrationsupport/rules/adapter","junit-jupiter-params/src/main/java/org/junit/jupiter/params/aggregator","junit-jupiter-engine/src/test/java/org/junit/jupiter/api/condition","junit-jupiter-api/src/main/java/org/junit/jupiter/api/condition","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine","platform-tooling-support-tests/src/main","junit-platform-engine","junit-platform-engine/src/test/java/org/junit","junit-jupiter-engine/src/test/java/org/junit/jupiter/api/extension"],"repositoryDirectoriesCurrent":["junit-platform-engine/src/test/java/org/junit/platform/engine/test/event","platform-tooling-support-tests/projects/gradle-starter/src/test/java/com/example/project","platform-tests/src/test/java/org/junit/jupiter","platform-tooling-support-tests/projects/maven-starter/src/test/java/com/example","documentation/src/test/java/org","junit-platform-commons/src/main/java/org/junit/platform/commons/logging","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/execution","junit-platform-runner/src/main/java/org","junit-jupiter-params/src/test/java","junit-vintage-engine","platform-tooling-support-tests/projects/maven-starter/src/main/java/com/example/project","junit-jupiter-engine/src/test","junit-jupiter-params/src/main/java/org/junit","junit-platform-suite-api","junit-vintage-engine/src/test","platform-tests/src/test/java/org/junit/platform/launcher/tagexpression","platform-tooling-support-tests/src/test/java/platform/tooling/support/tests","junit-jupiter-params/src/test/java/org/junit","junit-jupiter-migrationsupport/src/main/java/org/junit/jupiter/migrationsupport/rules/member","junit-platform-surefire-provider/src/test/java/org/junit/platform/surefire","junit-jupiter-params","junit-jupiter-params/src/main/java/org/junit/jupiter","junit-vintage-engine/src/test/java/org/junit/vintage/engine/support","documentation","platform-tooling-support-tests/projects/ant-starter","junit-jupiter-migrationsupport/src/main","junit-platform-runner/src/main","junit-platform-console/src/main","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension","junit-platform-commons/src/main","documentation/src/test/java/example/exception","junit-platform-console-standalone/src/test/java/standalone","junit-platform-console-standalone","junit-vintage-engine/src/main/java/org/junit/vintage","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/execution/injection","documentation/src","junit-platform-engine/src/test/java/org","junit-platform-engine/src/main","junit-platform-commons/src/main/java","junit-platform-launcher/src/main/java/org/junit","platform-tooling-support-tests/projects","platform-tooling-support-tests/projects/ant-starter/src/test/java/com/example","junit-jupiter-migrationsupport/src/test/java/org","platform-tooling-support-tests/projects/maven-starter/src/main","junit-jupiter-migrationsupport/src/main/java/org/junit/jupiter/migrationsupport/rules","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine","junit-platform-commons-java-9/src/test/java/org/junit/platform/commons","junit-jupiter-migrationsupport/src/main/java/org/junit/jupiter","junit-jupiter-engine/src/main/java/org","platform-tests/src/test/java/org/junit/platform/console","platform-tests/src/test/java/org/junit/platform/engine","junit-platform-console-standalone/src","platform-tooling-support-tests/src/main/java/platform/tooling","documentation/src/test/java/org/junit/api/tools","documentation/src/test/java/org/junit/api","platform-tooling-support-tests/src/test/java/platform","junit-jupiter-api/src/main/java/org","junit-platform-surefire-provider/src/main/java/org","junit-jupiter-params/src/test","junit-vintage-engine/src/main/java","junit-jupiter-engine/src/test/java/org/junit","junit-platform-console/src","junit-platform-runner/src/main/java/org/junit/platform","junit-platform-runner","platform-tooling-support-tests/projects/maven-starter/src","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/script","junit-platform-engine/src/main/java/org","junit-platform-surefire-provider/src/main/java/org/junit/platform","platform-tests/src","platform-tooling-support-tests/projects/gradle-starter/src/test/java","junit-jupiter-engine/src/main/java/org/junit","platform-tests/src/test/java/org/junit/platform/launcher","junit-platform-engine/src/main/java/org/junit/platform/engine/support/filter","junit-platform-commons-java-9/src/main","junit-jupiter-params/src/main/java","platform-tests/src/jmh/java/org","junit-platform-console/src/main/java/org","junit-platform-engine/src/test/java","platform-tests/src/test/java/org/junit/platform","junit-jupiter-params/src/test/java/org","junit-jupiter-engine/src/test/java","junit-platform-engine/src/test/java/org/junit/platform/engine","platform-tests/src/test/java/org/junit/platform/console/options","platform-tooling-support-tests/projects/gradle-starter/src/main/java/com/example/project","junit-jupiter-api/src/main/java/org/junit/jupiter/api/parallel","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/bridge","junit-platform-runner/src","junit-platform-launcher/src/main/java/org","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery/predicates","platform-tooling-support-tests/src/test/java","junit-platform-commons-java-9/src","junit-platform-suite-api/src/main/java/org","platform-tooling-support-tests/projects/maven-starter/src/main/java/com/example","junit-platform-commons-java-9/src/main/java/org","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/extension/sub","junit-jupiter-engine/src/test/java/org","platform-tests","junit-jupiter-params/src/test/java/org/junit/jupiter","junit-platform-commons/src","junit-platform-suite-api/src","junit-platform-surefire-provider/src/test/java/org/junit/platform/surefire/provider","platform-tooling-support-tests/projects/gradle-starter/src/test/java/com/example","platform-tooling-support-tests/projects/maven-starter/src/test/java/com/example/project","junit-platform-console/src/main/java/org/junit/platform/console","platform-tooling-support-tests/projects/gradle-missing-engine","junit-platform-commons/src/main/java/org","junit-jupiter-params/src/main/java/org/junit/jupiter/params/support","platform-tooling-support-tests/projects/ant-starter/src/main","platform-tests/src/test/java/org/junit/platform/engine/support/descriptor","junit-vintage-engine/src/main/java/org/junit/vintage/engine/execution","junit-vintage-engine/src/test/java/org","junit-vintage-engine/src/test/java/org/junit/vintage/engine/samples","junit-platform-commons-java-9/src/test/java/integration","junit-platform-engine/src/main/java/org/junit/platform/engine/reporting","junit-platform-launcher/src/main/java","junit-vintage-engine/src","junit-vintage-engine/src/test/java/org/junit/vintage/engine/samples/junit4","platform-tooling-support-tests/projects/gradle-starter/src/test/java/com","junit-vintage-engine/src/test/java/org/junit/vintage/engine/samples/junit3","platform-tooling-support-tests/src/main/java/platform","junit-platform-launcher/src/main/java/org/junit/platform","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/discovery","junit-platform-runner/src/main/java/org/junit","platform-tests/src/test/java/org/junit/platform/engine/support","junit-jupiter-params/src/main/java/org","junit-jupiter-engine/src/test/java/org/junit/jupiter/api/subpackage","junit-platform-commons/src/main/java/org/junit/platform/commons/util","platform-tooling-support-tests/projects/gradle-starter/src/main/java","junit-platform-engine/src/main/java","platform-tooling-support-tests/projects/gradle-starter","platform-tooling-support-tests/src/test","junit-vintage-engine/src/test/java","documentation/src/test/java/example/defaultmethods","junit-jupiter-migrationsupport/src/test/java/org/junit/jupiter","junit-jupiter-api/src/main/java/org/junit/jupiter/api/function","junit-jupiter-params/src/test/java/org/junit/jupiter/params/converter","junit-vintage-engine/src/main/java/org/junit/vintage/engine/discovery","platform-tooling-support-tests/projects/ant-starter/src/test/java","platform-tests/src/test/java/org/junit/platform/launcher/core","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/discovery/predicates","junit-platform-engine/src/main/java/org/junit/platform/engine/support","junit-platform-commons-java-9/src/test/java/org/junit/platform/commons/util","platform-tooling-support-tests","platform-tooling-support-tests/projects/gradle-starter/src","junit-platform-suite-api/src/main/java","junit-platform-surefire-provider","documentation/src/test/java/extensions","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/execution/injection/sample","junit-platform-commons","junit-platform-launcher/src/main/java/org/junit/platform/launcher/core","platform-tests/src/test/java/org/junit/platform/engine/support/hierarchical","junit-platform-surefire-provider/src/test/java/org/junit/platform","platform-tooling-support-tests/projects/gradle-missing-engine/src/test/java","junit-platform-launcher/src/main/java/org/junit/platform/launcher","junit-platform-engine/src/test/java/org/junit/platform","junit-jupiter-engine/src/test/java/org/junit/jupiter","junit-vintage-engine/src/test/java/org/junit/vintage/engine/execution","documentation/src/test/java/org/junit","junit-platform-commons-java-9/src/test/java/org/junit","platform-tooling-support-tests/projects/ant-starter/src/main/java","junit-platform-commons-java-9/src/main/java/org/junit","documentation/src/test/java/example/registration","junit-platform-launcher","platform-tooling-support-tests/projects/gradle-starter/src/main/java/com","junit-jupiter-params/src/main/java/org/junit/jupiter/params/provider","junit-platform-commons-java-9","junit-vintage-engine/src/test/java/org/junit","junit-platform-commons/src/main/java/org/junit/platform/commons","junit-jupiter-params/src/main/java/org/junit/jupiter/params/converter","junit-jupiter-migrationsupport/src/main/java","junit-platform-launcher/src/main","platform-tests/src/test/java/org/junit/jupiter/extensions","platform-tooling-support-tests/projects/gradle-starter/src/main/java/com/example","platform-tests/src/test/java/org","src/spotless","junit-jupiter-engine/src/test/java/org/junit/jupiter/api","junit-platform-console/src/main/java/org/junit/platform","junit-jupiter-params/src/main","junit-platform-console/src/main/java/org/junit","platform-tooling-support-tests/src/main/java/platform/tooling/support","platform-tests/src/jmh/java/org/junit/jupiter/jmh","platform-tooling-support-tests/projects/ant-starter/src/test/java/com/example/project","platform-tests/src/test/java/org/junit/platform/console/subpackage","junit-platform-commons-java-9/src/test/java","junit-platform-commons-java-9/src/test","platform-tooling-support-tests/src","junit-jupiter-migrationsupport/src/test/java","junit-jupiter-api/src/main/java/org/junit/jupiter/api","junit-jupiter-api/src/main/java","junit-platform-commons-java-9/src/main/java/org/junit/platform","junit-jupiter-migrationsupport/src/main/java/org/junit","junit-vintage-engine/src/main/java/org/junit/vintage/engine/descriptor","platform-tests/src/test/java","platform-tooling-support-tests/projects/ant-starter/src/main/java/com/example","junit-jupiter-migrationsupport/src/main/java/org/junit/jupiter/migrationsupport","junit-jupiter-migrationsupport/src/test/java/org/junit/jupiter/migrationsupport/rules","junit-platform-runner/src/main/java/org/junit/platform/runner","junit-platform-engine/src/test","junit-platform-suite-api/src/main","platform-tests/src/test/java/org/junit/platform/engine/support/config","platform-tooling-support-tests/projects/ant-starter/src/main/java/com","junit-jupiter-migrationsupport/src/test/java/org/junit","platform-tooling-support-tests/projects/gradle-missing-engine/src/test","platform-tests/src/jmh/java","junit-vintage-engine/src/main","platform-tooling-support-tests/projects/gradle-starter/src/test","junit-platform-surefire-provider/src/test/java","junit-platform-commons-java-9/src/main/java/org/junit/platform/commons/util","platform-tests/src/test/java/org/junit","junit-vintage-engine/src/test/java/org/junit/vintage/engine/descriptor","junit-platform-surefire-provider/src/main/java/org/junit","junit-vintage-engine/src/main/java/org","junit-platform-surefire-provider/src/main","junit-jupiter-api/src/main","junit-platform-engine/src/test/java/org/junit/platform/engine/test","platform-tooling-support-tests/projects/maven-starter/src/main/java","junit-platform-commons/src/main/java/org/junit/platform/commons/annotation","junit-platform-commons-java-9/src/test/java/org","junit-platform-surefire-provider/src/main/java/org/junit/platform/surefire/provider","platform-tooling-support-tests/src/test/java/platform/tooling","platform-tooling-support-tests/projects/maven-starter/src/test/java/com","junit-platform-commons-java-9/src/main/java","platform-tooling-support-tests/projects/maven-starter","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/descriptor","documentation/src/test/java/example/testinterface","junit-vintage-engine/src/main/java/org/junit/vintage/engine","junit-platform-engine/src/main/java/org/junit/platform","junit-platform-engine/src","junit-platform-suite-api/src/main/java/org/junit/platform/suite/api","junit-platform-suite-api/src/main/java/org/junit/platform","platform-tests/src/test/java/org/junit/platform/engine/discovery","junit-jupiter-params/src/test/java/org/junit/jupiter/params/provider","junit-jupiter-migrationsupport","junit-platform-surefire-provider/src","junit-platform-launcher/src","platform-tooling-support-tests/projects/ant-starter/src/test/java/com","junit-jupiter-engine/src","junit-jupiter-engine","junit-jupiter-migrationsupport/src/test","platform-tooling-support-tests/projects/maven-starter/src/test","junit-platform-engine/src/main/java/org/junit/platform/engine","junit-jupiter-engine/src/main/java","junit-vintage-engine/src/main/java/org/junit","platform-tests/src/test/java/org/junit/platform/console/tasks","junit-platform-console","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution","junit-platform-console/src/main/java","junit-jupiter-api","junit-platform-engine/src/main/java/org/junit/platform/engine/support/config","junit-platform-engine/src/main/java/org/junit/platform/engine/support/descriptor","junit-jupiter-migrationsupport/src/main/java/org","platform-tooling-support-tests/projects/maven-starter/src/test/java","junit-platform-console/src/main/java/org/junit/platform/console/options","documentation/src/test/java/example","junit-jupiter-api/src/main/java/org/junit","junit-platform-suite-api/src/main/java/org/junit","junit-platform-suite-api/src/main/java/org/junit/platform/suite","junit-platform-launcher/src/main/java/org/junit/platform/launcher/listeners","platform-tests/src/test/java/org/junit/platform/runner","junit-platform-commons/src/main/java/org/junit/platform","platform-tests/src/jmh/java/org/junit","junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression","junit-jupiter-engine/src/main/java/org/junit/jupiter","platform-tests/src/test/java/org/junit/platform/commons/util","documentation/src/test/java/example/timing","junit-platform-console-standalone/src/test","junit-platform-surefire-provider/src/test","documentation/src/test","platform-tooling-support-tests/src/test/java/platform/tooling/support","junit-vintage-engine/src/test/java/org/junit/vintage","junit-platform-surefire-provider/src/test/java/org","junit-platform-engine/src/main/java/org/junit/platform/engine/discovery","junit-platform-surefire-provider/src/test/java/org/junit","junit-platform-commons/src/main/java/org/junit/platform/commons/support","junit-jupiter-migrationsupport/src/test/java/org/junit/jupiter/migrationsupport","junit-jupiter-params/src/test/java/org/junit/jupiter/params/aggregator","junit-jupiter-params/src/test/java/org/junit/jupiter/params","junit-platform-runner/src/main/java","platform-tooling-support-tests/src/main/java","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/extension","junit-platform-console/src/main/java/org/junit/platform/console/tasks","platform-tests/src/test/java/org/junit/platform/commons/support","junit-jupiter-migrationsupport/src","junit-jupiter-api/src/main/java/org/junit/jupiter","junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical","junit-vintage-engine/src/main/java/org/junit/vintage/engine/support","platform-tooling-support-tests/projects/ant-starter/src/test","platform-tests/src/test/java/org/junit/platform/launcher/listeners","platform-tests/src/jmh/java/org/junit/jupiter","junit-jupiter-engine/src/main","junit-vintage-engine/src/test/java/org/junit/vintage/engine/discovery","junit-platform-commons-java-9/src/test/java/org/junit/platform","documentation/src/test/java","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/descriptor/subpackage","platform-tests/src/test","platform-tooling-support-tests/projects/ant-starter/src/main/java/com/example/project","platform-tests/src/jmh","junit-jupiter-params/src/main/java/org/junit/jupiter/params","platform-tooling-support-tests/projects/gradle-starter/src/main","junit-platform-surefire-provider/src/main/java/org/junit/platform/surefire","junit-jupiter-api/src","platform-tests/src/test/java/org/junit/platform/commons","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/script","platform-tooling-support-tests/projects/ant-starter/src","junit-platform-commons-java-9/src/main/java/org/junit/platform/commons","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor","junit-vintage-engine/src/test/java/org/junit/vintage/engine","src","junit-jupiter-params/src","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery","junit-platform-surefire-provider/src/main/java","junit-jupiter-api/src/main/java/org/junit/jupiter/api/extension","junit-platform-engine/src/main/java/org/junit","platform-tooling-support-tests/projects/gradle-missing-engine/src","junit-platform-commons/src/main/java/org/junit","junit-platform-console-standalone/src/test/java","platform-tooling-support-tests/projects/maven-starter/src/main/java/com","junit-jupiter-migrationsupport/src/main/java/org/junit/jupiter/migrationsupport/rules/adapter","junit-jupiter-params/src/main/java/org/junit/jupiter/params/aggregator","junit-jupiter-engine/src/test/java/org/junit/jupiter/api/condition","junit-jupiter-api/src/main/java/org/junit/jupiter/api/condition","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine","platform-tooling-support-tests/src/main","junit-platform-engine","junit-platform-engine/src/test/java/org/junit","junit-jupiter-engine/src/test/java/org/junit/jupiter/api/extension"]} \ No newline at end of file +{"parentCommitId":"b72a5a061004d562771c44a56f92f1f92831dde1","currentCommitId":"77cfe71e7f787c59626198e25350545f41e968bd","filesBefore":[],"filesCurrent":["junit-platform-console/src/main/java/org/junit/platform/console/options/AvailableOptions.java", "junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ClassTestDescriptor.java", "junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/DefaultLauncher.java", "junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/NodeTestTask.java", "junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/TestFactoryTestDescriptor.java", "junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/TestMethodTestDescriptor.java"],"renamedFilesHint":{},"repositoryDirectoriesBefore":["junit-platform-engine/src/test/java/org/junit/platform/engine/test/event","platform-tooling-support-tests/projects/gradle-starter/src/test/java/com/example/project","platform-tests/src/test/java/org/junit/jupiter","platform-tooling-support-tests/projects/maven-starter/src/test/java/com/example","documentation/src/test/java/org","junit-platform-commons/src/main/java/org/junit/platform/commons/logging","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/execution","junit-platform-runner/src/main/java/org","junit-jupiter-params/src/test/java","junit-vintage-engine","platform-tooling-support-tests/projects/maven-starter/src/main/java/com/example/project","junit-jupiter-engine/src/test","junit-jupiter-params/src/main/java/org/junit","junit-platform-suite-api","junit-vintage-engine/src/test","platform-tests/src/test/java/org/junit/platform/launcher/tagexpression","platform-tooling-support-tests/src/test/java/platform/tooling/support/tests","junit-jupiter-params/src/test/java/org/junit","junit-jupiter-migrationsupport/src/main/java/org/junit/jupiter/migrationsupport/rules/member","junit-platform-surefire-provider/src/test/java/org/junit/platform/surefire","junit-jupiter-params","junit-jupiter-params/src/main/java/org/junit/jupiter","junit-vintage-engine/src/test/java/org/junit/vintage/engine/support","documentation","platform-tooling-support-tests/projects/ant-starter","junit-jupiter-migrationsupport/src/main","junit-platform-runner/src/main","junit-platform-console/src/main","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension","junit-platform-commons/src/main","documentation/src/test/java/example/exception","junit-platform-console-standalone/src/test/java/standalone","junit-platform-console-standalone","junit-vintage-engine/src/main/java/org/junit/vintage","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/execution/injection","documentation/src","junit-platform-engine/src/test/java/org","junit-platform-engine/src/main","junit-platform-commons/src/main/java","junit-platform-launcher/src/main/java/org/junit","platform-tooling-support-tests/projects","platform-tooling-support-tests/projects/ant-starter/src/test/java/com/example","junit-jupiter-migrationsupport/src/test/java/org","platform-tooling-support-tests/projects/maven-starter/src/main","junit-jupiter-migrationsupport/src/main/java/org/junit/jupiter/migrationsupport/rules","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine","junit-platform-commons-java-9/src/test/java/org/junit/platform/commons","junit-jupiter-migrationsupport/src/main/java/org/junit/jupiter","junit-jupiter-engine/src/main/java/org","platform-tests/src/test/java/org/junit/platform/console","platform-tests/src/test/java/org/junit/platform/engine","junit-platform-console-standalone/src","platform-tooling-support-tests/src/main/java/platform/tooling","documentation/src/test/java/org/junit/api/tools","documentation/src/test/java/org/junit/api","platform-tooling-support-tests/src/test/java/platform","junit-jupiter-api/src/main/java/org","junit-platform-surefire-provider/src/main/java/org","junit-jupiter-params/src/test","junit-vintage-engine/src/main/java","junit-jupiter-engine/src/test/java/org/junit","junit-platform-console/src","junit-platform-runner/src/main/java/org/junit/platform","junit-platform-runner","platform-tooling-support-tests/projects/maven-starter/src","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/script","junit-platform-engine/src/main/java/org","junit-platform-surefire-provider/src/main/java/org/junit/platform","platform-tests/src","platform-tooling-support-tests/projects/gradle-starter/src/test/java","junit-jupiter-engine/src/main/java/org/junit","platform-tests/src/test/java/org/junit/platform/launcher","junit-platform-engine/src/main/java/org/junit/platform/engine/support/filter","junit-platform-commons-java-9/src/main","junit-jupiter-params/src/main/java","platform-tests/src/jmh/java/org","junit-platform-console/src/main/java/org","junit-platform-engine/src/test/java","platform-tests/src/test/java/org/junit/platform","junit-jupiter-params/src/test/java/org","junit-jupiter-engine/src/test/java","junit-platform-engine/src/test/java/org/junit/platform/engine","platform-tests/src/test/java/org/junit/platform/console/options","platform-tooling-support-tests/projects/gradle-starter/src/main/java/com/example/project","junit-jupiter-api/src/main/java/org/junit/jupiter/api/parallel","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/bridge","junit-platform-runner/src","junit-platform-launcher/src/main/java/org","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery/predicates","platform-tooling-support-tests/src/test/java","junit-platform-commons-java-9/src","junit-platform-suite-api/src/main/java/org","platform-tooling-support-tests/projects/maven-starter/src/main/java/com/example","junit-platform-commons-java-9/src/main/java/org","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/extension/sub","junit-jupiter-engine/src/test/java/org","platform-tests","junit-jupiter-params/src/test/java/org/junit/jupiter","junit-platform-commons/src","junit-platform-suite-api/src","junit-platform-surefire-provider/src/test/java/org/junit/platform/surefire/provider","platform-tooling-support-tests/projects/gradle-starter/src/test/java/com/example","platform-tooling-support-tests/projects/maven-starter/src/test/java/com/example/project","junit-platform-console/src/main/java/org/junit/platform/console","platform-tooling-support-tests/projects/gradle-missing-engine","junit-platform-commons/src/main/java/org","junit-jupiter-params/src/main/java/org/junit/jupiter/params/support","platform-tooling-support-tests/projects/ant-starter/src/main","platform-tests/src/test/java/org/junit/platform/engine/support/descriptor","junit-vintage-engine/src/main/java/org/junit/vintage/engine/execution","junit-vintage-engine/src/test/java/org","junit-vintage-engine/src/test/java/org/junit/vintage/engine/samples","junit-platform-commons-java-9/src/test/java/integration","junit-platform-engine/src/main/java/org/junit/platform/engine/reporting","junit-platform-launcher/src/main/java","junit-vintage-engine/src","junit-vintage-engine/src/test/java/org/junit/vintage/engine/samples/junit4","platform-tooling-support-tests/projects/gradle-starter/src/test/java/com","junit-vintage-engine/src/test/java/org/junit/vintage/engine/samples/junit3","platform-tooling-support-tests/src/main/java/platform","junit-platform-launcher/src/main/java/org/junit/platform","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/discovery","junit-platform-runner/src/main/java/org/junit","platform-tests/src/test/java/org/junit/platform/engine/support","junit-jupiter-params/src/main/java/org","junit-jupiter-engine/src/test/java/org/junit/jupiter/api/subpackage","junit-platform-commons/src/main/java/org/junit/platform/commons/util","platform-tooling-support-tests/projects/gradle-starter/src/main/java","junit-platform-engine/src/main/java","platform-tooling-support-tests/projects/gradle-starter","platform-tooling-support-tests/src/test","junit-vintage-engine/src/test/java","documentation/src/test/java/example/defaultmethods","junit-jupiter-migrationsupport/src/test/java/org/junit/jupiter","junit-jupiter-api/src/main/java/org/junit/jupiter/api/function","junit-jupiter-params/src/test/java/org/junit/jupiter/params/converter","junit-vintage-engine/src/main/java/org/junit/vintage/engine/discovery","platform-tooling-support-tests/projects/ant-starter/src/test/java","platform-tests/src/test/java/org/junit/platform/launcher/core","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/discovery/predicates","junit-platform-engine/src/main/java/org/junit/platform/engine/support","junit-platform-commons-java-9/src/test/java/org/junit/platform/commons/util","platform-tooling-support-tests","platform-tooling-support-tests/projects/gradle-starter/src","junit-platform-suite-api/src/main/java","junit-platform-surefire-provider","documentation/src/test/java/extensions","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/execution/injection/sample","junit-platform-commons","junit-platform-launcher/src/main/java/org/junit/platform/launcher/core","platform-tests/src/test/java/org/junit/platform/engine/support/hierarchical","junit-platform-surefire-provider/src/test/java/org/junit/platform","platform-tooling-support-tests/projects/gradle-missing-engine/src/test/java","junit-platform-launcher/src/main/java/org/junit/platform/launcher","junit-platform-engine/src/test/java/org/junit/platform","junit-jupiter-engine/src/test/java/org/junit/jupiter","junit-vintage-engine/src/test/java/org/junit/vintage/engine/execution","documentation/src/test/java/org/junit","junit-platform-commons-java-9/src/test/java/org/junit","platform-tooling-support-tests/projects/ant-starter/src/main/java","junit-platform-commons-java-9/src/main/java/org/junit","documentation/src/test/java/example/registration","junit-platform-launcher","platform-tooling-support-tests/projects/gradle-starter/src/main/java/com","junit-jupiter-params/src/main/java/org/junit/jupiter/params/provider","junit-platform-commons-java-9","junit-vintage-engine/src/test/java/org/junit","junit-platform-commons/src/main/java/org/junit/platform/commons","junit-jupiter-params/src/main/java/org/junit/jupiter/params/converter","junit-jupiter-migrationsupport/src/main/java","junit-platform-launcher/src/main","platform-tests/src/test/java/org/junit/jupiter/extensions","platform-tooling-support-tests/projects/gradle-starter/src/main/java/com/example","platform-tests/src/test/java/org","src/spotless","junit-jupiter-engine/src/test/java/org/junit/jupiter/api","junit-platform-console/src/main/java/org/junit/platform","junit-jupiter-params/src/main","junit-platform-console/src/main/java/org/junit","platform-tooling-support-tests/src/main/java/platform/tooling/support","platform-tests/src/jmh/java/org/junit/jupiter/jmh","platform-tooling-support-tests/projects/ant-starter/src/test/java/com/example/project","platform-tests/src/test/java/org/junit/platform/console/subpackage","junit-platform-commons-java-9/src/test/java","junit-platform-commons-java-9/src/test","platform-tooling-support-tests/src","junit-jupiter-migrationsupport/src/test/java","junit-jupiter-api/src/main/java/org/junit/jupiter/api","junit-jupiter-api/src/main/java","junit-platform-commons-java-9/src/main/java/org/junit/platform","junit-jupiter-migrationsupport/src/main/java/org/junit","junit-vintage-engine/src/main/java/org/junit/vintage/engine/descriptor","platform-tests/src/test/java","platform-tooling-support-tests/projects/ant-starter/src/main/java/com/example","junit-jupiter-migrationsupport/src/main/java/org/junit/jupiter/migrationsupport","junit-jupiter-migrationsupport/src/test/java/org/junit/jupiter/migrationsupport/rules","junit-platform-runner/src/main/java/org/junit/platform/runner","junit-platform-engine/src/test","junit-platform-suite-api/src/main","platform-tests/src/test/java/org/junit/platform/engine/support/config","platform-tooling-support-tests/projects/ant-starter/src/main/java/com","junit-jupiter-migrationsupport/src/test/java/org/junit","platform-tooling-support-tests/projects/gradle-missing-engine/src/test","platform-tests/src/jmh/java","junit-vintage-engine/src/main","platform-tooling-support-tests/projects/gradle-starter/src/test","junit-platform-surefire-provider/src/test/java","junit-platform-commons-java-9/src/main/java/org/junit/platform/commons/util","platform-tests/src/test/java/org/junit","junit-vintage-engine/src/test/java/org/junit/vintage/engine/descriptor","junit-platform-surefire-provider/src/main/java/org/junit","junit-vintage-engine/src/main/java/org","junit-platform-surefire-provider/src/main","junit-jupiter-api/src/main","junit-platform-engine/src/test/java/org/junit/platform/engine/test","platform-tooling-support-tests/projects/maven-starter/src/main/java","junit-platform-commons/src/main/java/org/junit/platform/commons/annotation","junit-platform-commons-java-9/src/test/java/org","junit-platform-surefire-provider/src/main/java/org/junit/platform/surefire/provider","platform-tooling-support-tests/src/test/java/platform/tooling","platform-tooling-support-tests/projects/maven-starter/src/test/java/com","junit-platform-commons-java-9/src/main/java","platform-tooling-support-tests/projects/maven-starter","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/descriptor","documentation/src/test/java/example/testinterface","junit-vintage-engine/src/main/java/org/junit/vintage/engine","junit-platform-engine/src/main/java/org/junit/platform","junit-platform-engine/src","junit-platform-suite-api/src/main/java/org/junit/platform/suite/api","junit-platform-suite-api/src/main/java/org/junit/platform","platform-tests/src/test/java/org/junit/platform/engine/discovery","junit-jupiter-params/src/test/java/org/junit/jupiter/params/provider","junit-jupiter-migrationsupport","junit-platform-surefire-provider/src","junit-platform-launcher/src","platform-tooling-support-tests/projects/ant-starter/src/test/java/com","junit-jupiter-engine/src","junit-jupiter-engine","junit-jupiter-migrationsupport/src/test","platform-tooling-support-tests/projects/maven-starter/src/test","junit-platform-engine/src/main/java/org/junit/platform/engine","junit-jupiter-engine/src/main/java","junit-vintage-engine/src/main/java/org/junit","platform-tests/src/test/java/org/junit/platform/console/tasks","junit-platform-console","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution","junit-platform-console/src/main/java","junit-jupiter-api","junit-platform-engine/src/main/java/org/junit/platform/engine/support/config","junit-platform-engine/src/main/java/org/junit/platform/engine/support/descriptor","junit-jupiter-migrationsupport/src/main/java/org","platform-tooling-support-tests/projects/maven-starter/src/test/java","junit-platform-console/src/main/java/org/junit/platform/console/options","documentation/src/test/java/example","junit-jupiter-api/src/main/java/org/junit","junit-platform-suite-api/src/main/java/org/junit","junit-platform-suite-api/src/main/java/org/junit/platform/suite","junit-platform-launcher/src/main/java/org/junit/platform/launcher/listeners","platform-tests/src/test/java/org/junit/platform/runner","junit-platform-commons/src/main/java/org/junit/platform","platform-tests/src/jmh/java/org/junit","junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression","junit-jupiter-engine/src/main/java/org/junit/jupiter","platform-tests/src/test/java/org/junit/platform/commons/util","documentation/src/test/java/example/timing","junit-platform-console-standalone/src/test","junit-platform-surefire-provider/src/test","documentation/src/test","platform-tooling-support-tests/src/test/java/platform/tooling/support","junit-vintage-engine/src/test/java/org/junit/vintage","junit-platform-surefire-provider/src/test/java/org","junit-platform-engine/src/main/java/org/junit/platform/engine/discovery","junit-platform-surefire-provider/src/test/java/org/junit","junit-platform-commons/src/main/java/org/junit/platform/commons/support","junit-jupiter-migrationsupport/src/test/java/org/junit/jupiter/migrationsupport","junit-jupiter-params/src/test/java/org/junit/jupiter/params/aggregator","junit-jupiter-params/src/test/java/org/junit/jupiter/params","junit-platform-runner/src/main/java","platform-tooling-support-tests/src/main/java","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/extension","junit-platform-console/src/main/java/org/junit/platform/console/tasks","platform-tests/src/test/java/org/junit/platform/commons/support","junit-jupiter-migrationsupport/src","junit-jupiter-api/src/main/java/org/junit/jupiter","junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical","junit-vintage-engine/src/main/java/org/junit/vintage/engine/support","platform-tooling-support-tests/projects/ant-starter/src/test","platform-tests/src/test/java/org/junit/platform/launcher/listeners","platform-tests/src/jmh/java/org/junit/jupiter","junit-jupiter-engine/src/main","junit-vintage-engine/src/test/java/org/junit/vintage/engine/discovery","junit-platform-commons-java-9/src/test/java/org/junit/platform","documentation/src/test/java","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/descriptor/subpackage","platform-tests/src/test","platform-tooling-support-tests/projects/ant-starter/src/main/java/com/example/project","platform-tests/src/jmh","junit-jupiter-params/src/main/java/org/junit/jupiter/params","platform-tooling-support-tests/projects/gradle-starter/src/main","junit-platform-surefire-provider/src/main/java/org/junit/platform/surefire","junit-jupiter-api/src","platform-tests/src/test/java/org/junit/platform/commons","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/script","platform-tooling-support-tests/projects/ant-starter/src","junit-platform-commons-java-9/src/main/java/org/junit/platform/commons","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor","junit-vintage-engine/src/test/java/org/junit/vintage/engine","src","junit-jupiter-params/src","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery","junit-platform-surefire-provider/src/main/java","junit-jupiter-api/src/main/java/org/junit/jupiter/api/extension","junit-platform-engine/src/main/java/org/junit","platform-tooling-support-tests/projects/gradle-missing-engine/src","junit-platform-commons/src/main/java/org/junit","junit-platform-console-standalone/src/test/java","platform-tooling-support-tests/projects/maven-starter/src/main/java/com","junit-jupiter-migrationsupport/src/main/java/org/junit/jupiter/migrationsupport/rules/adapter","junit-jupiter-params/src/main/java/org/junit/jupiter/params/aggregator","junit-jupiter-engine/src/test/java/org/junit/jupiter/api/condition","junit-jupiter-api/src/main/java/org/junit/jupiter/api/condition","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine","platform-tooling-support-tests/src/main","junit-platform-engine","junit-platform-engine/src/test/java/org/junit","junit-jupiter-engine/src/test/java/org/junit/jupiter/api/extension"],"repositoryDirectoriesCurrent":["junit-platform-engine/src/test/java/org/junit/platform/engine/test/event","platform-tooling-support-tests/projects/gradle-starter/src/test/java/com/example/project","platform-tests/src/test/java/org/junit/jupiter","platform-tooling-support-tests/projects/maven-starter/src/test/java/com/example","documentation/src/test/java/org","junit-platform-commons/src/main/java/org/junit/platform/commons/logging","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/execution","junit-platform-runner/src/main/java/org","junit-jupiter-params/src/test/java","junit-vintage-engine","platform-tooling-support-tests/projects/maven-starter/src/main/java/com/example/project","junit-jupiter-engine/src/test","junit-jupiter-params/src/main/java/org/junit","junit-platform-suite-api","junit-vintage-engine/src/test","platform-tests/src/test/java/org/junit/platform/launcher/tagexpression","platform-tooling-support-tests/src/test/java/platform/tooling/support/tests","junit-jupiter-params/src/test/java/org/junit","junit-jupiter-migrationsupport/src/main/java/org/junit/jupiter/migrationsupport/rules/member","junit-platform-surefire-provider/src/test/java/org/junit/platform/surefire","junit-jupiter-params","junit-jupiter-params/src/main/java/org/junit/jupiter","junit-vintage-engine/src/test/java/org/junit/vintage/engine/support","documentation","platform-tooling-support-tests/projects/ant-starter","junit-jupiter-migrationsupport/src/main","junit-platform-runner/src/main","junit-platform-console/src/main","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension","junit-platform-commons/src/main","documentation/src/test/java/example/exception","junit-platform-console-standalone/src/test/java/standalone","junit-platform-console-standalone","junit-vintage-engine/src/main/java/org/junit/vintage","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/execution/injection","documentation/src","junit-platform-engine/src/test/java/org","junit-platform-engine/src/main","junit-platform-commons/src/main/java","junit-platform-launcher/src/main/java/org/junit","platform-tooling-support-tests/projects","platform-tooling-support-tests/projects/ant-starter/src/test/java/com/example","junit-jupiter-migrationsupport/src/test/java/org","platform-tooling-support-tests/projects/maven-starter/src/main","junit-jupiter-migrationsupport/src/main/java/org/junit/jupiter/migrationsupport/rules","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine","junit-platform-commons-java-9/src/test/java/org/junit/platform/commons","junit-jupiter-migrationsupport/src/main/java/org/junit/jupiter","junit-jupiter-engine/src/main/java/org","platform-tests/src/test/java/org/junit/platform/console","platform-tests/src/test/java/org/junit/platform/engine","junit-platform-console-standalone/src","platform-tooling-support-tests/src/main/java/platform/tooling","documentation/src/test/java/org/junit/api/tools","documentation/src/test/java/org/junit/api","platform-tooling-support-tests/src/test/java/platform","junit-jupiter-api/src/main/java/org","junit-platform-surefire-provider/src/main/java/org","junit-jupiter-params/src/test","junit-vintage-engine/src/main/java","junit-jupiter-engine/src/test/java/org/junit","junit-platform-console/src","junit-platform-runner/src/main/java/org/junit/platform","junit-platform-runner","platform-tooling-support-tests/projects/maven-starter/src","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/script","junit-platform-engine/src/main/java/org","junit-platform-surefire-provider/src/main/java/org/junit/platform","platform-tests/src","platform-tooling-support-tests/projects/gradle-starter/src/test/java","junit-jupiter-engine/src/main/java/org/junit","platform-tests/src/test/java/org/junit/platform/launcher","junit-platform-engine/src/main/java/org/junit/platform/engine/support/filter","junit-platform-commons-java-9/src/main","junit-jupiter-params/src/main/java","platform-tests/src/jmh/java/org","junit-platform-console/src/main/java/org","junit-platform-engine/src/test/java","platform-tests/src/test/java/org/junit/platform","junit-jupiter-params/src/test/java/org","junit-jupiter-engine/src/test/java","junit-platform-engine/src/test/java/org/junit/platform/engine","platform-tests/src/test/java/org/junit/platform/console/options","platform-tooling-support-tests/projects/gradle-starter/src/main/java/com/example/project","junit-jupiter-api/src/main/java/org/junit/jupiter/api/parallel","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/bridge","junit-platform-runner/src","junit-platform-launcher/src/main/java/org","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery/predicates","platform-tooling-support-tests/src/test/java","junit-platform-commons-java-9/src","junit-platform-suite-api/src/main/java/org","platform-tooling-support-tests/projects/maven-starter/src/main/java/com/example","junit-platform-commons-java-9/src/main/java/org","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/extension/sub","junit-jupiter-engine/src/test/java/org","platform-tests","junit-jupiter-params/src/test/java/org/junit/jupiter","junit-platform-commons/src","junit-platform-suite-api/src","junit-platform-surefire-provider/src/test/java/org/junit/platform/surefire/provider","platform-tooling-support-tests/projects/gradle-starter/src/test/java/com/example","platform-tooling-support-tests/projects/maven-starter/src/test/java/com/example/project","junit-platform-console/src/main/java/org/junit/platform/console","platform-tooling-support-tests/projects/gradle-missing-engine","junit-platform-commons/src/main/java/org","junit-jupiter-params/src/main/java/org/junit/jupiter/params/support","platform-tooling-support-tests/projects/ant-starter/src/main","platform-tests/src/test/java/org/junit/platform/engine/support/descriptor","junit-vintage-engine/src/main/java/org/junit/vintage/engine/execution","junit-vintage-engine/src/test/java/org","junit-vintage-engine/src/test/java/org/junit/vintage/engine/samples","junit-platform-commons-java-9/src/test/java/integration","junit-platform-engine/src/main/java/org/junit/platform/engine/reporting","junit-platform-launcher/src/main/java","junit-vintage-engine/src","junit-vintage-engine/src/test/java/org/junit/vintage/engine/samples/junit4","platform-tooling-support-tests/projects/gradle-starter/src/test/java/com","junit-vintage-engine/src/test/java/org/junit/vintage/engine/samples/junit3","platform-tooling-support-tests/src/main/java/platform","junit-platform-launcher/src/main/java/org/junit/platform","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/discovery","junit-platform-runner/src/main/java/org/junit","platform-tests/src/test/java/org/junit/platform/engine/support","junit-jupiter-params/src/main/java/org","junit-jupiter-engine/src/test/java/org/junit/jupiter/api/subpackage","junit-platform-commons/src/main/java/org/junit/platform/commons/util","platform-tooling-support-tests/projects/gradle-starter/src/main/java","junit-platform-engine/src/main/java","platform-tooling-support-tests/projects/gradle-starter","platform-tooling-support-tests/src/test","junit-vintage-engine/src/test/java","documentation/src/test/java/example/defaultmethods","junit-jupiter-migrationsupport/src/test/java/org/junit/jupiter","junit-jupiter-api/src/main/java/org/junit/jupiter/api/function","junit-jupiter-params/src/test/java/org/junit/jupiter/params/converter","junit-vintage-engine/src/main/java/org/junit/vintage/engine/discovery","platform-tooling-support-tests/projects/ant-starter/src/test/java","platform-tests/src/test/java/org/junit/platform/launcher/core","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/discovery/predicates","junit-platform-engine/src/main/java/org/junit/platform/engine/support","junit-platform-commons-java-9/src/test/java/org/junit/platform/commons/util","platform-tooling-support-tests","platform-tooling-support-tests/projects/gradle-starter/src","junit-platform-suite-api/src/main/java","junit-platform-surefire-provider","documentation/src/test/java/extensions","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/execution/injection/sample","junit-platform-commons","junit-platform-launcher/src/main/java/org/junit/platform/launcher/core","platform-tests/src/test/java/org/junit/platform/engine/support/hierarchical","junit-platform-surefire-provider/src/test/java/org/junit/platform","platform-tooling-support-tests/projects/gradle-missing-engine/src/test/java","junit-platform-launcher/src/main/java/org/junit/platform/launcher","junit-platform-engine/src/test/java/org/junit/platform","junit-jupiter-engine/src/test/java/org/junit/jupiter","junit-vintage-engine/src/test/java/org/junit/vintage/engine/execution","documentation/src/test/java/org/junit","junit-platform-commons-java-9/src/test/java/org/junit","platform-tooling-support-tests/projects/ant-starter/src/main/java","junit-platform-commons-java-9/src/main/java/org/junit","documentation/src/test/java/example/registration","junit-platform-launcher","platform-tooling-support-tests/projects/gradle-starter/src/main/java/com","junit-jupiter-params/src/main/java/org/junit/jupiter/params/provider","junit-platform-commons-java-9","junit-vintage-engine/src/test/java/org/junit","junit-platform-commons/src/main/java/org/junit/platform/commons","junit-jupiter-params/src/main/java/org/junit/jupiter/params/converter","junit-jupiter-migrationsupport/src/main/java","junit-platform-launcher/src/main","platform-tests/src/test/java/org/junit/jupiter/extensions","platform-tooling-support-tests/projects/gradle-starter/src/main/java/com/example","platform-tests/src/test/java/org","src/spotless","junit-jupiter-engine/src/test/java/org/junit/jupiter/api","junit-platform-console/src/main/java/org/junit/platform","junit-jupiter-params/src/main","junit-platform-console/src/main/java/org/junit","platform-tooling-support-tests/src/main/java/platform/tooling/support","platform-tests/src/jmh/java/org/junit/jupiter/jmh","platform-tooling-support-tests/projects/ant-starter/src/test/java/com/example/project","platform-tests/src/test/java/org/junit/platform/console/subpackage","junit-platform-commons-java-9/src/test/java","junit-platform-commons-java-9/src/test","platform-tooling-support-tests/src","junit-jupiter-migrationsupport/src/test/java","junit-jupiter-api/src/main/java/org/junit/jupiter/api","junit-jupiter-api/src/main/java","junit-platform-commons-java-9/src/main/java/org/junit/platform","junit-jupiter-migrationsupport/src/main/java/org/junit","junit-vintage-engine/src/main/java/org/junit/vintage/engine/descriptor","platform-tests/src/test/java","platform-tooling-support-tests/projects/ant-starter/src/main/java/com/example","junit-jupiter-migrationsupport/src/main/java/org/junit/jupiter/migrationsupport","junit-jupiter-migrationsupport/src/test/java/org/junit/jupiter/migrationsupport/rules","junit-platform-runner/src/main/java/org/junit/platform/runner","junit-platform-engine/src/test","junit-platform-suite-api/src/main","platform-tests/src/test/java/org/junit/platform/engine/support/config","platform-tooling-support-tests/projects/ant-starter/src/main/java/com","junit-jupiter-migrationsupport/src/test/java/org/junit","platform-tooling-support-tests/projects/gradle-missing-engine/src/test","platform-tests/src/jmh/java","junit-vintage-engine/src/main","platform-tooling-support-tests/projects/gradle-starter/src/test","junit-platform-surefire-provider/src/test/java","junit-platform-commons-java-9/src/main/java/org/junit/platform/commons/util","platform-tests/src/test/java/org/junit","junit-vintage-engine/src/test/java/org/junit/vintage/engine/descriptor","junit-platform-surefire-provider/src/main/java/org/junit","junit-vintage-engine/src/main/java/org","junit-platform-surefire-provider/src/main","junit-jupiter-api/src/main","junit-platform-engine/src/test/java/org/junit/platform/engine/test","platform-tooling-support-tests/projects/maven-starter/src/main/java","junit-platform-commons/src/main/java/org/junit/platform/commons/annotation","junit-platform-commons-java-9/src/test/java/org","junit-platform-surefire-provider/src/main/java/org/junit/platform/surefire/provider","platform-tooling-support-tests/src/test/java/platform/tooling","platform-tooling-support-tests/projects/maven-starter/src/test/java/com","junit-platform-commons-java-9/src/main/java","platform-tooling-support-tests/projects/maven-starter","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/descriptor","documentation/src/test/java/example/testinterface","junit-vintage-engine/src/main/java/org/junit/vintage/engine","junit-platform-engine/src/main/java/org/junit/platform","junit-platform-engine/src","junit-platform-suite-api/src/main/java/org/junit/platform/suite/api","junit-platform-suite-api/src/main/java/org/junit/platform","platform-tests/src/test/java/org/junit/platform/engine/discovery","junit-jupiter-params/src/test/java/org/junit/jupiter/params/provider","junit-jupiter-migrationsupport","junit-platform-surefire-provider/src","junit-platform-launcher/src","platform-tooling-support-tests/projects/ant-starter/src/test/java/com","junit-jupiter-engine/src","junit-jupiter-engine","junit-jupiter-migrationsupport/src/test","platform-tooling-support-tests/projects/maven-starter/src/test","junit-platform-engine/src/main/java/org/junit/platform/engine","junit-jupiter-engine/src/main/java","junit-vintage-engine/src/main/java/org/junit","platform-tests/src/test/java/org/junit/platform/console/tasks","junit-platform-console","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution","junit-platform-console/src/main/java","junit-jupiter-api","junit-platform-engine/src/main/java/org/junit/platform/engine/support/config","junit-platform-engine/src/main/java/org/junit/platform/engine/support/descriptor","junit-jupiter-migrationsupport/src/main/java/org","platform-tooling-support-tests/projects/maven-starter/src/test/java","junit-platform-console/src/main/java/org/junit/platform/console/options","documentation/src/test/java/example","junit-jupiter-api/src/main/java/org/junit","junit-platform-suite-api/src/main/java/org/junit","junit-platform-suite-api/src/main/java/org/junit/platform/suite","junit-platform-launcher/src/main/java/org/junit/platform/launcher/listeners","platform-tests/src/test/java/org/junit/platform/runner","junit-platform-commons/src/main/java/org/junit/platform","platform-tests/src/jmh/java/org/junit","junit-platform-launcher/src/main/java/org/junit/platform/launcher/tagexpression","junit-jupiter-engine/src/main/java/org/junit/jupiter","platform-tests/src/test/java/org/junit/platform/commons/util","documentation/src/test/java/example/timing","junit-platform-console-standalone/src/test","junit-platform-surefire-provider/src/test","documentation/src/test","platform-tooling-support-tests/src/test/java/platform/tooling/support","junit-vintage-engine/src/test/java/org/junit/vintage","junit-platform-surefire-provider/src/test/java/org","junit-platform-engine/src/main/java/org/junit/platform/engine/discovery","junit-platform-surefire-provider/src/test/java/org/junit","junit-platform-commons/src/main/java/org/junit/platform/commons/support","junit-jupiter-migrationsupport/src/test/java/org/junit/jupiter/migrationsupport","junit-jupiter-params/src/test/java/org/junit/jupiter/params/aggregator","junit-jupiter-params/src/test/java/org/junit/jupiter/params","junit-platform-runner/src/main/java","platform-tooling-support-tests/src/main/java","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/extension","junit-platform-console/src/main/java/org/junit/platform/console/tasks","platform-tests/src/test/java/org/junit/platform/commons/support","junit-jupiter-migrationsupport/src","junit-jupiter-api/src/main/java/org/junit/jupiter","junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical","junit-vintage-engine/src/main/java/org/junit/vintage/engine/support","platform-tooling-support-tests/projects/ant-starter/src/test","platform-tests/src/test/java/org/junit/platform/launcher/listeners","platform-tests/src/jmh/java/org/junit/jupiter","junit-jupiter-engine/src/main","junit-vintage-engine/src/test/java/org/junit/vintage/engine/discovery","junit-platform-commons-java-9/src/test/java/org/junit/platform","documentation/src/test/java","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/descriptor/subpackage","platform-tests/src/test","platform-tooling-support-tests/projects/ant-starter/src/main/java/com/example/project","platform-tests/src/jmh","junit-jupiter-params/src/main/java/org/junit/jupiter/params","platform-tooling-support-tests/projects/gradle-starter/src/main","junit-platform-surefire-provider/src/main/java/org/junit/platform/surefire","junit-jupiter-api/src","platform-tests/src/test/java/org/junit/platform/commons","junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/script","platform-tooling-support-tests/projects/ant-starter/src","junit-platform-commons-java-9/src/main/java/org/junit/platform/commons","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor","junit-vintage-engine/src/test/java/org/junit/vintage/engine","src","junit-jupiter-params/src","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/discovery","junit-platform-surefire-provider/src/main/java","junit-jupiter-api/src/main/java/org/junit/jupiter/api/extension","junit-platform-engine/src/main/java/org/junit","platform-tooling-support-tests/projects/gradle-missing-engine/src","junit-platform-commons/src/main/java/org/junit","junit-platform-console-standalone/src/test/java","platform-tooling-support-tests/projects/maven-starter/src/main/java/com","junit-jupiter-migrationsupport/src/main/java/org/junit/jupiter/migrationsupport/rules/adapter","junit-jupiter-params/src/main/java/org/junit/jupiter/params/aggregator","junit-jupiter-engine/src/test/java/org/junit/jupiter/api/condition","junit-jupiter-api/src/main/java/org/junit/jupiter/api/condition","junit-jupiter-engine/src/main/java/org/junit/jupiter/engine","platform-tooling-support-tests/src/main","junit-platform-engine","junit-platform-engine/src/test/java/org/junit","junit-jupiter-engine/src/test/java/org/junit/jupiter/api/extension"]} \ No newline at end of file diff --git a/src/test/resources/oracle/commits/junit5-77cfe71e7f787c59626198e25350545f41e968bd/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ClassTestDescriptor.java b/src/test/resources/oracle/commits/junit5-77cfe71e7f787c59626198e25350545f41e968bd/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ClassTestDescriptor.java new file mode 100644 index 00000000000..1e4bf578874 --- /dev/null +++ b/src/test/resources/oracle/commits/junit5-77cfe71e7f787c59626198e25350545f41e968bd/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ClassTestDescriptor.java @@ -0,0 +1,439 @@ +/* + * Copyright 2015-2018 the original author or authors. + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License v2.0 which + * accompanies this distribution and is available at + * + * http://www.eclipse.org/legal/epl-v20.html + */ + +package org.junit.jupiter.engine.descriptor; + +import static java.util.stream.Collectors.joining; +import static org.apiguardian.api.API.Status.INTERNAL; +import static org.junit.jupiter.engine.descriptor.ExtensionUtils.populateNewExtensionRegistryFromExtendWithAnnotation; +import static org.junit.jupiter.engine.descriptor.ExtensionUtils.registerExtensionsFromFields; +import static org.junit.jupiter.engine.descriptor.LifecycleMethodUtils.findAfterAllMethods; +import static org.junit.jupiter.engine.descriptor.LifecycleMethodUtils.findAfterEachMethods; +import static org.junit.jupiter.engine.descriptor.LifecycleMethodUtils.findBeforeAllMethods; +import static org.junit.jupiter.engine.descriptor.LifecycleMethodUtils.findBeforeEachMethods; +import static org.junit.jupiter.engine.descriptor.TestInstanceLifecycleUtils.getTestInstanceLifecycle; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.function.Function; + +import org.apiguardian.api.API; +import org.junit.jupiter.api.TestInstance.Lifecycle; +import org.junit.jupiter.api.extension.AfterAllCallback; +import org.junit.jupiter.api.extension.BeforeAllCallback; +import org.junit.jupiter.api.extension.Extension; +import org.junit.jupiter.api.extension.ExtensionConfigurationException; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.TestInstanceFactory; +import org.junit.jupiter.api.extension.TestInstancePostProcessor; +import org.junit.jupiter.api.extension.TestInstantiationException; +import org.junit.jupiter.engine.execution.AfterEachMethodAdapter; +import org.junit.jupiter.engine.execution.BeforeEachMethodAdapter; +import org.junit.jupiter.engine.execution.ExecutableInvoker; +import org.junit.jupiter.engine.execution.JupiterEngineExecutionContext; +import org.junit.jupiter.engine.execution.TestInstanceProvider; +import org.junit.jupiter.engine.extension.ExtensionRegistry; +import org.junit.platform.commons.JUnitException; +import org.junit.platform.commons.util.BlacklistedExceptions; +import org.junit.platform.commons.util.Preconditions; +import org.junit.platform.commons.util.ReflectionUtils; +import org.junit.platform.commons.util.StringUtils; +import org.junit.platform.engine.TestDescriptor; +import org.junit.platform.engine.TestTag; +import org.junit.platform.engine.UniqueId; +import org.junit.platform.engine.support.descriptor.ClassSource; +import org.junit.platform.engine.support.hierarchical.ExclusiveResource; +import org.junit.platform.engine.support.hierarchical.OpenTest4JAwareThrowableCollector; +import org.junit.platform.engine.support.hierarchical.ThrowableCollector; + +/** + * {@link TestDescriptor} for tests based on Java classes. + * + *

Default Display Names

+ * + *

The default display name for a top-level or nested static test class is + * the fully qualified name of the class with the package name and leading dot + * (".") removed. + * + * @since 5.0 + */ +@API(status = INTERNAL, since = "5.0") +public class ClassTestDescriptor extends JupiterTestDescriptor { + + private static final ExecutableInvoker executableInvoker = new ExecutableInvoker(); + + private final Class testClass; + private final Set tags; + + private TestInstanceFactory testInstanceFactory; + private List beforeAllMethods; + private List afterAllMethods; + + public ClassTestDescriptor(UniqueId uniqueId, Class testClass) { + this(uniqueId, ClassTestDescriptor::generateDefaultDisplayName, testClass); + } + + protected ClassTestDescriptor(UniqueId uniqueId, Function, String> defaultDisplayNameGenerator, + Class testClass) { + + super(uniqueId, determineDisplayName(Preconditions.notNull(testClass, "Class must not be null"), + defaultDisplayNameGenerator), ClassSource.from(testClass)); + + this.testClass = testClass; + this.tags = getTags(testClass); + } + + // --- TestDescriptor ------------------------------------------------------ + + @Override + public Set getTags() { + // return modifiable copy + return new LinkedHashSet<>(this.tags); + } + + public final Class getTestClass() { + return this.testClass; + } + + @Override + public Type getType() { + return Type.CONTAINER; + } + + @Override + public String getLegacyReportingName() { + return this.testClass.getName(); + } + + private static String generateDefaultDisplayName(Class testClass) { + String name = testClass.getName(); + int index = name.lastIndexOf('.'); + return name.substring(index + 1); + } + + // --- Node ---------------------------------------------------------------- + + @Override + public ExecutionMode getExecutionMode() { + return getExecutionMode(getTestClass()); + } + + @Override + public Set getExclusiveResources() { + return getExclusiveResources(getTestClass()); + } + + @Override + public JupiterEngineExecutionContext prepare(JupiterEngineExecutionContext context) { + ExtensionRegistry registry = populateNewExtensionRegistryFromExtendWithAnnotation( + context.getExtensionRegistry(), this.testClass); + + // Register extensions from static fields here, at the class level but + // after extensions registered via @ExtendWith. + registerExtensionsFromFields(registry, this.testClass, null); + + // Resolve the TestInstanceFactory at the class level in order to fail + // the entire class in case of configuration errors (e.g., more than + // one factory registered per class). + this.testInstanceFactory = resolveTestInstanceFactory(registry); + + registerBeforeEachMethodAdapters(registry); + registerAfterEachMethodAdapters(registry); + + Lifecycle lifecycle = getTestInstanceLifecycle(this.testClass, context.getConfigurationParameters()); + ThrowableCollector throwableCollector = new OpenTest4JAwareThrowableCollector(); + ClassExtensionContext extensionContext = new ClassExtensionContext(context.getExtensionContext(), + context.getExecutionListener(), this, lifecycle, context.getConfigurationParameters(), throwableCollector); + + this.beforeAllMethods = findBeforeAllMethods(this.testClass, lifecycle == Lifecycle.PER_METHOD); + this.afterAllMethods = findAfterAllMethods(this.testClass, lifecycle == Lifecycle.PER_METHOD); + + // @formatter:off + return context.extend() + .withTestInstanceProvider(testInstanceProvider(context, registry, extensionContext)) + .withExtensionRegistry(registry) + .withExtensionContext(extensionContext) + .withThrowableCollector(throwableCollector) + .build(); + // @formatter:on + } + + @Override + public JupiterEngineExecutionContext before(JupiterEngineExecutionContext context) { + ThrowableCollector throwableCollector = context.getThrowableCollector(); + + Lifecycle lifecycle = context.getExtensionContext().getTestInstanceLifecycle().orElse(Lifecycle.PER_METHOD); + if (lifecycle == Lifecycle.PER_CLASS) { + // Eagerly load test instance for BeforeAllCallbacks, if necessary, + // and store the instance in the ExtensionContext. + ClassExtensionContext extensionContext = (ClassExtensionContext) context.getExtensionContext(); + throwableCollector.execute(() -> extensionContext.setTestInstance( + context.getTestInstanceProvider().getTestInstance(Optional.empty()))); + } + + if (throwableCollector.isEmpty()) { + context.beforeAllCallbacksExecuted(true); + invokeBeforeAllCallbacks(context); + + if (throwableCollector.isEmpty()) { + context.beforeAllMethodsExecuted(true); + invokeBeforeAllMethods(context); + } + } + + throwableCollector.assertEmpty(); + + return context; + } + + @Override + public void after(JupiterEngineExecutionContext context) { + + ThrowableCollector throwableCollector = context.getThrowableCollector(); + Throwable previousThrowable = throwableCollector.getThrowable(); + + if (context.beforeAllMethodsExecuted()) { + invokeAfterAllMethods(context); + } + + if (context.beforeAllCallbacksExecuted()) { + invokeAfterAllCallbacks(context); + } + + // If the previous Throwable was not null when this method was called, + // that means an exception was already thrown either before or during + // the execution of this Node. If an exception was already thrown, any + // later exceptions were added as suppressed exceptions to that original + // exception unless a more severe exception occurred in the meantime. + if (previousThrowable != throwableCollector.getThrowable()) { + throwableCollector.assertEmpty(); + } + } + + private TestInstanceFactory resolveTestInstanceFactory(ExtensionRegistry registry) { + + List localFactories = registry.getLocalExtensions(TestInstanceFactory.class); + if (localFactories.isEmpty()) { + return null; + } + + ExtensionRegistry parentRegistry = registry.getParent(); + if (parentRegistry != null) { + List parentFactories = parentRegistry.getExtensions(TestInstanceFactory.class); + localFactories.removeAll(parentFactories); + if (localFactories.isEmpty()) { + return null; + } + } + + if (localFactories.size() > 1) { + String factoryNames = localFactories.stream().map(factory -> factory.getClass().getName()).collect( + joining(", ")); + + String errorMessage = String.format( + "The following TestInstanceFactory extensions were registered for test class [%s], but only one is permitted: %s", + testClass.getName(), factoryNames); + + throw new ExtensionConfigurationException(errorMessage); + } + + return localFactories.get(0); + } + + private TestInstanceProvider testInstanceProvider(JupiterEngineExecutionContext parentExecutionContext, + ExtensionRegistry registry, ClassExtensionContext extensionContext) { + + TestInstanceProvider testInstanceProvider = childRegistry -> instantiateAndPostProcessTestInstance( + parentExecutionContext, extensionContext, childRegistry.orElse(registry)); + + return childRegistry -> extensionContext.getTestInstance().orElseGet( + () -> testInstanceProvider.getTestInstance(childRegistry)); + } + + private Object instantiateAndPostProcessTestInstance(JupiterEngineExecutionContext parentExecutionContext, + ExtensionContext extensionContext, ExtensionRegistry registry) { + + Object instance = instantiateTestClass(parentExecutionContext, registry, extensionContext); + invokeTestInstancePostProcessors(instance, registry, extensionContext); + // In addition, we register extensions from instance fields here since the + // best time to do that is immediately following test class instantiation + // and post processing. + registerExtensionsFromFields(registry, this.testClass, instance); + return instance; + } + + protected Object instantiateTestClass(JupiterEngineExecutionContext parentExecutionContext, + ExtensionRegistry registry, ExtensionContext extensionContext) { + + return instantiateTestClass(Optional.empty(), registry, extensionContext); + } + + protected Object instantiateTestClass(Optional outerInstance, ExtensionRegistry registry, + ExtensionContext extensionContext) { + + return this.testInstanceFactory != null // + ? invokeTestInstanceFactory(outerInstance, extensionContext) // + : invokeTestClassConstructor(outerInstance, registry, extensionContext); + } + + private Object invokeTestInstanceFactory(Optional outerInstance, ExtensionContext extensionContext) { + Object instance; + + try { + instance = this.testInstanceFactory.createTestInstance( + new DefaultTestInstanceFactoryContext(this.testClass, outerInstance), extensionContext); + } + catch (Throwable throwable) { + BlacklistedExceptions.rethrowIfBlacklisted(throwable); + + if (throwable instanceof TestInstantiationException) { + throw (TestInstantiationException) throwable; + } + + String message = String.format("TestInstanceFactory [%s] failed to instantiate test class [%s]", + this.testInstanceFactory.getClass().getName(), this.testClass.getName()); + if (StringUtils.isNotBlank(throwable.getMessage())) { + message += ": " + throwable.getMessage(); + } + throw new TestInstantiationException(message, throwable); + } + + if (!this.testClass.isInstance(instance)) { + String testClassName = this.testClass.getName(); + Class instanceClass = (instance == null ? null : instance.getClass()); + String instanceClassName = (instanceClass == null ? "null" : instanceClass.getName()); + + // If the test instance was loaded via a different ClassLoader, append + // the identity hash codes to the type names to help users disambiguate + // between otherwise identical "fully qualified class names". + if (testClassName.equals(instanceClassName)) { + testClassName += "@" + Integer.toHexString(System.identityHashCode(this.testClass)); + instanceClassName += "@" + Integer.toHexString(System.identityHashCode(instanceClass)); + } + String message = String.format( + "TestInstanceFactory [%s] failed to return an instance of [%s] and instead returned an instance of [%s].", + this.testInstanceFactory.getClass().getName(), testClassName, instanceClassName); + + throw new TestInstantiationException(message); + } + + return instance; + } + + private Object invokeTestClassConstructor(Optional outerInstance, ExtensionRegistry registry, + ExtensionContext extensionContext) { + + Constructor constructor = ReflectionUtils.getDeclaredConstructor(this.testClass); + return outerInstance.isPresent() // + ? executableInvoker.invoke(constructor, outerInstance.get(), extensionContext, registry) // + : executableInvoker.invoke(constructor, extensionContext, registry); + } + + private void invokeTestInstancePostProcessors(Object instance, ExtensionRegistry registry, + ExtensionContext context) { + + registry.stream(TestInstancePostProcessor.class).forEach( + extension -> executeAndMaskThrowable(() -> extension.postProcessTestInstance(instance, context))); + } + + private void invokeBeforeAllCallbacks(JupiterEngineExecutionContext context) { + ExtensionRegistry registry = context.getExtensionRegistry(); + ExtensionContext extensionContext = context.getExtensionContext(); + ThrowableCollector throwableCollector = context.getThrowableCollector(); + + for (BeforeAllCallback callback : registry.getExtensions(BeforeAllCallback.class)) { + throwableCollector.execute(() -> callback.beforeAll(extensionContext)); + if (throwableCollector.isNotEmpty()) { + break; + } + } + } + + private void invokeBeforeAllMethods(JupiterEngineExecutionContext context) { + ExtensionRegistry registry = context.getExtensionRegistry(); + ExtensionContext extensionContext = context.getExtensionContext(); + ThrowableCollector throwableCollector = context.getThrowableCollector(); + Object testInstance = extensionContext.getTestInstance().orElse(null); + + for (Method method : this.beforeAllMethods) { + throwableCollector.execute( + () -> executableInvoker.invoke(method, testInstance, extensionContext, registry)); + if (throwableCollector.isNotEmpty()) { + break; + } + } + } + + private void invokeAfterAllMethods(JupiterEngineExecutionContext context) { + ExtensionRegistry registry = context.getExtensionRegistry(); + ExtensionContext extensionContext = context.getExtensionContext(); + ThrowableCollector throwableCollector = context.getThrowableCollector(); + Object testInstance = extensionContext.getTestInstance().orElse(null); + + this.afterAllMethods.forEach(method -> throwableCollector.execute( + () -> executableInvoker.invoke(method, testInstance, extensionContext, registry))); + } + + private void invokeAfterAllCallbacks(JupiterEngineExecutionContext context) { + ExtensionRegistry registry = context.getExtensionRegistry(); + ExtensionContext extensionContext = context.getExtensionContext(); + ThrowableCollector throwableCollector = context.getThrowableCollector(); + + registry.getReversedExtensions(AfterAllCallback.class)// + .forEach(extension -> throwableCollector.execute(() -> extension.afterAll(extensionContext))); + } + + private void registerBeforeEachMethodAdapters(ExtensionRegistry registry) { + List beforeEachMethods = findBeforeEachMethods(this.testClass); + registerMethodsAsExtensions(beforeEachMethods, registry, this::synthesizeBeforeEachMethodAdapter); + } + + private void registerAfterEachMethodAdapters(ExtensionRegistry registry) { + // Make a local copy since findAfterEachMethods() returns an immutable list. + List afterEachMethods = new ArrayList<>(findAfterEachMethods(this.testClass)); + + // Since the bottom-up ordering of afterEachMethods will later be reversed when the + // synthesized AfterEachMethodAdapters are executed within TestMethodTestDescriptor, + // we have to reverse the afterEachMethods list to put them in top-down order before + // we register them as synthesized extensions. + Collections.reverse(afterEachMethods); + + registerMethodsAsExtensions(afterEachMethods, registry, this::synthesizeAfterEachMethodAdapter); + } + + private void registerMethodsAsExtensions(List methods, ExtensionRegistry registry, + Function extensionSynthesizer) { + + methods.forEach(method -> registry.registerExtension(extensionSynthesizer.apply(method), method)); + } + + private BeforeEachMethodAdapter synthesizeBeforeEachMethodAdapter(Method method) { + return (extensionContext, registry) -> invokeMethodInExtensionContext(method, extensionContext, registry); + } + + private AfterEachMethodAdapter synthesizeAfterEachMethodAdapter(Method method) { + return (extensionContext, registry) -> invokeMethodInExtensionContext(method, extensionContext, registry); + } + + private void invokeMethodInExtensionContext(Method method, ExtensionContext context, ExtensionRegistry registry) { + Object testInstance = context.getRequiredTestInstance(); + testInstance = ReflectionUtils.getOutermostInstance(testInstance, method.getDeclaringClass()).orElseThrow( + () -> new JUnitException("Failed to find instance for method: " + method.toGenericString())); + + executableInvoker.invoke(method, testInstance, context, registry); + } + +} diff --git a/src/test/resources/oracle/commits/junit5-77cfe71e7f787c59626198e25350545f41e968bd/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/TestFactoryTestDescriptor.java b/src/test/resources/oracle/commits/junit5-77cfe71e7f787c59626198e25350545f41e968bd/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/TestFactoryTestDescriptor.java new file mode 100644 index 00000000000..36633e6b2ad --- /dev/null +++ b/src/test/resources/oracle/commits/junit5-77cfe71e7f787c59626198e25350545f41e968bd/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/TestFactoryTestDescriptor.java @@ -0,0 +1,158 @@ +/* + * Copyright 2015-2018 the original author or authors. + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License v2.0 which + * accompanies this distribution and is available at + * + * http://www.eclipse.org/legal/epl-v20.html + */ + +package org.junit.jupiter.engine.descriptor; + +import static org.apiguardian.api.API.Status.INTERNAL; +import static org.junit.platform.engine.support.descriptor.ClasspathResourceSource.CLASSPATH_SCHEME; + +import java.lang.reflect.Method; +import java.net.URI; +import java.util.Iterator; +import java.util.Optional; +import java.util.function.Supplier; +import java.util.stream.Stream; + +import org.apiguardian.api.API; +import org.junit.jupiter.api.DynamicContainer; +import org.junit.jupiter.api.DynamicNode; +import org.junit.jupiter.api.DynamicTest; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.engine.execution.ExecutableInvoker; +import org.junit.jupiter.engine.execution.JupiterEngineExecutionContext; +import org.junit.platform.commons.JUnitException; +import org.junit.platform.commons.util.CollectionUtils; +import org.junit.platform.commons.util.PreconditionViolationException; +import org.junit.platform.commons.util.Preconditions; +import org.junit.platform.engine.TestSource; +import org.junit.platform.engine.UniqueId; +import org.junit.platform.engine.support.descriptor.ClasspathResourceSource; +import org.junit.platform.engine.support.descriptor.UriSource; + +/** + * {@link org.junit.platform.engine.TestDescriptor TestDescriptor} for + * {@link org.junit.jupiter.api.TestFactory @TestFactory} methods. + * + * @since 5.0 + */ +@API(status = INTERNAL, since = "5.0") +public class TestFactoryTestDescriptor extends TestMethodTestDescriptor implements Filterable { + + public static final String DYNAMIC_CONTAINER_SEGMENT_TYPE = "dynamic-container"; + public static final String DYNAMIC_TEST_SEGMENT_TYPE = "dynamic-test"; + + private static final ExecutableInvoker executableInvoker = new ExecutableInvoker(); + + private final DynamicDescendantFilter dynamicDescendantFilter = new DynamicDescendantFilter(); + + public TestFactoryTestDescriptor(UniqueId uniqueId, Class testClass, Method testMethod) { + super(uniqueId, testClass, testMethod); + } + + // --- Filterable ---------------------------------------------------------- + + @Override + public DynamicDescendantFilter getDynamicDescendantFilter() { + return dynamicDescendantFilter; + } + + // --- TestDescriptor ------------------------------------------------------ + + @Override + public Type getType() { + return Type.CONTAINER; + } + + @Override + public boolean mayRegisterTests() { + return true; + } + + // --- Node ---------------------------------------------------------------- + + @Override + protected void invokeTestMethod(JupiterEngineExecutionContext context, DynamicTestExecutor dynamicTestExecutor) { + ExtensionContext extensionContext = context.getExtensionContext(); + + context.getThrowableCollector().execute(() -> { + Object instance = extensionContext.getRequiredTestInstance(); + Object testFactoryMethodResult = executableInvoker.invoke(getTestMethod(), instance, extensionContext, + context.getExtensionRegistry()); + TestSource defaultTestSource = getSource().orElseThrow( + () -> new JUnitException("Illegal state: TestSource must be present")); + try (Stream dynamicNodeStream = toDynamicNodeStream(testFactoryMethodResult)) { + int index = 1; + Iterator iterator = dynamicNodeStream.iterator(); + while (iterator.hasNext()) { + DynamicNode dynamicNode = iterator.next(); + Optional descriptor = createDynamicDescriptor(this, dynamicNode, index++, + defaultTestSource, getDynamicDescendantFilter()); + descriptor.ifPresent(dynamicTestExecutor::execute); + } + } + catch (ClassCastException ex) { + throw invalidReturnTypeException(ex); + } + }); + } + + @SuppressWarnings("unchecked") + private Stream toDynamicNodeStream(Object testFactoryMethodResult) { + try { + return (Stream) CollectionUtils.toStream(testFactoryMethodResult); + } + catch (PreconditionViolationException ex) { + throw invalidReturnTypeException(ex); + } + } + + private JUnitException invalidReturnTypeException(Throwable cause) { + String message = String.format( + "@TestFactory method [%s] must return a Stream, Collection, Iterable, or Iterator of %s.", + getTestMethod().toGenericString(), DynamicNode.class.getName()); + return new JUnitException(message, cause); + } + + static Optional createDynamicDescriptor(JupiterTestDescriptor parent, DynamicNode node, + int index, TestSource defaultTestSource, DynamicDescendantFilter dynamicDescendantFilter) { + + UniqueId uniqueId; + Supplier descriptorCreator; + Optional customTestSource = node.getTestSourceUri().map(TestFactoryTestDescriptor::fromUri); + TestSource source = customTestSource.orElse(defaultTestSource); + + if (node instanceof DynamicTest) { + DynamicTest test = (DynamicTest) node; + uniqueId = parent.getUniqueId().append(DYNAMIC_TEST_SEGMENT_TYPE, "#" + index); + descriptorCreator = () -> new DynamicTestTestDescriptor(uniqueId, index, test, source); + } + else { + DynamicContainer container = (DynamicContainer) node; + uniqueId = parent.getUniqueId().append(DYNAMIC_CONTAINER_SEGMENT_TYPE, "#" + index); + descriptorCreator = () -> new DynamicContainerTestDescriptor(uniqueId, index, container, source, + dynamicDescendantFilter); + } + if (dynamicDescendantFilter.test(uniqueId)) { + JupiterTestDescriptor descriptor = descriptorCreator.get(); + parent.addChild(descriptor); + return Optional.of(descriptor); + } + return Optional.empty(); + } + + /** + * @since 5.3 + */ + static TestSource fromUri(URI uri) { + Preconditions.notNull(uri, "URI must not be null"); + return CLASSPATH_SCHEME.equals(uri.getScheme()) ? ClasspathResourceSource.from(uri) : UriSource.from(uri); + } + +} diff --git a/src/test/resources/oracle/commits/junit5-77cfe71e7f787c59626198e25350545f41e968bd/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/TestMethodTestDescriptor.java b/src/test/resources/oracle/commits/junit5-77cfe71e7f787c59626198e25350545f41e968bd/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/TestMethodTestDescriptor.java new file mode 100644 index 00000000000..0ee14ece676 --- /dev/null +++ b/src/test/resources/oracle/commits/junit5-77cfe71e7f787c59626198e25350545f41e968bd/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/TestMethodTestDescriptor.java @@ -0,0 +1,234 @@ +/* + * Copyright 2015-2018 the original author or authors. + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License v2.0 which + * accompanies this distribution and is available at + * + * http://www.eclipse.org/legal/epl-v20.html + */ + +package org.junit.jupiter.engine.descriptor; + +import static org.apiguardian.api.API.Status.INTERNAL; +import static org.junit.jupiter.engine.descriptor.ExtensionUtils.populateNewExtensionRegistryFromExtendWithAnnotation; + +import java.lang.reflect.Method; +import java.util.List; +import java.util.Optional; +import java.util.function.BiFunction; + +import org.apiguardian.api.API; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.AfterTestExecutionCallback; +import org.junit.jupiter.api.extension.BeforeEachCallback; +import org.junit.jupiter.api.extension.BeforeTestExecutionCallback; +import org.junit.jupiter.api.extension.Extension; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.TestExecutionExceptionHandler; +import org.junit.jupiter.engine.execution.AfterEachMethodAdapter; +import org.junit.jupiter.engine.execution.BeforeEachMethodAdapter; +import org.junit.jupiter.engine.execution.ExecutableInvoker; +import org.junit.jupiter.engine.execution.JupiterEngineExecutionContext; +import org.junit.jupiter.engine.extension.ExtensionRegistry; +import org.junit.platform.commons.util.ExceptionUtils; +import org.junit.platform.engine.TestDescriptor; +import org.junit.platform.engine.UniqueId; +import org.junit.platform.engine.support.hierarchical.OpenTest4JAwareThrowableCollector; +import org.junit.platform.engine.support.hierarchical.ThrowableCollector; +import org.junit.platform.engine.support.hierarchical.ThrowableCollector.Executable; + +/** + * {@link TestDescriptor} for tests based on Java methods. + * + *

Default Display Names

+ * + *

The default display name for a test method is the name of the method + * concatenated with a comma-separated list of parameter types in parentheses. + * The names of parameter types are retrieved using {@link Class#getSimpleName()}. + * For example, the default display name for the following test method is + * {@code testUser(TestInfo, User)}. + * + *

+ *   {@literal @}Test
+ *   void testUser(TestInfo testInfo, {@literal @}Mock User user) { ... }
+ * 
+ * + * @since 5.0 + */ +@API(status = INTERNAL, since = "5.0") +public class TestMethodTestDescriptor extends MethodBasedTestDescriptor { + + private static final ExecutableInvoker executableInvoker = new ExecutableInvoker(); + + public TestMethodTestDescriptor(UniqueId uniqueId, Class testClass, Method testMethod) { + super(uniqueId, testClass, testMethod); + } + + TestMethodTestDescriptor(UniqueId uniqueId, String displayName, Class testClass, Method testMethod) { + super(uniqueId, displayName, testClass, testMethod); + } + + @Override + public Type getType() { + return Type.TEST; + } + + // --- Node ---------------------------------------------------------------- + + @Override + public JupiterEngineExecutionContext prepare(JupiterEngineExecutionContext context) throws Exception { + ExtensionRegistry registry = populateNewExtensionRegistry(context); + Object testInstance = context.getTestInstanceProvider().getTestInstance(Optional.of(registry)); + + ThrowableCollector throwableCollector = new OpenTest4JAwareThrowableCollector(); + ExtensionContext extensionContext = new MethodExtensionContext(context.getExtensionContext(), + context.getExecutionListener(), this, context.getConfigurationParameters(), testInstance, + throwableCollector); + + // @formatter:off + return context.extend() + .withExtensionRegistry(registry) + .withExtensionContext(extensionContext) + .withThrowableCollector(throwableCollector) + .build(); + // @formatter:on + } + + protected ExtensionRegistry populateNewExtensionRegistry(JupiterEngineExecutionContext context) { + return populateNewExtensionRegistryFromExtendWithAnnotation(context.getExtensionRegistry(), getTestMethod()); + } + + @Override + public JupiterEngineExecutionContext execute(JupiterEngineExecutionContext context, + DynamicTestExecutor dynamicTestExecutor) throws Exception { + ThrowableCollector throwableCollector = context.getThrowableCollector(); + + // @formatter:off + invokeBeforeEachCallbacks(context); + if (throwableCollector.isEmpty()) { + invokeBeforeEachMethods(context); + if (throwableCollector.isEmpty()) { + invokeBeforeTestExecutionCallbacks(context); + if (throwableCollector.isEmpty()) { + invokeTestMethod(context, dynamicTestExecutor); + } + invokeAfterTestExecutionCallbacks(context); + } + invokeAfterEachMethods(context); + } + invokeAfterEachCallbacks(context); + // @formatter:on + + throwableCollector.assertEmpty(); + + return context; + } + + private void invokeBeforeEachCallbacks(JupiterEngineExecutionContext context) { + invokeBeforeMethodsOrCallbacksUntilExceptionOccurs(context, + ((extensionContext, callback) -> () -> callback.beforeEach(extensionContext)), BeforeEachCallback.class); + } + + private void invokeBeforeEachMethods(JupiterEngineExecutionContext context) { + ExtensionRegistry registry = context.getExtensionRegistry(); + invokeBeforeMethodsOrCallbacksUntilExceptionOccurs(context, + ((extensionContext, adapter) -> () -> adapter.invokeBeforeEachMethod(extensionContext, registry)), + BeforeEachMethodAdapter.class); + } + + private void invokeBeforeTestExecutionCallbacks(JupiterEngineExecutionContext context) { + invokeBeforeMethodsOrCallbacksUntilExceptionOccurs(context, + ((extensionContext, callback) -> () -> callback.beforeTestExecution(extensionContext)), + BeforeTestExecutionCallback.class); + } + + private void invokeBeforeMethodsOrCallbacksUntilExceptionOccurs( + JupiterEngineExecutionContext context, BiFunction generator, + Class type) { + + ExtensionRegistry registry = context.getExtensionRegistry(); + ExtensionContext extensionContext = context.getExtensionContext(); + ThrowableCollector throwableCollector = context.getThrowableCollector(); + + for (T callback : registry.getExtensions(type)) { + Executable executable = generator.apply(extensionContext, callback); + throwableCollector.execute(executable); + if (throwableCollector.isNotEmpty()) { + break; + } + } + } + + protected void invokeTestMethod(JupiterEngineExecutionContext context, DynamicTestExecutor dynamicTestExecutor) { + ExtensionContext extensionContext = context.getExtensionContext(); + ThrowableCollector throwableCollector = context.getThrowableCollector(); + + throwableCollector.execute(() -> { + try { + Method testMethod = getTestMethod(); + Object instance = extensionContext.getRequiredTestInstance(); + executableInvoker.invoke(testMethod, instance, extensionContext, context.getExtensionRegistry()); + } + catch (Throwable throwable) { + invokeTestExecutionExceptionHandlers(context.getExtensionRegistry(), extensionContext, throwable); + } + }); + } + + private void invokeTestExecutionExceptionHandlers(ExtensionRegistry registry, ExtensionContext context, + Throwable ex) { + + invokeTestExecutionExceptionHandlers(ex, registry.getReversedExtensions(TestExecutionExceptionHandler.class), + context); + } + + private void invokeTestExecutionExceptionHandlers(Throwable ex, List handlers, + ExtensionContext context) { + + // No handlers left? + if (handlers.isEmpty()) { + ExceptionUtils.throwAsUncheckedException(ex); + } + + try { + // Invoke next available handler + handlers.remove(0).handleTestExecutionException(context, ex); + } + catch (Throwable t) { + invokeTestExecutionExceptionHandlers(t, handlers, context); + } + } + + private void invokeAfterTestExecutionCallbacks(JupiterEngineExecutionContext context) { + invokeAllAfterMethodsOrCallbacks(context, + ((extensionContext, callback) -> () -> callback.afterTestExecution(extensionContext)), + AfterTestExecutionCallback.class); + } + + private void invokeAfterEachMethods(JupiterEngineExecutionContext context) { + ExtensionRegistry registry = context.getExtensionRegistry(); + invokeAllAfterMethodsOrCallbacks(context, + ((extensionContext, adapter) -> () -> adapter.invokeAfterEachMethod(extensionContext, registry)), + AfterEachMethodAdapter.class); + } + + private void invokeAfterEachCallbacks(JupiterEngineExecutionContext context) { + invokeAllAfterMethodsOrCallbacks(context, + ((extensionContext, callback) -> () -> callback.afterEach(extensionContext)), AfterEachCallback.class); + } + + private void invokeAllAfterMethodsOrCallbacks(JupiterEngineExecutionContext context, + BiFunction generator, Class type) { + + ExtensionRegistry registry = context.getExtensionRegistry(); + ExtensionContext extensionContext = context.getExtensionContext(); + ThrowableCollector throwableCollector = context.getThrowableCollector(); + + registry.getReversedExtensions(type).forEach(callback -> { + Executable executable = generator.apply(extensionContext, callback); + throwableCollector.execute(executable); + }); + } + +} diff --git a/src/test/resources/oracle/commits/junit5-77cfe71e7f787c59626198e25350545f41e968bd/junit-platform-console/src/main/java/org/junit/platform/console/options/AvailableOptions.java b/src/test/resources/oracle/commits/junit5-77cfe71e7f787c59626198e25350545f41e968bd/junit-platform-console/src/main/java/org/junit/platform/console/options/AvailableOptions.java new file mode 100644 index 00000000000..63a2493c193 --- /dev/null +++ b/src/test/resources/oracle/commits/junit5-77cfe71e7f787c59626198e25350545f41e968bd/junit-platform-console/src/main/java/org/junit/platform/console/options/AvailableOptions.java @@ -0,0 +1,282 @@ +/* + * Copyright 2015-2018 the original author or authors. + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License v2.0 which + * accompanies this distribution and is available at + * + * http://www.eclipse.org/legal/epl-v20.html + */ + +package org.junit.platform.console.options; + +import static java.util.Arrays.asList; + +import java.io.File; +import java.net.URI; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import joptsimple.OptionParser; +import joptsimple.OptionSet; +import joptsimple.OptionSpec; +import joptsimple.util.KeyValuePair; +import joptsimple.util.PathConverter; + +import org.junit.platform.engine.discovery.ClassNameFilter; + +/** + * @since 1.0 + */ +class AvailableOptions { + + private static final String CP_OPTION = "cp"; + + private final OptionParser parser = new OptionParser(); + + // General Purpose + private final OptionSpec help; + private final OptionSpec disableAnsiColors; + private final OptionSpec
details; + private final OptionSpec theme; + private final OptionSpec additionalClasspathEntries; + private final OptionSpec failIfNoTests; + + // Reports + private final OptionSpec reportsDir; + + // Selectors + private final OptionSpec selectedClasspathEntries; + private final OptionSpec selectedUris; + private final OptionSpec selectedFiles; + private final OptionSpec selectedDirectories; + private final OptionSpec selectedPackages; + private final OptionSpec selectedClasses; + private final OptionSpec selectedMethods; + private final OptionSpec selectedClasspathResources; + + // Java Platform Module System Options + private final OptionSpec scanModulepath; + private final OptionSpec selectedModules; + + // Filters + private final OptionSpec includeClassNamePattern; + private final OptionSpec excludeClassNamePattern; + private final OptionSpec includePackage; + private final OptionSpec excludePackage; + private final OptionSpec includeTag; + private final OptionSpec excludeTag; + private final OptionSpec includeEngine; + private final OptionSpec excludeEngine; + + // Configuration Parameters + private final OptionSpec configurationParameters; + + AvailableOptions() { + + // --- General Purpose ------------------------------------------------- + + help = parser.acceptsAll(asList("h", "help"), // + "Display help information."); + + disableAnsiColors = parser.accepts("disable-ansi-colors", + "Disable ANSI colors in output (not supported by all terminals)."); + + details = parser.accepts("details", + "Select an output details mode for when tests are executed. Use one of: " + asList(Details.values()) + + ". If '" + Details.NONE + "' is selected, then only the summary and test failures are shown.") // + .withRequiredArg() // + .ofType(Details.class) // + .withValuesConvertedBy(new DetailsConverter()) // + .defaultsTo(CommandLineOptions.DEFAULT_DETAILS); + + theme = parser.accepts("details-theme", + "Select an output details tree theme for when tests are executed. Use one of: " + asList(Theme.values())) // + .withRequiredArg() // + .ofType(Theme.class) // + .withValuesConvertedBy(new ThemeConverter()) // + .defaultsTo(CommandLineOptions.DEFAULT_THEME); + + additionalClasspathEntries = parser.acceptsAll(asList(CP_OPTION, "classpath", "class-path"), // + "Provide additional classpath entries -- for example, for adding engines and their dependencies. " + + "This option can be repeated.") // + .withRequiredArg() // + .withValuesConvertedBy(new PathConverter()) // + .withValuesSeparatedBy(File.pathSeparatorChar) // + .describedAs("path1" + File.pathSeparator + "path2" + File.pathSeparator + "..."); + + failIfNoTests = parser.accepts("fail-if-no-tests", "Fail and return exit status code 2 if no tests are found."); + + // --- Reports --------------------------------------------------------- + + reportsDir = parser.accepts("reports-dir", // + "Enable report output into a specified local directory (will be created if it does not exist).") // + .withRequiredArg() // + .withValuesConvertedBy(new PathConverter()); + + // --- Java Platform Module System ------------------------------------- + + scanModulepath = parser.acceptsAll(asList("scan-modules"), // + "EXPERIMENTAL: Scan all resolved modules for test discovery."); + + selectedModules = parser.acceptsAll(asList("o", "select-module"), // + "EXPERIMENTAL: Select single module for test discovery. This option can be repeated.") // + .withRequiredArg() // + .describedAs("module name"); + + // --- Selectors ------------------------------------------------------- + + selectedClasspathEntries = parser.acceptsAll(asList("scan-class-path", "scan-classpath"), // + "Scan all directories on the classpath or explicit classpath roots. " // + + "Without arguments, only directories on the system classpath as well as additional classpath " // + + "entries supplied via -" + CP_OPTION + " (directories and JAR files) are scanned. " // + + "Explicit classpath roots that are not on the classpath will be silently ignored. " // + + "This option can be repeated.") // + .withOptionalArg() // + .withValuesConvertedBy(new PathConverter()) // + .withValuesSeparatedBy(File.pathSeparatorChar) // + .describedAs("path1" + File.pathSeparator + "path2" + File.pathSeparator + "..."); + + selectedUris = parser.acceptsAll(asList("u", "select-uri"), // + "Select a URI for test discovery. This option can be repeated.") // + .withRequiredArg() // + .withValuesConvertedBy(new UriConverter()); + + selectedFiles = parser.acceptsAll(asList("f", "select-file"), // + "Select a file for test discovery. This option can be repeated.") // + .withRequiredArg(); + + selectedDirectories = parser.acceptsAll(asList("d", "select-directory"), // + "Select a directory for test discovery. This option can be repeated.") // + .withRequiredArg(); + + selectedPackages = parser.acceptsAll(asList("p", "select-package"), // + "Select a package for test discovery. This option can be repeated.") // + .withRequiredArg(); + + selectedClasses = parser.acceptsAll(asList("c", "select-class"), // + "Select a class for test discovery. This option can be repeated.") // + .withRequiredArg(); + + selectedMethods = parser.acceptsAll(asList("m", "select-method"), // + "Select a method for test discovery. This option can be repeated.") // + .withRequiredArg(); + + selectedClasspathResources = parser.acceptsAll(asList("r", "select-resource"), // + "Select a classpath resource for test discovery. This option can be repeated.") // + .withRequiredArg(); + + // --- Filters --------------------------------------------------------- + + includeClassNamePattern = parser.acceptsAll(asList("n", "include-classname"), + "Provide a regular expression to include only classes whose fully qualified names match. " // + + "To avoid loading classes unnecessarily, the default pattern only includes class " // + + "names that begin with \"Test\" or end with \"Test\" or \"Tests\". " // + + "When this option is repeated, all patterns will be combined using OR semantics.") // + .withRequiredArg() // + .defaultsTo(ClassNameFilter.STANDARD_INCLUDE_PATTERN); + excludeClassNamePattern = parser.acceptsAll(asList("N", "exclude-classname"), + "Provide a regular expression to exclude those classes whose fully qualified names match. " // + + "When this option is repeated, all patterns will be combined using OR semantics.") // + .withRequiredArg(); + + includePackage = parser.accepts("include-package", + "Provide a package to be included in the test run. This option can be repeated.") // + .withRequiredArg(); + excludePackage = parser.accepts("exclude-package", + "Provide a package to be excluded from the test run. This option can be repeated.") // + .withRequiredArg(); + + includeTag = parser.acceptsAll(asList("t", "include-tag"), + "Provide a tag or tag expression to include only tests whose tags match. " + // + "When this option is repeated, all patterns will be combined using OR semantics.") // + .withRequiredArg(); + excludeTag = parser.acceptsAll(asList("T", "exclude-tag"), + "Provide a tag or tag expression to exclude those tests whose tags match. " + // + "When this option is repeated, all patterns will be combined using OR semantics.") // + .withRequiredArg(); + + includeEngine = parser.acceptsAll(asList("e", "include-engine"), + "Provide the ID of an engine to be included in the test run. This option can be repeated.") // + .withRequiredArg(); + excludeEngine = parser.acceptsAll(asList("E", "exclude-engine"), + "Provide the ID of an engine to be excluded from the test run. This option can be repeated.") // + .withRequiredArg(); + + // --- Configuration Parameters ---------------------------------------- + + configurationParameters = parser.accepts("config", + "Set a configuration parameter for test discovery and execution. This option can be repeated.") // + .withRequiredArg() // + .withValuesConvertedBy(new KeyValuePairConverter()); + } + + OptionParser getParser() { + return parser; + } + + CommandLineOptions toCommandLineOptions(OptionSet detectedOptions) { + + CommandLineOptions result = new CommandLineOptions(); + + // General Purpose + result.setDisplayHelp(detectedOptions.has(this.help)); + result.setAnsiColorOutputDisabled(detectedOptions.has(this.disableAnsiColors)); + result.setDetails(detectedOptions.valueOf(this.details)); + result.setTheme(detectedOptions.valueOf(this.theme)); + result.setAdditionalClasspathEntries(detectedOptions.valuesOf(this.additionalClasspathEntries)); + result.setFailIfNoTests(detectedOptions.has(this.failIfNoTests)); + + // Reports + result.setReportsDir(detectedOptions.valueOf(this.reportsDir)); + + // Java Platform Module System + result.setScanModulepath(detectedOptions.has(this.scanModulepath)); + result.setSelectedModules(detectedOptions.valuesOf(this.selectedModules)); + + // Selectors + result.setScanClasspath(detectedOptions.has(this.selectedClasspathEntries)); + result.setSelectedClasspathEntries(detectedOptions.valuesOf(this.selectedClasspathEntries)); + result.setSelectedUris(detectedOptions.valuesOf(this.selectedUris)); + result.setSelectedFiles(detectedOptions.valuesOf(this.selectedFiles)); + result.setSelectedDirectories(detectedOptions.valuesOf(this.selectedDirectories)); + result.setSelectedPackages(detectedOptions.valuesOf(this.selectedPackages)); + result.setSelectedClasses(detectedOptions.valuesOf(this.selectedClasses)); + result.setSelectedMethods(detectedOptions.valuesOf(this.selectedMethods)); + result.setSelectedClasspathResources(detectedOptions.valuesOf(this.selectedClasspathResources)); + + // Filters + result.setIncludedClassNamePatterns(detectedOptions.valuesOf(this.includeClassNamePattern)); + result.setExcludedClassNamePatterns(detectedOptions.valuesOf(this.excludeClassNamePattern)); + result.setIncludedPackages(detectedOptions.valuesOf(this.includePackage)); + result.setExcludedPackages(detectedOptions.valuesOf(this.excludePackage)); + result.setIncludedTagExpressions(detectedOptions.valuesOf(this.includeTag)); + result.setExcludedTagExpressions(detectedOptions.valuesOf(this.excludeTag)); + result.setIncludedEngines(detectedOptions.valuesOf(this.includeEngine)); + result.setExcludedEngines(detectedOptions.valuesOf(this.excludeEngine)); + + // Configuration Parameters + result.setConfigurationParameters(toMap(detectedOptions.valuesOf(this.configurationParameters))); + + return result; + } + + /** + * Convert a list of key-value pairs to map. + * @see #1308 + */ + private Map toMap(List pairs) { + Map map = new HashMap<>(); + for (KeyValuePair pair : pairs) { + String key = pair.key; + if (map.containsKey(key)) { + throw new IllegalArgumentException("Duplicate key '" + key + "' in: " + pairs); + } + map.put(key, pair.value); + } + return map; + } + +} diff --git a/src/test/resources/oracle/commits/junit5-77cfe71e7f787c59626198e25350545f41e968bd/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/NodeTestTask.java b/src/test/resources/oracle/commits/junit5-77cfe71e7f787c59626198e25350545f41e968bd/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/NodeTestTask.java new file mode 100644 index 00000000000..874695fc507 --- /dev/null +++ b/src/test/resources/oracle/commits/junit5-77cfe71e7f787c59626198e25350545f41e968bd/junit-platform-engine/src/main/java/org/junit/platform/engine/support/hierarchical/NodeTestTask.java @@ -0,0 +1,190 @@ +/* + * Copyright 2015-2018 the original author or authors. + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License v2.0 which + * accompanies this distribution and is available at + * + * http://www.eclipse.org/legal/epl-v20.html + */ + +package org.junit.platform.engine.support.hierarchical; + +import static java.util.stream.Collectors.toCollection; +import static org.junit.platform.engine.TestExecutionResult.failed; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.Future; + +import org.junit.platform.commons.JUnitException; +import org.junit.platform.engine.EngineExecutionListener; +import org.junit.platform.engine.TestDescriptor; +import org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutorService.TestTask; +import org.junit.platform.engine.support.hierarchical.Node.ExecutionMode; +import org.junit.platform.engine.support.hierarchical.Node.SkipResult; + +/** + * @since 1.3 + */ +class NodeTestTask implements TestTask { + + private final TestDescriptor testDescriptor; + private final EngineExecutionListener listener; + private final HierarchicalTestExecutorService executorService; + private final ThrowableCollector.Factory throwableCollectorFactory; + private final Node node; + private final ExecutionMode executionMode; + private final Set exclusiveResources; + private final List> children; + + private ResourceLock resourceLock = NopLock.INSTANCE; + private Optional forcedExecutionMode = Optional.empty(); + + private C parentContext; + private C context; + + private SkipResult skipResult; + private boolean started; + private ThrowableCollector throwableCollector; + + NodeTestTask(TestDescriptor testDescriptor, EngineExecutionListener listener, + HierarchicalTestExecutorService executorService, ThrowableCollector.Factory throwableCollectorFactory) { + this.testDescriptor = testDescriptor; + this.listener = listener; + this.executorService = executorService; + this.throwableCollectorFactory = throwableCollectorFactory; + node = asNode(testDescriptor); + executionMode = node.getExecutionMode(); + exclusiveResources = node.getExclusiveResources(); + // @formatter:off + children = testDescriptor.getChildren().stream() + .map(descriptor -> new NodeTestTask(descriptor, listener, executorService, throwableCollectorFactory)) + .collect(toCollection(ArrayList::new)); + // @formatter:on + } + + public Set getExclusiveResources() { + return exclusiveResources; + } + + public List> getChildren() { + return children; + } + + @Override + public ResourceLock getResourceLock() { + return resourceLock; + } + + public void setResourceLock(ResourceLock resourceLock) { + this.resourceLock = resourceLock; + } + + @Override + public ExecutionMode getExecutionMode() { + return forcedExecutionMode.orElse(executionMode); + } + + public void setForcedExecutionMode(ExecutionMode forcedExecutionMode) { + this.forcedExecutionMode = Optional.of(forcedExecutionMode); + } + + public void setParentContext(C parentContext) { + this.parentContext = parentContext; + } + + @Override + public void execute() { + throwableCollector = throwableCollectorFactory.create(); + prepare(); + if (throwableCollector.isEmpty()) { + checkWhetherSkipped(); + } + if (throwableCollector.isEmpty() && !skipResult.isSkipped()) { + executeRecursively(); + } + if (context != null) { + cleanUp(); + } + reportCompletion(); + } + + private void prepare() { + throwableCollector.execute(() -> context = node.prepare(parentContext)); + } + + private void checkWhetherSkipped() { + throwableCollector.execute(() -> skipResult = node.shouldBeSkipped(context)); + } + + private void executeRecursively() { + listener.executionStarted(testDescriptor); + started = true; + + throwableCollector.execute(() -> { + context = node.before(context); + + List> futures = new ArrayList<>(); + context = node.execute(context, + dynamicTestDescriptor -> executeDynamicTest(dynamicTestDescriptor, futures)); + + if (!children.isEmpty()) { + children.forEach(child -> child.setParentContext(context)); + executorService.invokeAll(children); + } + + // using a for loop for the sake for ForkJoinPool's work stealing + for (Future future : futures) { + future.get(); + } + }); + + throwableCollector.execute(() -> node.after(context)); + } + + private void executeDynamicTest(TestDescriptor dynamicTestDescriptor, List> futures) { + listener.dynamicTestRegistered(dynamicTestDescriptor); + NodeTestTask nodeTestTask = new NodeTestTask<>(dynamicTestDescriptor, listener, executorService, + throwableCollectorFactory); + Set exclusiveResources = nodeTestTask.getExclusiveResources(); + if (!exclusiveResources.isEmpty()) { + listener.executionStarted(dynamicTestDescriptor); + String message = "Dynamic test descriptors must not declare exclusive resources: " + exclusiveResources; + listener.executionFinished(dynamicTestDescriptor, failed(new JUnitException(message))); + } + else { + nodeTestTask.setParentContext(context); + futures.add(executorService.submit(nodeTestTask)); + } + } + + private void cleanUp() { + throwableCollector.execute(() -> node.cleanUp(context)); + } + + private void reportCompletion() { + if (throwableCollector.isEmpty() && skipResult.isSkipped()) { + listener.executionSkipped(testDescriptor, skipResult.getReason().orElse("")); + return; + } + if (!started) { + // Call executionStarted first to comply with the contract of EngineExecutionListener. + listener.executionStarted(testDescriptor); + } + listener.executionFinished(testDescriptor, throwableCollector.toTestExecutionResult()); + throwableCollector = null; + } + + @SuppressWarnings("unchecked") + private Node asNode(TestDescriptor testDescriptor) { + return (testDescriptor instanceof Node ? (Node) testDescriptor : noOpNode); + } + + @SuppressWarnings("rawtypes") + private static final Node noOpNode = new Node() { + }; + +} diff --git a/src/test/resources/oracle/commits/junit5-77cfe71e7f787c59626198e25350545f41e968bd/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/DefaultLauncher.java b/src/test/resources/oracle/commits/junit5-77cfe71e7f787c59626198e25350545f41e968bd/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/DefaultLauncher.java new file mode 100644 index 00000000000..07208868d2c --- /dev/null +++ b/src/test/resources/oracle/commits/junit5-77cfe71e7f787c59626198e25350545f41e968bd/junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/DefaultLauncher.java @@ -0,0 +1,197 @@ +/* + * Copyright 2015-2018 the original author or authors. + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License v2.0 which + * accompanies this distribution and is available at + * + * http://www.eclipse.org/legal/epl-v20.html + */ + +package org.junit.platform.launcher.core; + +import java.util.HashSet; +import java.util.Optional; +import java.util.Set; +import java.util.function.Consumer; + +import org.junit.platform.commons.JUnitException; +import org.junit.platform.commons.logging.Logger; +import org.junit.platform.commons.logging.LoggerFactory; +import org.junit.platform.commons.util.BlacklistedExceptions; +import org.junit.platform.commons.util.Preconditions; +import org.junit.platform.engine.ConfigurationParameters; +import org.junit.platform.engine.ExecutionRequest; +import org.junit.platform.engine.FilterResult; +import org.junit.platform.engine.TestDescriptor; +import org.junit.platform.engine.TestEngine; +import org.junit.platform.engine.UniqueId; +import org.junit.platform.launcher.Launcher; +import org.junit.platform.launcher.LauncherDiscoveryRequest; +import org.junit.platform.launcher.TestExecutionListener; +import org.junit.platform.launcher.TestPlan; + +/** + * Default implementation of the {@link Launcher} API. + * + *

External clients can obtain an instance by invoking {@link LauncherFactory#create()}. + * + * @since 1.0 + * @see Launcher + * @see LauncherFactory + */ +class DefaultLauncher implements Launcher { + + private static final Logger logger = LoggerFactory.getLogger(DefaultLauncher.class); + + private final TestExecutionListenerRegistry listenerRegistry = new TestExecutionListenerRegistry(); + private final EngineDiscoveryResultValidator discoveryResultValidator = new EngineDiscoveryResultValidator(); + private final Iterable testEngines; + + /** + * Construct a new {@code DefaultLauncher} with the supplied test engines. + * + * @param testEngines the test engines to delegate to; never {@code null} or empty + */ + DefaultLauncher(Iterable testEngines) { + Preconditions.condition(testEngines != null && testEngines.iterator().hasNext(), + () -> "Cannot create Launcher without at least one TestEngine; " + + "consider adding an engine implementation JAR to the classpath"); + this.testEngines = validateUniqueIds(testEngines); + } + + private static Iterable validateUniqueIds(Iterable testEngines) { + Set ids = new HashSet<>(); + for (TestEngine testEngine : testEngines) { + if (!ids.add(testEngine.getId())) { + throw new JUnitException(String.format( + "Cannot create Launcher for multiple engines with the same ID '%s'.", testEngine.getId())); + } + } + return testEngines; + } + + @Override + public void registerTestExecutionListeners(TestExecutionListener... listeners) { + Preconditions.notEmpty(listeners, "listeners array must not be null or empty"); + Preconditions.containsNoNullElements(listeners, "individual listeners must not be null"); + this.listenerRegistry.registerListeners(listeners); + } + + @Override + public TestPlan discover(LauncherDiscoveryRequest discoveryRequest) { + Preconditions.notNull(discoveryRequest, "LauncherDiscoveryRequest must not be null"); + return TestPlan.from(discoverRoot(discoveryRequest, "discovery").getEngineDescriptors()); + } + + @Override + public void execute(LauncherDiscoveryRequest discoveryRequest, TestExecutionListener... listeners) { + Preconditions.notNull(discoveryRequest, "LauncherDiscoveryRequest must not be null"); + Preconditions.notNull(listeners, "TestExecutionListener array must not be null"); + Preconditions.containsNoNullElements(listeners, "individual listeners must not be null"); + execute(discoverRoot(discoveryRequest, "execution"), discoveryRequest.getConfigurationParameters(), listeners); + } + + TestExecutionListenerRegistry getTestExecutionListenerRegistry() { + return listenerRegistry; + } + + private Root discoverRoot(LauncherDiscoveryRequest discoveryRequest, String phase) { + Root root = new Root(); + + for (TestEngine testEngine : this.testEngines) { + // @formatter:off + boolean engineIsExcluded = discoveryRequest.getEngineFilters().stream() + .map(engineFilter -> engineFilter.apply(testEngine)) + .anyMatch(FilterResult::excluded); + // @formatter:on + + if (engineIsExcluded) { + logger.debug(() -> String.format( + "Test discovery for engine '%s' was skipped due to an EngineFilter in phase '%s'.", + testEngine.getId(), phase)); + continue; + } + + logger.debug(() -> String.format("Discovering tests during Launcher %s phase in engine '%s'.", phase, + testEngine.getId())); + + Optional engineRoot = discoverEngineRoot(testEngine, discoveryRequest); + engineRoot.ifPresent(rootDescriptor -> root.add(testEngine, rootDescriptor)); + } + root.applyPostDiscoveryFilters(discoveryRequest); + root.prune(); + return root; + } + + private Optional discoverEngineRoot(TestEngine testEngine, + LauncherDiscoveryRequest discoveryRequest) { + + UniqueId uniqueEngineId = UniqueId.forEngine(testEngine.getId()); + try { + TestDescriptor engineRoot = testEngine.discover(discoveryRequest, uniqueEngineId); + discoveryResultValidator.validate(testEngine, engineRoot); + return Optional.of(engineRoot); + } + catch (Throwable throwable) { + handleThrowable(testEngine, "discover", throwable); + return Optional.empty(); + } + } + + private void execute(Root root, ConfigurationParameters configurationParameters, + TestExecutionListener... listeners) { + TestExecutionListenerRegistry listenerRegistry = buildListenerRegistryForExecution(listeners); + withInterceptedStreams(configurationParameters, listenerRegistry, testExecutionListener -> { + TestPlan testPlan = TestPlan.from(root.getEngineDescriptors()); + testExecutionListener.testPlanExecutionStarted(testPlan); + ExecutionListenerAdapter engineExecutionListener = new ExecutionListenerAdapter(testPlan, + testExecutionListener); + for (TestEngine testEngine : root.getTestEngines()) { + TestDescriptor testDescriptor = root.getTestDescriptorFor(testEngine); + execute(testEngine, + new ExecutionRequest(testDescriptor, engineExecutionListener, configurationParameters)); + } + testExecutionListener.testPlanExecutionFinished(testPlan); + }); + } + + private void withInterceptedStreams(ConfigurationParameters configurationParameters, + TestExecutionListenerRegistry listenerRegistry, Consumer action) { + TestExecutionListener testExecutionListener = listenerRegistry.getCompositeTestExecutionListener(); + Optional streamInterceptingTestExecutionListener = StreamInterceptingTestExecutionListener.create( + configurationParameters, testExecutionListener::reportingEntryPublished); + streamInterceptingTestExecutionListener.ifPresent(listenerRegistry::registerListeners); + try { + action.accept(testExecutionListener); + } + finally { + streamInterceptingTestExecutionListener.ifPresent(StreamInterceptingTestExecutionListener::unregister); + } + } + + private TestExecutionListenerRegistry buildListenerRegistryForExecution(TestExecutionListener... listeners) { + if (listeners.length == 0) { + return this.listenerRegistry; + } + TestExecutionListenerRegistry registry = new TestExecutionListenerRegistry(this.listenerRegistry); + registry.registerListeners(listeners); + return registry; + } + + private void execute(TestEngine testEngine, ExecutionRequest executionRequest) { + try { + testEngine.execute(executionRequest); + } + catch (Throwable throwable) { + handleThrowable(testEngine, "execute", throwable); + } + } + + private void handleThrowable(TestEngine testEngine, String phase, Throwable throwable) { + logger.warn(throwable, + () -> String.format("TestEngine with ID '%s' failed to %s tests", testEngine.getId(), phase)); + BlacklistedExceptions.rethrowIfBlacklisted(throwable); + } + +}