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(