diff --git a/java/execution/impl/src/com/intellij/execution/testDiscovery/IntellijTestDiscoveryProducer.java b/java/execution/impl/src/com/intellij/execution/testDiscovery/IntellijTestDiscoveryProducer.java index 819edebb7e2b..a10926ffc871 100644 --- a/java/execution/impl/src/com/intellij/execution/testDiscovery/IntellijTestDiscoveryProducer.java +++ b/java/execution/impl/src/com/intellij/execution/testDiscovery/IntellijTestDiscoveryProducer.java @@ -7,6 +7,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.annotations.SerializedName; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.containers.MultiMap; import com.intellij.util.io.HttpRequests; import com.intellij.util.io.RequestBuilder; import org.jetbrains.annotations.NotNull; @@ -23,22 +24,24 @@ public class IntellijTestDiscoveryProducer implements TestDiscoveryProducer { @NotNull @Override - public List getDiscoveredTests(@NotNull Project project, - @NotNull String classFQName, - @NotNull String methodName, - @NotNull String frameworkId) { + public MultiMap getDiscoveredTests(@NotNull Project project, + @NotNull String classFQName, + @NotNull String methodName, + @NotNull String frameworkId) { String methodFqn = classFQName + "." + methodName; RequestBuilder r = HttpRequests.request(INTELLIJ_TEST_DISCOVERY_HOST + "/search/tests/by-method/" + methodFqn); try { return r.connect(request -> { + MultiMap map = new MultiMap<>(); TestsSearchResult result = new ObjectMapper().readValue(request.getInputStream(), TestsSearchResult.class); - return result.getTests().stream().map(s -> { + result.getTests().forEach(s -> { String str = s.length() > 1 && s.charAt(0) == 'j' ? s.substring(1) : s; String classFqn = StringUtil.substringBefore(str, "-"); String testMethodName = StringUtil.substringAfter(str, "-"); - return new DiscoveredTest(classFqn, testMethodName); - }).collect(Collectors.toList()); + map.putValue(classFqn, testMethodName); + }); + return map; }); } catch (HttpRequests.HttpStatusException http) { @@ -47,7 +50,7 @@ public class IntellijTestDiscoveryProducer implements TestDiscoveryProducer { catch (IOException e) { LOG.debug(e); } - return Collections.emptyList(); + return MultiMap.empty(); } @JsonInclude(JsonInclude.Include.NON_EMPTY) diff --git a/java/execution/impl/src/com/intellij/execution/testDiscovery/LocalTestDiscoveryProducer.java b/java/execution/impl/src/com/intellij/execution/testDiscovery/LocalTestDiscoveryProducer.java index cd3bb8dc71ea..217286ff91e8 100644 --- a/java/execution/impl/src/com/intellij/execution/testDiscovery/LocalTestDiscoveryProducer.java +++ b/java/execution/impl/src/com/intellij/execution/testDiscovery/LocalTestDiscoveryProducer.java @@ -3,6 +3,7 @@ package com.intellij.execution.testDiscovery; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import java.io.IOException; @@ -14,24 +15,25 @@ import java.util.stream.Collectors; public class LocalTestDiscoveryProducer implements TestDiscoveryProducer { @Override @NotNull - public List getDiscoveredTests(@NotNull Project project, - @NotNull String classFQName, - @NotNull String methodName, - @NotNull String frameworkId) { + public MultiMap getDiscoveredTests(@NotNull Project project, + @NotNull String classFQName, + @NotNull String methodName, + @NotNull String frameworkId) { try { TestDiscoveryIndex discoveryIndex = TestDiscoveryIndex.getInstance(project); Collection testsByMethodName = discoveryIndex.getTestsByMethodName(classFQName, methodName, frameworkId); if (testsByMethodName != null) { // todo[batkovich]: filter by framework id - return testsByMethodName.stream() - .map(pattern -> StringUtil.split(pattern, "-")).filter(split -> split.size() == 2) - .map(split -> new DiscoveredTest(split.get(0), split.get(1))) - .collect(Collectors.toList()); + MultiMap result = new MultiMap<>(); + testsByMethodName.stream() + .map(pattern -> StringUtil.split(pattern, "-")).filter(split -> split.size() == 2) + .forEach(split -> result.putValue(split.get(0), split.get(1))); + return result; } } catch (IOException io) { TestDiscoveryProducer.LOG.warn(io); } - return Collections.emptyList(); + return MultiMap.empty(); } } diff --git a/java/execution/impl/src/com/intellij/execution/testDiscovery/ShowDiscoveredTestsAction.java b/java/execution/impl/src/com/intellij/execution/testDiscovery/ShowDiscoveredTestsAction.java index a367b1032a8f..7b3baab8dfee 100644 --- a/java/execution/impl/src/com/intellij/execution/testDiscovery/ShowDiscoveredTestsAction.java +++ b/java/execution/impl/src/com/intellij/execution/testDiscovery/ShowDiscoveredTestsAction.java @@ -168,10 +168,10 @@ public class ShowDiscoveredTestsAction extends AnAction { for (TestDiscoveryConfigurationProducer producer : getProducers(project)) { String frameworkPrefix = ((JavaTestConfigurationBase)producer.getConfigurationFactory().createTemplateConfiguration(project)).getFrameworkPrefix(); - TestDiscoveryProducer.consumeDiscoveredTests(project, fqn, methodName, frameworkPrefix, test -> { + TestDiscoveryProducer.consumeDiscoveredTests(project, fqn, methodName, frameworkPrefix, (testClass, testMethod) -> { PsiMethod psiMethod = ReadAction.compute(() -> { - PsiClass cc = test.getTestClassQName() == null ? null : javaFacade.findClass(test.getTestClassQName(), scope); - return cc == null ? null : ArrayUtil.getFirstElement(cc.findMethodsByName(test.getTestMethodName(), false)); + PsiClass cc = testClass == null ? null : javaFacade.findClass(testClass, scope); + return cc == null ? null : ArrayUtil.getFirstElement(cc.findMethodsByName(testMethod, false)); }); if (psiMethod != null) { loadTestsTask.updateComponent(psiMethod); diff --git a/java/execution/impl/src/com/intellij/execution/testDiscovery/TestDiscoveryProducer.java b/java/execution/impl/src/com/intellij/execution/testDiscovery/TestDiscoveryProducer.java index 8863bc322d01..e54a3850773a 100644 --- a/java/execution/impl/src/com/intellij/execution/testDiscovery/TestDiscoveryProducer.java +++ b/java/execution/impl/src/com/intellij/execution/testDiscovery/TestDiscoveryProducer.java @@ -4,39 +4,26 @@ package com.intellij.execution.testDiscovery; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.project.Project; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; +import java.util.Collection; import java.util.List; +import java.util.Map; +import java.util.function.BiConsumer; import java.util.function.Consumer; @ApiStatus.Experimental public interface TestDiscoveryProducer { Logger LOG = Logger.getInstance(LocalTestDiscoveryProducer.class); - class DiscoveredTest { - private final String myTestClassQName; - private final String myTestMethodName; - - public DiscoveredTest(String testClassQName, String testMethodName) { - myTestClassQName = testClassQName; - myTestMethodName = testMethodName; - } - - public String getTestClassQName() { - return myTestClassQName; - } - - public String getTestMethodName() { - return myTestMethodName; - } - } @NotNull - List getDiscoveredTests(@NotNull Project project, - @NotNull String classFQName, - @NotNull String methodName, - @NotNull String frameworkId); + MultiMap getDiscoveredTests(@NotNull Project project, + @NotNull String classFQName, + @NotNull String methodName, + @NotNull String frameworkId); ExtensionPointName EP = ExtensionPointName.create("com.intellij.testDiscoveryProducer"); @@ -44,9 +31,15 @@ public interface TestDiscoveryProducer { @NotNull String classFQName, @NotNull String methodName, @NotNull String frameworkId, - @NotNull Consumer consumer) { + @NotNull BiConsumer consumer) { for (TestDiscoveryProducer producer : EP.getExtensions()) { - producer.getDiscoveredTests(project, classFQName, methodName, frameworkId).forEach(consumer); + for (Map.Entry> entry : producer.getDiscoveredTests(project, classFQName, methodName, frameworkId) + .entrySet()) { + String cName = entry.getKey(); + for (String mName : entry.getValue()) { + consumer.accept(cName, mName); + } + } } } } diff --git a/java/execution/impl/src/com/intellij/execution/testDiscovery/TestDiscoverySearchHelper.java b/java/execution/impl/src/com/intellij/execution/testDiscovery/TestDiscoverySearchHelper.java index 81cb1134327c..88ced7aaeb3e 100644 --- a/java/execution/impl/src/com/intellij/execution/testDiscovery/TestDiscoverySearchHelper.java +++ b/java/execution/impl/src/com/intellij/execution/testDiscovery/TestDiscoverySearchHelper.java @@ -92,7 +92,7 @@ public class TestDiscoverySearchHelper { @NotNull String classFQName, @NotNull String methodName, @NotNull String frameworkId) { - TestDiscoveryProducer.consumeDiscoveredTests(project, classFQName, methodName, frameworkId, t -> patterns.add(t.getTestClassQName() + "," + t.getTestMethodName())); + TestDiscoveryProducer.consumeDiscoveredTests(project, classFQName, methodName, frameworkId, (c, m) -> patterns.add(c + "," + m)); } @NotNull