junit/testng: pattern configuration isValid respect to chosen method
[idea/community.git] / plugins / junit / src / com / intellij / execution / junit / TestsPattern.java
1 /*
2  * Copyright 2000-2010 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 /*
18  * User: anna
19  * Date: 11-Jun-2010
20  */
21 package com.intellij.execution.junit;
22
23 import com.intellij.execution.ExecutionException;
24 import com.intellij.execution.JavaExecutionUtil;
25 import com.intellij.execution.configurations.*;
26 import com.intellij.execution.util.JavaParametersUtil;
27 import com.intellij.openapi.module.Module;
28 import com.intellij.openapi.module.ModuleUtil;
29 import com.intellij.openapi.project.Project;
30 import com.intellij.openapi.util.text.StringUtil;
31 import com.intellij.psi.PsiClass;
32 import com.intellij.psi.PsiElement;
33 import com.intellij.psi.PsiMethod;
34 import com.intellij.psi.PsiPackage;
35 import com.intellij.psi.search.GlobalSearchScope;
36 import com.intellij.refactoring.listeners.RefactoringElementListener;
37 import com.intellij.util.Function;
38 import com.intellij.util.FunctionUtil;
39 import org.jetbrains.annotations.Nullable;
40
41 import java.util.ArrayList;
42 import java.util.HashSet;
43 import java.util.Set;
44
45 public class TestsPattern extends TestObject {
46   public TestsPattern(final Project project,
47                       final JUnitConfiguration configuration,
48                       RunnerSettings runnerSettings,
49                       ConfigurationPerRunnerSettings configurationSettings) {
50     super(project, configuration, runnerSettings, configurationSettings);
51   }
52
53   @Override
54   protected void initialize() throws ExecutionException {
55     super.initialize();
56     final JUnitConfiguration.Data data = myConfiguration.getPersistentData();
57     final Project project = myConfiguration.getProject();
58     boolean isJUnit4 = false;
59     final ArrayList<String> classNames = new ArrayList<String>();
60     final Set<Module> modules = new HashSet<Module>();
61     for (String className : data.getPatterns()) {
62       final PsiClass psiClass = JavaExecutionUtil.findMainClass(project, className.contains(",") ? className.substring(0, className.indexOf(',')) : className, GlobalSearchScope.allScope(project));
63       if (psiClass != null && JUnitUtil.isTestClass(psiClass)) {
64         classNames.add(className);
65         modules.add(ModuleUtil.findModuleForPsiElement(psiClass));
66         if (JUnitUtil.isJUnit4TestClass(psiClass)) {
67           isJUnit4 = true;
68         }
69       }
70     }
71     final String jreHome = myConfiguration.isAlternativeJrePathEnabled() ? myConfiguration.getAlternativeJrePath() : null;
72
73     Module module = myConfiguration.getConfigurationModule().getModule();
74     if (module == null && modules.size() == 1 && modules.iterator().next() != null) {
75        module = modules.iterator().next();
76     }
77
78     if (module != null) {
79       JavaParametersUtil.configureModule(module, myJavaParameters, JavaParameters.JDK_AND_CLASSES_AND_TESTS, jreHome);
80     } else {
81       JavaParametersUtil.configureProject(project, myJavaParameters, JavaParameters.JDK_AND_CLASSES_AND_TESTS, jreHome);
82     }
83     addClassesListToJavaParameters(classNames, StringUtil.isEmpty(data.METHOD_NAME) ? FunctionUtil.<String>id() : new Function<String, String>() {
84       @Override
85       public String fun(String className) {
86         return className;
87       }
88     }, "", true, isJUnit4);
89   }
90
91   @Override
92   public String suggestActionName() {
93     final String configurationName = myConfiguration.getName();
94     if (!myConfiguration.isGeneratedName()) {
95     }
96     return "'" + configurationName + "'"; //todo
97   }
98
99   @Nullable
100   @Override
101   public RefactoringElementListener getListener(PsiElement element, JUnitConfiguration configuration) {
102     return null;
103   }
104
105   @Override
106   public boolean isConfiguredByElement(JUnitConfiguration configuration,
107                                        PsiClass testClass,
108                                        PsiMethod testMethod,
109                                        PsiPackage testPackage) {
110     /*if (testMethod != null && Comparing.strEqual(testMethod.getName(), configuration.getPersistentData().METHOD_NAME)) {
111       return true;
112     }*/
113     return false;
114   }
115
116   @Override
117   public void checkConfiguration() throws RuntimeConfigurationException {
118     final JUnitConfiguration.Data data = myConfiguration.getPersistentData();
119     final Set<String> patterns = data.getPatterns();
120     if (patterns.isEmpty()) {
121       throw new RuntimeConfigurationWarning("No pattern selected");
122     }
123     final GlobalSearchScope searchScope = GlobalSearchScope.allScope(myConfiguration.getProject());
124     for (String pattern : patterns) {
125       final String className = pattern.contains(",") ? StringUtil.getPackageName(pattern, ',') : pattern;
126       final PsiClass psiClass = JavaExecutionUtil.findMainClass(myConfiguration.getProject(), className, searchScope);
127       if (psiClass == null) {
128         throw new RuntimeConfigurationWarning("Class " + className + " not found");
129       }
130       if (!JUnitUtil.isTestClass(psiClass)) {
131         throw new RuntimeConfigurationWarning("Class " + className + " not a test");
132       }
133     }
134   }
135 }