Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 0 additions & 101 deletions .idea/codeStyles/Project.xml

This file was deleted.

5 changes: 0 additions & 5 deletions .idea/codeStyles/codeStyleConfig.xml

This file was deleted.

Binary file removed .idea/icon.png
Binary file not shown.
20 changes: 0 additions & 20 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -81,4 +83,6 @@ default List<Extension> getAdditionalExtensions() {
default void prepareInvocation(ExtensionContext context) {
}

default Optional<URI> getTestSourceUri() { return Optional.empty(); }

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 -----------------------------------------------
Expand Down Expand Up @@ -97,6 +104,14 @@ public void after(JupiterEngineExecutionContext context) {
this.invocationContext = null;
}

@Override
public Optional<TestSource> getSource() {
if (this.testSourceUri != null) {
return Optional.of(UriSource.from(this.testSourceUri));
}
return super.getSource();
}

private TestTemplateInvocationContext requiredInvocationContext() {
return requireNonNull(this.invocationContext);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<TestTemplateInvocationContext> provideTestTemplateInvocationContexts(
ExtensionContext context) {

return Stream.of(new TestTemplateInvocationContext() {

@Override
public String getDisplayName(int invocationIndex) {
return "[1]";
}

@Override
public Optional<URI> 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(
Expand Down