search for tests in directory restored for down-up approach
[idea/community.git] / plugins / junit / src / com / intellij / execution / junit / TestDirectory.java
1 /*
2  * Copyright 2000-2011 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 package com.intellij.execution.junit;
17
18 import com.intellij.execution.CantRunException;
19 import com.intellij.execution.ExecutionBundle;
20 import com.intellij.execution.TestClassCollector;
21 import com.intellij.execution.configurations.RuntimeConfigurationError;
22 import com.intellij.execution.configurations.RuntimeConfigurationException;
23 import com.intellij.execution.configurations.RuntimeConfigurationWarning;
24 import com.intellij.execution.runners.ExecutionEnvironment;
25 import com.intellij.execution.testframework.SourceScope;
26 import com.intellij.execution.util.JavaParametersUtil;
27 import com.intellij.execution.util.ProgramParametersUtil;
28 import com.intellij.openapi.application.ReadAction;
29 import com.intellij.openapi.module.Module;
30 import com.intellij.openapi.module.ModuleUtilCore;
31 import com.intellij.openapi.project.Project;
32 import com.intellij.openapi.util.Comparing;
33 import com.intellij.openapi.util.io.FileUtil;
34 import com.intellij.openapi.util.registry.Registry;
35 import com.intellij.openapi.util.text.StringUtil;
36 import com.intellij.openapi.vfs.LocalFileSystem;
37 import com.intellij.openapi.vfs.VirtualFile;
38 import com.intellij.psi.*;
39 import com.intellij.psi.search.GlobalSearchScope;
40 import com.intellij.psi.search.GlobalSearchScopesCore;
41 import com.intellij.util.ObjectUtils;
42 import org.jetbrains.annotations.Nullable;
43
44 import java.nio.file.Path;
45 import java.util.Collection;
46
47 class TestDirectory extends TestPackage {
48   public TestDirectory(JUnitConfiguration configuration, ExecutionEnvironment environment) {
49     super(configuration, environment);
50   }
51
52   @Nullable
53   @Override
54   public SourceScope getSourceScope() {
55     final String dirName = getConfiguration().getPersistentData().getDirName();
56     final VirtualFile file = LocalFileSystem.getInstance().findFileByPath(FileUtil.toSystemIndependentName(dirName));
57     final Project project = getConfiguration().getProject();
58     final GlobalSearchScope globalSearchScope;
59     if (file == null) {
60       globalSearchScope = GlobalSearchScope.EMPTY_SCOPE;
61     }
62     else {
63       //package created by directory getDirectories(scope) should return the directory itself,
64       // currently the parent directory should be specified for scope
65       VirtualFile scopeDirectory = Registry.is("junit4.search.4.tests.all.in.scope", true) ? ObjectUtils.notNull(file.getParent(), file) : file;
66       globalSearchScope = GlobalSearchScopesCore.directoryScope(project, scopeDirectory, true);
67     }
68     return new SourceScope() {
69       @Override
70       public GlobalSearchScope getGlobalSearchScope() {
71         return globalSearchScope;
72       }
73
74       @Override
75       public Project getProject() {
76         return project;
77       }
78
79       @Override
80       public GlobalSearchScope getLibrariesScope() {
81         final Module module = getConfiguration().getConfigurationModule().getModule();
82         return module != null ? GlobalSearchScope.moduleWithLibrariesScope(module)
83                               : GlobalSearchScope.allScope(project);
84       }
85
86       @Override
87       public Module[] getModulesToCompile() {
88         final Collection<Module> validModules = getConfiguration().getValidModules();
89         return validModules.toArray(Module.EMPTY_ARRAY);
90       }
91     };
92   }
93
94   @Nullable
95   @Override
96   protected Path getRootPath() {
97     final VirtualFile file = LocalFileSystem.getInstance().findFileByPath(FileUtil.toSystemIndependentName(getConfiguration().getPersistentData().getDirName()));
98     if (file == null) return null;
99     Module dirModule = ModuleUtilCore.findModuleForFile(file, getConfiguration().getProject());
100     if (dirModule == null) return null;
101     return TestClassCollector.getRootPath(dirModule, true);
102   }
103
104   @Override
105   protected boolean configureByModule(Module module) {
106     return module != null;
107   }
108
109   @Override
110   public void checkConfiguration() throws RuntimeConfigurationException {
111     JavaParametersUtil.checkAlternativeJRE(getConfiguration());
112     ProgramParametersUtil.checkWorkingDirectoryExist(
113       getConfiguration(), getConfiguration().getProject(), getConfiguration().getConfigurationModule().getModule());
114     final String dirName = getConfiguration().getPersistentData().getDirName();
115     if (dirName == null || dirName.isEmpty()) {
116       throw new RuntimeConfigurationError("Directory is not specified");
117     }
118     final VirtualFile file = LocalFileSystem.getInstance().findFileByPath(FileUtil.toSystemIndependentName(dirName));
119     if (file == null) {
120       throw new RuntimeConfigurationWarning("Directory \'" + dirName + "\' is not found");
121     }
122     final Module module = getConfiguration().getConfigurationModule().getModule();
123     if (module == null) {
124       throw new RuntimeConfigurationError("Module to choose classpath from is not specified");
125     }
126   }
127
128   @Override
129   protected GlobalSearchScope filterScope(JUnitConfiguration.Data data) throws CantRunException {
130     return GlobalSearchScope.allScope(getConfiguration().getProject());
131   }
132
133   @Override
134   protected String getPackageName(JUnitConfiguration.Data data) throws CantRunException {
135     return "";
136   }
137
138   @Override
139   protected PsiPackage getPackage(JUnitConfiguration.Data data) throws CantRunException {
140     final String dirName = data.getDirName();
141     final VirtualFile file = LocalFileSystem.getInstance().findFileByPath(FileUtil.toSystemIndependentName(dirName));
142     if (file == null) {
143       throw new CantRunException("Directory \'" + dirName + "\' is not found");
144     }
145     final PsiDirectory directory = ReadAction.compute(() -> PsiManager.getInstance(getConfiguration().getProject()).findDirectory(file));
146     if (directory == null) {
147       throw new CantRunException("Directory \'" + dirName + "\' is not found");
148     }
149     return ReadAction.compute(() -> JavaDirectoryService.getInstance().getPackage(directory));
150   }
151
152   @Override
153   public String suggestActionName() {
154     final JUnitConfiguration.Data data = getConfiguration().getPersistentData();
155     final String dirName = data.getDirName();
156     return dirName.isEmpty() ? ExecutionBundle.message("all.tests.scope.presentable.text") 
157                              : ExecutionBundle.message("test.in.scope.presentable.text", StringUtil.getShortName(dirName, '/'));
158   }
159
160   @Override
161   public boolean isConfiguredByElement(JUnitConfiguration configuration,
162                                        PsiClass testClass,
163                                        PsiMethod testMethod,
164                                        PsiPackage testPackage,
165                                        PsiDirectory testDir) {
166     if (JUnitConfiguration.TEST_DIRECTORY.equals(configuration.getPersistentData().TEST_OBJECT) && testDir != null) {
167       if (Comparing.strEqual(FileUtil.toSystemIndependentName(configuration.getPersistentData().getDirName()),
168                              testDir.getVirtualFile().getPath())) {
169         return true;
170       }
171     }
172     return false;
173   }
174 }