diff --git a/java/execution/impl/src/com/intellij/execution/junit/JUnitUtil.java b/java/execution/impl/src/com/intellij/execution/junit/JUnitUtil.java index 74524ca8ae14..e4de6db9a873 100644 --- a/java/execution/impl/src/com/intellij/execution/junit/JUnitUtil.java +++ b/java/execution/impl/src/com/intellij/execution/junit/JUnitUtil.java @@ -49,10 +49,10 @@ public class JUnitUtil { @NonNls public static final String SUITE_METHOD_NAME = "suite"; public static final String BEFORE_ANNOTATION_NAME = "org.junit.Before"; public static final String AFTER_ANNOTATION_NAME = "org.junit.After"; - private static final String PARAMETRIZED_PARAMETERS_ANNOTATION_NAME = "org.junit.runners.Parameterized.Parameters"; + public static final String PARAMETRIZED_PARAMETERS_ANNOTATION_NAME = "org.junit.runners.Parameterized.Parameters"; private static final String AFTER_CLASS_ANNOTATION_NAME = "org.junit.AfterClass"; private static final String BEFORE_CLASS_ANNOTATION_NAME = "org.junit.BeforeClass"; - private static final String PARAMETERIZED_CLASS_NAME = "org.junit.runners.Parameterized"; + public static final String PARAMETERIZED_CLASS_NAME = "org.junit.runners.Parameterized"; public static boolean isSuiteMethod(@NotNull PsiMethod psiMethod) { if (!psiMethod.hasModifierProperty(PsiModifier.PUBLIC)) return false; diff --git a/java/execution/openapi/src/com/intellij/execution/JavaExecutionUtil.java b/java/execution/openapi/src/com/intellij/execution/JavaExecutionUtil.java index 0e0615769b79..53861de25c3c 100644 --- a/java/execution/openapi/src/com/intellij/execution/JavaExecutionUtil.java +++ b/java/execution/openapi/src/com/intellij/execution/JavaExecutionUtil.java @@ -184,7 +184,7 @@ public class JavaExecutionUtil { return name == null || name.startsWith(ExecutionBundle.message("run.configuration.unnamed.name.prefix")); } - public static Location stepIntoSingleClass(final Location location) { + public static Location stepIntoSingleClass(@NotNull final Location location) { PsiElement element = location.getPsiElement(); if (!(element instanceof PsiClassOwner)) { if (PsiTreeUtil.getParentOfType(element, PsiClass.class) != null) return location; diff --git a/plugins/junit/src/com/intellij/execution/junit/JUnitConfigurationProducer.java b/plugins/junit/src/com/intellij/execution/junit/JUnitConfigurationProducer.java index d70a97f7beb9..8842fa9d254f 100644 --- a/plugins/junit/src/com/intellij/execution/junit/JUnitConfigurationProducer.java +++ b/plugins/junit/src/com/intellij/execution/junit/JUnitConfigurationProducer.java @@ -23,6 +23,7 @@ import com.intellij.execution.RunnerAndConfigurationSettings; import com.intellij.execution.actions.ConfigurationContext; import com.intellij.execution.actions.ConfigurationFromContext; import com.intellij.execution.configurations.RunConfiguration; +import com.intellij.execution.junit2.PsiClassParameterizedLocation; import com.intellij.openapi.module.Module; import com.intellij.openapi.util.Comparing; import com.intellij.psi.*; @@ -44,7 +45,12 @@ public abstract class JUnitConfigurationProducer extends JavaRunConfigurationPro return false; } final RunConfiguration predefinedConfiguration = context.getOriginalConfiguration(JUnitConfigurationType.getInstance()); - Location location = JavaExecutionUtil.stepIntoSingleClass(context.getLocation()); + final Location contextLocation = context.getLocation(); + + String paramSetName = contextLocation instanceof PsiClassParameterizedLocation + ? ((PsiClassParameterizedLocation)contextLocation).getParamSetName() : null; + assert contextLocation != null; + Location location = JavaExecutionUtil.stepIntoSingleClass(contextLocation); final PsiElement element = location.getPsiElement(); final PsiClass testClass = JUnitUtil.getTestClass(element); final PsiMethod testMethod = JUnitUtil.getTestMethod(element, false); @@ -65,6 +71,7 @@ public abstract class JUnitConfigurationProducer extends JavaRunConfigurationPro final String vmParameters = predefinedConfiguration instanceof JUnitConfiguration ? ((JUnitConfiguration)predefinedConfiguration).getVMParameters() : null; if (vmParameters != null && !Comparing.strEqual(vmParameters, unitConfiguration.getVMParameters())) return false; + if (paramSetName != null && !Comparing.strEqual(paramSetName, unitConfiguration.getProgramParameters())) return false; final TestObject testobject = unitConfiguration.getTestObject(); if (testobject != null) { if (testobject.isConfiguredByElement(unitConfiguration, testClass, testMethod, testPackage, testDir)) { diff --git a/plugins/junit/src/com/intellij/execution/junit/TestClassConfigurationProducer.java b/plugins/junit/src/com/intellij/execution/junit/TestClassConfigurationProducer.java index 3bfa0524bee1..8c81d2e7e009 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestClassConfigurationProducer.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestClassConfigurationProducer.java @@ -20,6 +20,7 @@ import com.intellij.execution.JavaExecutionUtil; import com.intellij.execution.Location; import com.intellij.execution.actions.ConfigurationContext; import com.intellij.execution.actions.ConfigurationFromContext; +import com.intellij.execution.junit2.PsiClassParameterizedLocation; import com.intellij.openapi.module.Module; import com.intellij.openapi.util.Ref; import com.intellij.psi.PsiClass; @@ -33,9 +34,18 @@ public class TestClassConfigurationProducer extends JUnitConfigurationProducer { protected boolean setupConfigurationFromContext(JUnitConfiguration configuration, ConfigurationContext context, Ref sourceElement) { - Location location = JavaExecutionUtil.stepIntoSingleClass(context.getLocation()); + final Location contextLocation = context.getLocation(); + assert contextLocation != null; + final Location location = JavaExecutionUtil.stepIntoSingleClass(contextLocation); if (location == null) return false; + if (contextLocation instanceof PsiClassParameterizedLocation) { + final String paramSetName = ((PsiClassParameterizedLocation)contextLocation).getParamSetName(); + if (paramSetName != null) { + configuration.setProgramParameters(paramSetName); + } + } + if (PatternConfigurationProducer.isMultipleElementsSelected(context)) { return false; } diff --git a/plugins/junit/src/com/intellij/execution/junit/TestMethodConfigurationProducer.java b/plugins/junit/src/com/intellij/execution/junit/TestMethodConfigurationProducer.java index 99005b14169d..571e744be55b 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestMethodConfigurationProducer.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestMethodConfigurationProducer.java @@ -21,6 +21,7 @@ import com.intellij.execution.Location; import com.intellij.execution.PsiLocation; import com.intellij.execution.actions.ConfigurationContext; import com.intellij.execution.actions.ConfigurationFromContext; +import com.intellij.execution.junit2.PsiClassParameterizedLocation; import com.intellij.execution.junit2.info.MethodLocation; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; @@ -40,14 +41,23 @@ public class TestMethodConfigurationProducer extends JUnitConfigurationProducer if (PatternConfigurationProducer.isMultipleElementsSelected(context)) { return false; } - Location methodLocation = getTestMethod(context.getLocation()); + final Location contextLocation = context.getLocation(); + assert contextLocation != null; + final Location methodLocation = getTestMethod(contextLocation); if (methodLocation == null) return false; + + if (contextLocation instanceof PsiClassParameterizedLocation) { + final String paramSetName = ((PsiClassParameterizedLocation)contextLocation).getParamSetName(); + if (paramSetName != null) { + configuration.setProgramParameters(paramSetName); + } + } sourceElement.set(methodLocation.getPsiElement()); setupConfigurationModule(context, configuration); final Module originalModule = configuration.getConfigurationModule().getModule(); configuration.beMethodConfiguration(methodLocation); configuration.restoreOriginalModule(originalModule); - JavaRunConfigurationExtensionManager.getInstance().extendCreatedConfiguration(configuration, context.getLocation()); + JavaRunConfigurationExtensionManager.getInstance().extendCreatedConfiguration(configuration, contextLocation); return true; } diff --git a/plugins/junit/src/com/intellij/execution/junit2/PsiClassParameterizedLocation.java b/plugins/junit/src/com/intellij/execution/junit2/PsiClassParameterizedLocation.java new file mode 100644 index 000000000000..84b5be6eb836 --- /dev/null +++ b/plugins/junit/src/com/intellij/execution/junit2/PsiClassParameterizedLocation.java @@ -0,0 +1,34 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.execution.junit2; + +import com.intellij.execution.PsiLocation; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiClass; +import org.jetbrains.annotations.NotNull; + +public class PsiClassParameterizedLocation extends PsiLocation { + private final String myParamSetName; + + public PsiClassParameterizedLocation(@NotNull Project project, @NotNull PsiClass psiClass, String paramSetName) { + super(project, psiClass); + myParamSetName = paramSetName; + } + + public String getParamSetName() { + return myParamSetName; + } +} diff --git a/plugins/junit/src/com/intellij/execution/junit2/TestProxy.java b/plugins/junit/src/com/intellij/execution/junit2/TestProxy.java index 93736671723c..b0cba5fb8ec9 100644 --- a/plugins/junit/src/com/intellij/execution/junit2/TestProxy.java +++ b/plugins/junit/src/com/intellij/execution/junit2/TestProxy.java @@ -16,7 +16,9 @@ package com.intellij.execution.junit2; +import com.intellij.codeInsight.AnnotationUtil; import com.intellij.execution.Location; +import com.intellij.execution.junit.JUnitUtil; import com.intellij.execution.junit2.events.*; import com.intellij.execution.junit2.info.TestInfo; import com.intellij.execution.junit2.states.IgnoredState; @@ -28,6 +30,7 @@ import com.intellij.execution.testframework.TestConsoleProperties; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.pom.Navigatable; +import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.rt.execution.junit.states.PoolOfTestStates; import org.jetbrains.annotations.NotNull; @@ -131,7 +134,34 @@ public class TestProxy extends AbstractTestProxy { } public Location getLocation(final Project project, GlobalSearchScope searchScope) { - return getInfo().getLocation(project, searchScope); + final Location location = getInfo().getLocation(project, searchScope); + if (location == null) { + return checkParentParameterized(project, searchScope); + } + return location; + } + + private Location checkParentParameterized(Project project, GlobalSearchScope searchScope) { + final TestProxy parent = getParent(); + if (parent != null) { + final Location parentLocation = parent.getLocation(project, searchScope); + if (parentLocation != null) { + final PsiElement parentElement = parentLocation.getPsiElement(); + if (parentElement instanceof PsiClass) { + final PsiAnnotation annotation = AnnotationUtil.findAnnotation((PsiClass)parentElement, JUnitUtil.RUN_WITH); + if (annotation != null) { + final PsiAnnotationMemberValue attributeValue = annotation.findAttributeValue("value"); + if (attributeValue instanceof PsiClassObjectAccessExpression) { + final PsiTypeElement operand = ((PsiClassObjectAccessExpression)attributeValue).getOperand(); + if (operand.getType().equalsToText(JUnitUtil.PARAMETERIZED_CLASS_NAME)) { + return new PsiClassParameterizedLocation(project, (PsiClass)parentElement, getInfo().getName()); + } + } + } + } + } + } + return null; } public boolean isLeaf() {