From 1d9c2c6e09cc72e335be7f1cb41c67f91c37cd52 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 28 Feb 2013 15:01:15 +0100 Subject: [PATCH] junit/testng: setup module for pattern based config (IDEA-102098) --- .../JavaRuntimeConfigurationProducerBase.java | 12 +++++-- .../intellij/execution/JavaExecutionUtil.java | 31 +++++++++++++++++++ .../execution/junit/JUnitConfiguration.java | 12 ++++--- .../junit/PatternConfigurationProducer.java | 19 ++++++++++++ .../execution/junit/TestsPattern.java | 23 +------------- .../configuration/TestNGConfiguration.java | 9 ++++++ .../TestNGPatternConfigurationProducer.java | 19 ++++++++++++ 7 files changed, 97 insertions(+), 28 deletions(-) diff --git a/java/execution/impl/src/com/intellij/execution/junit/JavaRuntimeConfigurationProducerBase.java b/java/execution/impl/src/com/intellij/execution/junit/JavaRuntimeConfigurationProducerBase.java index 3c0184f6b46e..14ef29667070 100644 --- a/java/execution/impl/src/com/intellij/execution/junit/JavaRuntimeConfigurationProducerBase.java +++ b/java/execution/impl/src/com/intellij/execution/junit/JavaRuntimeConfigurationProducerBase.java @@ -119,11 +119,19 @@ public abstract class JavaRuntimeConfigurationProducerBase extends RuntimeConfig configuration.setModule(predefinedModule); return true; } - else if (configuration.getConfigurationModule().getModule() == null && contextModule != null) { - configuration.setModule(contextModule); + final Module module = findModule(configuration, contextModule); + if (module != null) { + configuration.setModule(module); return true; } } return false; } + + protected Module findModule(ModuleBasedConfiguration configuration, Module contextModule) { + if (configuration.getConfigurationModule().getModule() == null && contextModule != null) { + return contextModule; + } + return null; + } } diff --git a/java/execution/openapi/src/com/intellij/execution/JavaExecutionUtil.java b/java/execution/openapi/src/com/intellij/execution/JavaExecutionUtil.java index 801740dec5f7..5180ee291211 100644 --- a/java/execution/openapi/src/com/intellij/execution/JavaExecutionUtil.java +++ b/java/execution/openapi/src/com/intellij/execution/JavaExecutionUtil.java @@ -26,7 +26,9 @@ import com.intellij.execution.util.ExecutionErrorDialog; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtil; +import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; @@ -37,6 +39,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import java.util.HashSet; +import java.util.Set; /** * @author spleaner @@ -62,6 +66,33 @@ public class JavaExecutionUtil { return false; } + public static Module findModule(final Module contextModule, final Set patterns, final Project project, Condition isTestMethod) { + final Set modules = new HashSet(); + for (String className : patterns) { + final PsiClass psiClass = findMainClass(project, + className.contains(",") ? className.substring(0, className.indexOf(',')) : className, + GlobalSearchScope.allScope(project)); + if (psiClass != null && isTestMethod.value(psiClass)) { + modules.add(ModuleUtilCore.findModuleForPsiElement(psiClass)); + } + } + + if (modules.size() == 1) { + final Module nextModule = modules.iterator().next(); + if (nextModule != null) { + return nextModule; + } + } + if (contextModule != null && modules.size() > 1) { + final HashSet moduleDependencies = new HashSet(); + ModuleUtilCore.getDependencies(contextModule, moduleDependencies); + if (moduleDependencies.containsAll(modules)) { + return contextModule; + } + } + return null; + } + private static final class DefaultRunProfile implements RunProfile { private final JavaParameters myParameters; private final String myContentName; diff --git a/plugins/junit/src/com/intellij/execution/junit/JUnitConfiguration.java b/plugins/junit/src/com/intellij/execution/junit/JUnitConfiguration.java index 7a838b355e42..2a1f1e98e11f 100644 --- a/plugins/junit/src/com/intellij/execution/junit/JUnitConfiguration.java +++ b/plugins/junit/src/com/intellij/execution/junit/JUnitConfiguration.java @@ -32,10 +32,7 @@ import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.options.SettingsEditor; import com.intellij.openapi.options.SettingsEditorGroup; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Comparing; -import com.intellij.openapi.util.DefaultJDOMExternalizer; -import com.intellij.openapi.util.InvalidDataException; -import com.intellij.openapi.util.WriteExternalException; +import com.intellij.openapi.util.*; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; @@ -376,6 +373,13 @@ public class JUnitConfiguration extends ModuleBasedConfiguration patterns = ((JUnitConfiguration)configuration).getPersistentData().getPatterns(); + return findModule(configuration, contextModule, patterns); + } + + public static Module findModule(ModuleBasedConfiguration configuration, Module contextModule, Set patterns) { + return JavaExecutionUtil.findModule(contextModule, patterns, configuration.getProject(), new Condition() { + @Override + public boolean value(PsiClass psiClass) { + return JUnitUtil.isTestClass(psiClass); + } + }); + } + static Set collectTestMembers(PsiElement[] psiElements) { final Set foundMembers = new LinkedHashSet(); for (PsiElement psiElement : psiElements) { diff --git a/plugins/junit/src/com/intellij/execution/junit/TestsPattern.java b/plugins/junit/src/com/intellij/execution/junit/TestsPattern.java index fe6f255cde35..d5f48ed5b629 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestsPattern.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestsPattern.java @@ -28,7 +28,6 @@ import com.intellij.execution.configurations.RuntimeConfigurationWarning; import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.util.JavaParametersUtil; import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.Task; import com.intellij.openapi.progress.impl.BackgroundableProcessIndicator; @@ -121,29 +120,9 @@ public class TestsPattern extends TestPackage { } protected void configureClasspath() throws CantRunException { - final JUnitConfiguration.Data data = myConfiguration.getPersistentData(); - final Project project = myConfiguration.getProject(); - final Set modules = new HashSet(); - for (String className : data.getPatterns()) { - final PsiClass psiClass = JavaExecutionUtil.findMainClass(project, - className.contains(",") - ? className.substring(0, className.indexOf(',')) - : className, - GlobalSearchScope.allScope(project)); - if (psiClass != null && JUnitUtil.isTestClass(psiClass)) { - modules.add(ModuleUtil.findModuleForPsiElement(psiClass)); - } - } - final String jreHome = myConfiguration.isAlternativeJrePathEnabled() ? myConfiguration.getAlternativeJrePath() : null; - Module module = myConfiguration.getConfigurationModule().getModule(); - if (module == null && modules.size() == 1) { - final Module nextModule = modules.iterator().next(); - if (nextModule != null) { - module = nextModule; - } - } + final Module module = myConfiguration.getConfigurationModule().getModule(); if (module != null) { JavaParametersUtil.configureModule(module, myJavaParameters, JavaParameters.JDK_AND_CLASSES_AND_TESTS, jreHome); diff --git a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfiguration.java b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfiguration.java index d2c33225f636..a2d54926711f 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfiguration.java +++ b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfiguration.java @@ -29,6 +29,7 @@ import com.intellij.execution.configurations.*; import com.intellij.execution.junit.RefactoringListeners; import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.testframework.SourceScope; +import com.intellij.execution.testframework.TestSearchScope; import com.intellij.execution.util.JavaParametersUtil; import com.intellij.execution.util.ProgramParametersUtil; import com.intellij.openapi.components.PathMacroManager; @@ -275,6 +276,14 @@ public class TestNGConfiguration extends ModuleBasedConfiguration patterns = ((TestNGConfiguration)configuration).data.getPatterns(); + return findModule(configuration, contextModule, patterns); + } + + public static Module findModule(ModuleBasedConfiguration configuration, Module contextModule, Set patterns) { + return JavaExecutionUtil.findModule(contextModule, patterns, configuration.getProject(), new Condition() { + @Override + public boolean value(PsiClass psiClass) { + return TestNGUtil.hasTest(psiClass); + } + }); + } + @Override protected RunnerAndConfigurationSettings findExistingByElement(@NotNull Location location, @NotNull RunnerAndConfigurationSettings[] existingConfigurations,