import tests: multiple selection according to the stored configuration (IDEA-155464)
[idea/community.git] / java / execution / impl / src / com / intellij / execution / testframework / JavaAwareTestConsoleProperties.java
1 /*
2  * Copyright 2000-2015 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: 20-Feb-2008
20  */
21 package com.intellij.execution.testframework;
22
23 import com.intellij.debugger.DebuggerManagerEx;
24 import com.intellij.debugger.impl.DebuggerSession;
25 import com.intellij.execution.CommonJavaRunConfigurationParameters;
26 import com.intellij.execution.Executor;
27 import com.intellij.execution.Location;
28 import com.intellij.execution.PsiLocation;
29 import com.intellij.execution.configurations.JavaRunConfigurationModule;
30 import com.intellij.execution.configurations.ModuleBasedConfiguration;
31 import com.intellij.execution.configurations.RunConfiguration;
32 import com.intellij.execution.stacktrace.StackTraceLine;
33 import com.intellij.execution.testframework.sm.runner.SMTRunnerConsoleProperties;
34 import com.intellij.openapi.diff.LineTokenizer;
35 import com.intellij.pom.Navigatable;
36 import com.intellij.psi.PsiClass;
37 import com.intellij.psi.PsiMethod;
38 import org.jetbrains.annotations.NotNull;
39 import org.jetbrains.annotations.Nullable;
40
41 import javax.swing.tree.TreeSelectionModel;
42 import java.util.Collection;
43 import java.util.Iterator;
44
45 public abstract class JavaAwareTestConsoleProperties<T extends ModuleBasedConfiguration<JavaRunConfigurationModule> & CommonJavaRunConfigurationParameters> extends SMTRunnerConsoleProperties {
46   public JavaAwareTestConsoleProperties(final String testFrameworkName, RunConfiguration configuration, Executor executor) {
47     super(configuration, testFrameworkName, executor);
48     setPrintTestingStartedTime(false);
49   }
50
51   @Override
52   public boolean isPaused() {
53     final DebuggerSession debuggerSession = getDebugSession();
54     return debuggerSession != null && debuggerSession.isPaused();
55   }
56
57   @Override
58   public T getConfiguration() {
59     return (T)super.getConfiguration();
60   }
61
62   @Override
63   public int getSelectionMode() {
64     return TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION;
65   }
66
67   @Override
68   public boolean fixEmptySuite() {
69     return ResetConfigurationModuleAdapter.tryWithAnotherModule(getConfiguration(), isDebug());
70   }
71
72   @Nullable
73   @Override
74   public Navigatable getErrorNavigatable(@NotNull Location<?> location, @NotNull String stacktrace) {
75     //navigate to the first stack trace
76     final String[] stackTrace = new LineTokenizer(stacktrace).execute();
77     final PsiLocation<?> psiLocation = location.toPsiLocation();
78     final PsiClass containingClass = psiLocation.getParentElement(PsiClass.class);
79     if (containingClass == null) return null;
80     final String qualifiedName = containingClass.getQualifiedName();
81     if (qualifiedName == null) return null;
82     String containingMethod = null;
83     for (Iterator<Location<PsiMethod>> iterator = psiLocation.getAncestors(PsiMethod.class, false); iterator.hasNext();) {
84       final PsiMethod psiMethod = iterator.next().getPsiElement();
85       if (containingClass.equals(psiMethod.getContainingClass())) containingMethod = psiMethod.getName();
86     }
87     if (containingMethod == null) return null;
88     StackTraceLine lastLine = null;
89     for (String aStackTrace : stackTrace) {
90       final StackTraceLine line = new StackTraceLine(containingClass.getProject(), aStackTrace);
91       if (containingMethod.equals(line.getMethodName()) && qualifiedName.equals(line.getClassName())) {
92         lastLine = line;
93         break;
94       }
95     }
96     return lastLine != null ? lastLine.getOpenFileDescriptor(containingClass.getContainingFile().getVirtualFile()) : null;
97   }
98
99   @Nullable
100   public DebuggerSession getDebugSession() {
101     final DebuggerManagerEx debuggerManager = DebuggerManagerEx.getInstanceEx(getProject());
102     if (debuggerManager == null) return null;
103     final Collection<DebuggerSession> sessions = debuggerManager.getSessions();
104     for (final DebuggerSession debuggerSession : sessions) {
105       if (getConsole() == debuggerSession.getProcess().getExecutionResult().getExecutionConsole()) return debuggerSession;
106     }
107     return null;
108   }
109
110 }