From 98b03ef4f6aa2abde512fbcc5e48d9f039a75d0a Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 23 Jul 2013 12:31:30 +0200 Subject: [PATCH] testng, junit: do not accept existing configuration when created one differs by module or vm parameters (IDEA-110770) --- .../src/com/intellij/execution/RunManager.java | 16 ++++++++++++++++ .../junit/RuntimeConfigurationProducer.java | 8 ++++++++ .../intellij/execution/impl/RunConfigurable.java | 13 +------------ .../junit/JUnitConfigurationProducer.java | 12 +++++------- .../TestNGConfigurationProducer.java | 11 ++++------- 5 files changed, 34 insertions(+), 26 deletions(-) diff --git a/platform/lang-api/src/com/intellij/execution/RunManager.java b/platform/lang-api/src/com/intellij/execution/RunManager.java index 2690790c4847..4f35a05db43f 100644 --- a/platform/lang-api/src/com/intellij/execution/RunManager.java +++ b/platform/lang-api/src/com/intellij/execution/RunManager.java @@ -23,8 +23,11 @@ import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * User: anna @@ -67,4 +70,17 @@ public abstract class RunManager { public abstract Map> getStructure(@NotNull ConfigurationType type); public abstract void refreshUsagesList(RunProfile profile); + + public static String suggestUniqueName(String str, ArrayList currentNames) { + if (!currentNames.contains(str)) return str; + + final Matcher matcher = Pattern.compile("(.*?)\\s*\\(\\d+\\)").matcher(str); + final String originalName = (matcher.matches()) ? matcher.group(1) : str; + int i = 1; + while (true) { + final String newName = String.format("%s (%d)", originalName, i); + if (!currentNames.contains(newName)) return newName; + i++; + } + } } diff --git a/platform/lang-api/src/com/intellij/execution/junit/RuntimeConfigurationProducer.java b/platform/lang-api/src/com/intellij/execution/junit/RuntimeConfigurationProducer.java index 37a2682f8404..6bec55383d42 100644 --- a/platform/lang-api/src/com/intellij/execution/junit/RuntimeConfigurationProducer.java +++ b/platform/lang-api/src/com/intellij/execution/junit/RuntimeConfigurationProducer.java @@ -31,7 +31,9 @@ import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.Comparator; +import java.util.HashSet; public abstract class RuntimeConfigurationProducer implements Comparable, Cloneable { public static final ExtensionPointName RUNTIME_CONFIGURATION_PRODUCER = ExtensionPointName.create("com.intellij.configurationProducer"); @@ -65,6 +67,12 @@ public abstract class RuntimeConfigurationProducer implements Comparable, Clonea final RunnerAndConfigurationSettings configuration = result.findExistingByElement(_location, configurations, context); if (configuration != null) { result.myConfiguration = configuration; + } else { + final ArrayList currentNames = new ArrayList(); + for (RunnerAndConfigurationSettings configurationSettings : configurations) { + currentNames.add(configurationSettings.getName()); + } + result.myConfiguration.setName(RunManager.suggestUniqueName(result.myConfiguration.getName(), currentNames)); } } } diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java b/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java index 5bb04a40e94c..1a5d991ae700 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurable.java @@ -69,8 +69,6 @@ import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.util.*; import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import static com.intellij.execution.impl.RunConfigurable.NodeKind.*; import static com.intellij.ui.RowsDnDSupport.RefinedDropSupport.Position.*; @@ -1027,16 +1025,7 @@ class RunConfigurable extends BaseConfigurable { currentNames.add((String)userObject); } } - if (!currentNames.contains(str)) return str; - - final Matcher matcher = Pattern.compile("(.*?)\\s*\\(\\d+\\)").matcher(str); - final String originalName = (matcher.matches()) ? matcher.group(1) : str; - int i = 1; - while (true) { - final String newName = String.format("%s (%d)", originalName, i); - if (!currentNames.contains(newName)) return newName; - i++; - } + return RunManager.suggestUniqueName(str, currentNames); } private SingleConfigurationConfigurable createNewConfiguration(final RunnerAndConfigurationSettings settings, final DefaultMutableTreeNode node) { diff --git a/plugins/junit/src/com/intellij/execution/junit/JUnitConfigurationProducer.java b/plugins/junit/src/com/intellij/execution/junit/JUnitConfigurationProducer.java index ef2b1008cc07..24f221b641df 100644 --- a/plugins/junit/src/com/intellij/execution/junit/JUnitConfigurationProducer.java +++ b/plugins/junit/src/com/intellij/execution/junit/JUnitConfigurationProducer.java @@ -21,6 +21,8 @@ import com.intellij.execution.Location; import com.intellij.execution.RunManagerEx; import com.intellij.execution.RunnerAndConfigurationSettings; import com.intellij.execution.actions.ConfigurationContext; +import com.intellij.execution.configurations.RunConfiguration; +import com.intellij.execution.configurations.RuntimeConfiguration; import com.intellij.execution.impl.RunManagerImpl; import com.intellij.openapi.module.Module; import com.intellij.openapi.util.Comparing; @@ -46,10 +48,7 @@ public abstract class JUnitConfigurationProducer extends JavaRuntimeConfiguratio if (PatternConfigurationProducer.isMultipleElementsSelected(context)) { return null; } - final Module predefinedModule = - ((JUnitConfiguration)((RunManagerImpl)RunManagerEx.getInstanceEx(location.getProject())) - .getConfigurationTemplate(getConfigurationFactory()) - .getConfiguration()).getConfigurationModule().getModule(); + final RuntimeConfiguration predefinedConfiguration = context.getOriginalConfiguration(JUnitConfigurationType.getInstance()); location = JavaExecutionUtil.stepIntoSingleClass(location); final PsiElement element = location.getPsiElement(); final PsiClass testClass = JUnitUtil.getTestClass(element); @@ -62,16 +61,15 @@ public abstract class JUnitConfigurationProducer extends JavaRuntimeConfiguratio } else { testPackage = null; } + final String vmParameters = predefinedConfiguration instanceof JUnitConfiguration ? ((JUnitConfiguration)predefinedConfiguration).getVMParameters() : null; for (RunnerAndConfigurationSettings existingConfiguration : existingConfigurations) { final JUnitConfiguration unitConfiguration = (JUnitConfiguration)existingConfiguration.getConfiguration(); + if (vmParameters != null && !Comparing.strEqual(vmParameters, unitConfiguration.getVMParameters())) continue; final TestObject testobject = unitConfiguration.getTestObject(); if (testobject != null) { if (testobject.isConfiguredByElement(unitConfiguration, testClass, testMethod, testPackage)) { final Module configurationModule = unitConfiguration.getConfigurationModule().getModule(); if (Comparing.equal(location.getModule(), configurationModule)) return existingConfiguration; - if (Comparing.equal(predefinedModule, configurationModule)) { - return existingConfiguration; - } } } } diff --git a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationProducer.java b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationProducer.java index e15daffd987f..b0f4f7f51034 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationProducer.java +++ b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationProducer.java @@ -42,21 +42,18 @@ public abstract class TestNGConfigurationProducer extends JavaRuntimeConfigurati protected RunnerAndConfigurationSettings findExistingByElement(Location location, @NotNull RunnerAndConfigurationSettings[] existingConfigurations, ConfigurationContext context) { - final Module predefinedModule = - ((TestNGConfiguration)((RunManagerImpl)RunManagerEx.getInstanceEx(location.getProject())) - .getConfigurationTemplate(getConfigurationFactory()) - .getConfiguration()).getConfigurationModule().getModule(); + final TestNGConfiguration testNGConfiguration = + (TestNGConfiguration)context.getOriginalConfiguration(TestNGConfigurationType.getInstance()); + final String vmParameters = testNGConfiguration != null ? testNGConfiguration.getVMParameters() : null; for (RunnerAndConfigurationSettings existingConfiguration : existingConfigurations) { TestNGConfiguration config = (TestNGConfiguration)existingConfiguration.getConfiguration(); + if (vmParameters != null && !Comparing.strEqual(config.getVMParameters(), vmParameters)) continue; TestData testobject = config.getPersistantData(); if (testobject != null){ final PsiElement element = location.getPsiElement(); if (testobject.isConfiguredByElement(element)) { final Module configurationModule = config.getConfigurationModule().getModule(); if (Comparing.equal(location.getModule(), configurationModule)) return existingConfiguration; - if(Comparing.equal(predefinedModule, configurationModule)) { - return existingConfiguration; - } } } }