junit/testng: setup module for pattern based config (IDEA-102098)

This commit is contained in:
anna
2013-02-28 15:04:46 +01:00
parent c9d9babdea
commit 1d9c2c6e09
7 changed files with 97 additions and 28 deletions
@@ -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;
}
}
@@ -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<String> patterns, final Project project, Condition<PsiClass> isTestMethod) {
final Set<Module> modules = new HashSet<Module>();
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<Module> moduleDependencies = new HashSet<Module>();
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;
@@ -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<JavaRunConfigur
patterns.add(JavaExecutionUtil.getRuntimeQualifiedName(pattern) + methodSufiix);
}
myData.setPatterns(patterns);
final Module module = PatternConfigurationProducer.findModule(this, getConfigurationModule().getModule(), patterns);
if (module == null) {
myData.setScope(TestSearchScope.WHOLE_PROJECT);
setModule(null);
} else {
setModule(module);
}
setGeneratedName();
}
@@ -16,15 +16,19 @@
package com.intellij.execution.junit;
import com.intellij.execution.JavaExecutionUtil;
import com.intellij.execution.JavaRunConfigurationExtensionManager;
import com.intellij.execution.Location;
import com.intellij.execution.RunnerAndConfigurationSettings;
import com.intellij.execution.actions.ConfigurationContext;
import com.intellij.execution.configurations.ModuleBasedConfiguration;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import org.jetbrains.annotations.NotNull;
@@ -55,6 +59,21 @@ public class PatternConfigurationProducer extends JUnitConfigurationProducer {
return settings;
}
@Override
protected Module findModule(ModuleBasedConfiguration configuration, Module contextModule) {
final Set<String> patterns = ((JUnitConfiguration)configuration).getPersistentData().getPatterns();
return findModule(configuration, contextModule, patterns);
}
public static Module findModule(ModuleBasedConfiguration configuration, Module contextModule, Set<String> patterns) {
return JavaExecutionUtil.findModule(contextModule, patterns, configuration.getProject(), new Condition<PsiClass>() {
@Override
public boolean value(PsiClass psiClass) {
return JUnitUtil.isTestClass(psiClass);
}
});
}
static Set<PsiMember> collectTestMembers(PsiElement[] psiElements) {
final Set<PsiMember> foundMembers = new LinkedHashSet<PsiMember>();
for (PsiElement psiElement : psiElements) {
@@ -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<Module> modules = new HashSet<Module>();
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);
@@ -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<JavaRunConfigu
patterns.add(JavaExecutionUtil.getRuntimeQualifiedName(pattern) + suffix);
}
data.setPatterns(patterns);
final Module module = TestNGPatternConfigurationProducer.findModule(this, getConfigurationModule().getModule(), patterns);
if (module == null) {
data.setScope(TestSearchScope.WHOLE_PROJECT);
setModule(null);
}
else {
setModule(module);
}
setGeneratedName();
}
@@ -20,15 +20,19 @@
*/
package com.theoryinpractice.testng.configuration;
import com.intellij.execution.JavaExecutionUtil;
import com.intellij.execution.JavaRunConfigurationExtensionManager;
import com.intellij.execution.Location;
import com.intellij.execution.RunnerAndConfigurationSettings;
import com.intellij.execution.actions.ConfigurationContext;
import com.intellij.execution.configurations.ModuleBasedConfiguration;
import com.intellij.execution.junit.JUnitUtil;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Condition;
import com.intellij.psi.*;
import com.theoryinpractice.testng.model.TestData;
import com.theoryinpractice.testng.model.TestType;
@@ -114,6 +118,21 @@ public class TestNGPatternConfigurationProducer extends TestNGConfigurationProdu
return myElements[0];
}
@Override
protected Module findModule(ModuleBasedConfiguration configuration, Module contextModule) {
final Set<String> patterns = ((TestNGConfiguration)configuration).data.getPatterns();
return findModule(configuration, contextModule, patterns);
}
public static Module findModule(ModuleBasedConfiguration configuration, Module contextModule, Set<String> patterns) {
return JavaExecutionUtil.findModule(contextModule, patterns, configuration.getProject(), new Condition<PsiClass>() {
@Override
public boolean value(PsiClass psiClass) {
return TestNGUtil.hasTest(psiClass);
}
});
}
@Override
protected RunnerAndConfigurationSettings findExistingByElement(@NotNull Location location,
@NotNull RunnerAndConfigurationSettings[] existingConfigurations,