diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
deleted file mode 100644
index f1009b0955f8..000000000000
--- a/.idea/codeStyles/Project.xml
+++ /dev/null
@@ -1,101 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
deleted file mode 100644
index 79ee123c2b23..000000000000
--- a/.idea/codeStyles/codeStyleConfig.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/icon.png b/.idea/icon.png
deleted file mode 100644
index f95f22bc7935..000000000000
Binary files a/.idea/icon.png and /dev/null differ
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index 178ac9238035..35eb1ddfbbc0 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -1,25 +1,5 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/junit-jupiter-api/src/main/java/org/junit/jupiter/api/extension/TestTemplateInvocationContext.java b/junit-jupiter-api/src/main/java/org/junit/jupiter/api/extension/TestTemplateInvocationContext.java
index 2f444d1427a1..42264cf0c931 100644
--- a/junit-jupiter-api/src/main/java/org/junit/jupiter/api/extension/TestTemplateInvocationContext.java
+++ b/junit-jupiter-api/src/main/java/org/junit/jupiter/api/extension/TestTemplateInvocationContext.java
@@ -14,7 +14,9 @@
import static org.apiguardian.api.API.Status.EXPERIMENTAL;
import static org.apiguardian.api.API.Status.STABLE;
+import java.net.URI;
import java.util.List;
+import java.util.Optional;
import org.apiguardian.api.API;
@@ -81,4 +83,6 @@ default List getAdditionalExtensions() {
default void prepareInvocation(ExtensionContext context) {
}
+ default Optional getTestSourceUri() { return Optional.empty(); }
+
}
diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/TestTemplateInvocationTestDescriptor.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/TestTemplateInvocationTestDescriptor.java
index b751e4a1b4b4..2fe706966b8b 100644
--- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/TestTemplateInvocationTestDescriptor.java
+++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/TestTemplateInvocationTestDescriptor.java
@@ -14,7 +14,11 @@
import static java.util.Objects.requireNonNull;
import static org.apiguardian.api.API.Status.INTERNAL;
+import org.junit.platform.engine.TestSource;
+import org.junit.platform.engine.support.descriptor.UriSource;
import java.lang.reflect.Method;
+import java.net.URI;
+import java.util.Optional;
import java.util.OptionalInt;
import java.util.Set;
import java.util.function.UnaryOperator;
@@ -48,12 +52,15 @@ public class TestTemplateInvocationTestDescriptor extends TestMethodTestDescript
private final int index;
+ private @Nullable URI testSourceUri;
+
TestTemplateInvocationTestDescriptor(UniqueId uniqueId, Class> testClass, Method templateMethod,
TestTemplateInvocationContext invocationContext, int index, JupiterConfiguration configuration) {
super(uniqueId, invocationContext.getDisplayName(index), testClass, templateMethod, configuration,
interceptorCall);
this.invocationContext = invocationContext;
this.index = index;
+ this.testSourceUri = invocationContext.getTestSourceUri().orElse(null);
}
// --- JupiterTestDescriptor -----------------------------------------------
@@ -97,6 +104,14 @@ public void after(JupiterEngineExecutionContext context) {
this.invocationContext = null;
}
+ @Override
+ public Optional getSource() {
+ if (this.testSourceUri != null) {
+ return Optional.of(UriSource.from(this.testSourceUri));
+ }
+ return super.getSource();
+ }
+
private TestTemplateInvocationContext requiredInvocationContext() {
return requireNonNull(this.invocationContext);
}
diff --git a/jupiter-tests/src/test/java/org/junit/jupiter/engine/TestTemplateInvocationTests.java b/jupiter-tests/src/test/java/org/junit/jupiter/engine/TestTemplateInvocationTests.java
index bf4ae1ede5a7..6fceb7e11499 100644
--- a/jupiter-tests/src/test/java/org/junit/jupiter/engine/TestTemplateInvocationTests.java
+++ b/jupiter-tests/src/test/java/org/junit/jupiter/engine/TestTemplateInvocationTests.java
@@ -34,10 +34,8 @@
import java.lang.reflect.Field;
import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
+import java.net.URI;
+import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Predicate;
import java.util.stream.Stream;
@@ -82,6 +80,68 @@
*/
class TestTemplateInvocationTests extends AbstractJupiterTestEngineTests {
+ static class TestTemplateWithUriSource {
+
+ @TestTemplate
+ @ExtendWith(UriProvider.class)
+ void template() {
+ }
+
+ static class UriProvider implements TestTemplateInvocationContextProvider {
+
+ @Override
+ public boolean supportsTestTemplate(ExtensionContext context) {
+ return true;
+ }
+
+ @Override
+ public Stream provideTestTemplateInvocationContexts(
+ ExtensionContext context) {
+
+ return Stream.of(new TestTemplateInvocationContext() {
+
+ @Override
+ public String getDisplayName(int invocationIndex) {
+ return "[1]";
+ }
+
+ @Override
+ public Optional getTestSourceUri() {
+ return Optional.of(URI.create("custom://test"));
+ }
+ });
+ }
+ }
+ }
+
+ @Test
+ void templateUsesCustomUriSourceWhenProvided() {
+ LauncherDiscoveryRequest request = request().selectors(
+ selectMethod(TestTemplateWithUriSource.class, "template")
+ ).build();
+
+ EngineExecutionResults results = executeTests(request);
+
+ Events events = results.allEvents();
+
+ events.assertStatistics(stats -> stats.dynamicallyRegistered(1));
+
+ TestDescriptor descriptor = events.dynamicallyRegistered()
+ .map(Event::getTestDescriptor)
+ .findFirst()
+ .orElseThrow();
+
+ assertThat(descriptor.getSource()).isPresent();
+ assertThat(descriptor.getSource().get())
+ .isInstanceOf(org.junit.platform.engine.support.descriptor.UriSource.class);
+
+ var uriSource = (org.junit.platform.engine.support.descriptor.UriSource) descriptor.getSource().get();
+
+ assertThat(uriSource.getUri()).isEqualTo(URI.create("custom://test"));
+ }
+
+
+
@Test
void templateWithSingleRegisteredExtensionIsInvoked() {
LauncherDiscoveryRequest request = request().selectors(