a6d4607f9cc1ae51ea02a528c749fb52595a414a
[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.configurations.*;
21 import com.intellij.execution.testframework.SourceScope;
22 import com.intellij.openapi.module.Module;
23 import com.intellij.openapi.project.Project;
24 import com.intellij.openapi.projectRoots.JavaSdk;
25 import com.intellij.openapi.util.io.FileUtil;
26 import com.intellij.openapi.vfs.LocalFileSystem;
27 import com.intellij.openapi.vfs.VirtualFile;
28 import com.intellij.psi.*;
29 import com.intellij.psi.search.GlobalSearchScope;
30 import com.intellij.psi.search.GlobalSearchScopes;
31
32 import java.util.Collection;
33
34 /**
35 * User: anna
36 * Date: 4/21/11
37 */
38 class TestDirectory extends TestPackage {
39   private final Project myProject;
40
41   public TestDirectory(Project project,
42                        JUnitConfiguration configuration,
43                        RunnerSettings runnerSettings,
44                        ConfigurationPerRunnerSettings configurationSettings) {
45     super(project, configuration, runnerSettings, configurationSettings);
46     myProject = project;
47   }
48
49   @Override
50   public SourceScope getSourceScope() {
51     final String dirName = myConfiguration.getPersistentData().getDirName();
52     final VirtualFile file = LocalFileSystem.getInstance().findFileByPath(FileUtil.toSystemIndependentName(dirName));
53     final GlobalSearchScope globalSearchScope = file == null ? GlobalSearchScope.EMPTY_SCOPE : GlobalSearchScopes
54         .directoryScope(myProject, file, true);
55     return new SourceScope() {
56       @Override
57       public GlobalSearchScope getGlobalSearchScope() {
58         return globalSearchScope;
59       }
60
61       @Override
62       public Project getProject() {
63         return myProject;
64       }
65
66       @Override
67       public GlobalSearchScope getLibrariesScope() {
68         final Module module = myConfiguration.getConfigurationModule().getModule();
69         LOG.assertTrue(module != null);
70         return GlobalSearchScope.moduleWithLibrariesScope(module);
71       }
72
73       @Override
74       public Module[] getModulesToCompile() {
75         final Collection<Module> validModules = myConfiguration.getValidModules();
76         return validModules.toArray(new Module[validModules.size()]);
77       }
78     };
79   }
80
81   @Override
82   public void checkConfiguration() throws RuntimeConfigurationException {
83     if (myConfiguration.isAlternativeJrePathEnabled()) {
84       if (myConfiguration.getAlternativeJrePath() == null ||
85           myConfiguration.getAlternativeJrePath().length() == 0 ||
86           !JavaSdk.checkForJre(myConfiguration.getAlternativeJrePath())) {
87         throw new RuntimeConfigurationWarning(
88           ExecutionBundle.message("jre.path.is.not.valid.jre.home.error.mesage", myConfiguration.getAlternativeJrePath()));
89       }
90     }
91     final String dirName = myConfiguration.getPersistentData().getDirName();
92     if (dirName == null || dirName.isEmpty()) {
93       throw new RuntimeConfigurationError("Directory is not specified");
94     }
95     final VirtualFile file = LocalFileSystem.getInstance().findFileByPath(FileUtil.toSystemIndependentName(dirName));
96     if (file == null) {
97       throw new RuntimeConfigurationWarning("Directory \'" + dirName + "\' is not found");
98     }
99     final Module module = myConfiguration.getConfigurationModule().getModule();
100     if (module == null) {
101       throw new RuntimeConfigurationError("Module to choose classpath from is not specified");
102     }
103   }
104
105   @Override
106   protected PsiPackage getPackage(JUnitConfiguration.Data data) throws CantRunException {
107     final String dirName = data.getDirName();
108     final VirtualFile file = LocalFileSystem.getInstance().findFileByPath(FileUtil.toSystemIndependentName(dirName));
109     if (file == null) {
110       throw new CantRunException("Directory \'" + dirName + "\' is not found");
111     }
112     final PsiDirectory directory = PsiManager.getInstance(myProject).findDirectory(file);
113     if (directory == null) {
114       throw new CantRunException("Directory \'" + dirName + "\' is not found");
115     }
116     final PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(directory);
117     if (aPackage == null) {
118       throw new CantRunException("Package not found in directory");
119     }
120     return aPackage;
121   }
122 }