2 * Copyright 2000-2011 JetBrains s.r.o.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package com.intellij.execution.junit;
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;
44 import java.nio.file.Path;
45 import java.util.Collection;
47 class TestDirectory extends TestPackage {
48 public TestDirectory(JUnitConfiguration configuration, ExecutionEnvironment environment) {
49 super(configuration, environment);
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;
60 globalSearchScope = GlobalSearchScope.EMPTY_SCOPE;
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);
68 return new SourceScope() {
70 public GlobalSearchScope getGlobalSearchScope() {
71 return globalSearchScope;
75 public Project getProject() {
80 public GlobalSearchScope getLibrariesScope() {
81 final Module module = getConfiguration().getConfigurationModule().getModule();
82 return module != null ? GlobalSearchScope.moduleWithLibrariesScope(module)
83 : GlobalSearchScope.allScope(project);
87 public Module[] getModulesToCompile() {
88 final Collection<Module> validModules = getConfiguration().getValidModules();
89 return validModules.toArray(Module.EMPTY_ARRAY);
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);
105 protected boolean configureByModule(Module module) {
106 return module != null;
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");
118 final VirtualFile file = LocalFileSystem.getInstance().findFileByPath(FileUtil.toSystemIndependentName(dirName));
120 throw new RuntimeConfigurationWarning("Directory \'" + dirName + "\' is not found");
122 final Module module = getConfiguration().getConfigurationModule().getModule();
123 if (module == null) {
124 throw new RuntimeConfigurationError("Module to choose classpath from is not specified");
129 protected GlobalSearchScope filterScope(JUnitConfiguration.Data data) throws CantRunException {
130 return GlobalSearchScope.allScope(getConfiguration().getProject());
134 protected String getPackageName(JUnitConfiguration.Data data) throws CantRunException {
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));
143 throw new CantRunException("Directory \'" + dirName + "\' is not found");
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");
149 return ReadAction.compute(() -> JavaDirectoryService.getInstance().getPackage(directory));
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, '/'));
161 public boolean isConfiguredByElement(JUnitConfiguration configuration,
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())) {