import tests: multiple selection according to the stored configuration (IDEA-155464)
[idea/community.git] / platform / testRunner / src / com / intellij / execution / testframework / TestConsoleProperties.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 package com.intellij.execution.testframework;
17
18 import com.intellij.execution.DefaultExecutionTarget;
19 import com.intellij.execution.ExecutionBundle;
20 import com.intellij.execution.ExecutionTarget;
21 import com.intellij.execution.Executor;
22 import com.intellij.execution.configurations.ModuleRunProfile;
23 import com.intellij.execution.configurations.RunProfile;
24 import com.intellij.execution.executors.DefaultDebugExecutor;
25 import com.intellij.execution.ui.ConsoleView;
26 import com.intellij.execution.ui.ExecutionConsole;
27 import com.intellij.execution.util.StoringPropertyContainer;
28 import com.intellij.openapi.Disposable;
29 import com.intellij.openapi.actionSystem.AnAction;
30 import com.intellij.openapi.actionSystem.DefaultActionGroup;
31 import com.intellij.openapi.module.Module;
32 import com.intellij.openapi.project.Project;
33 import com.intellij.psi.search.GlobalSearchScope;
34 import com.intellij.util.config.*;
35 import com.intellij.util.containers.ContainerUtil;
36 import com.intellij.xdebugger.XDebugSession;
37 import com.intellij.xdebugger.XDebuggerManager;
38 import org.intellij.lang.annotations.JdkConstants;
39 import org.jetbrains.annotations.NotNull;
40 import org.jetbrains.annotations.Nullable;
41
42 import javax.swing.*;
43 import javax.swing.tree.TreeSelectionModel;
44 import java.util.List;
45 import java.util.Map;
46
47 /**
48  * @author anna
49  * @since 25-May-2007
50  */
51 public abstract class TestConsoleProperties extends StoringPropertyContainer implements Disposable {
52   public static final BooleanProperty SCROLL_TO_STACK_TRACE = new BooleanProperty("scrollToStackTrace", false);
53   public static final BooleanProperty SORT_ALPHABETICALLY = new BooleanProperty("sortTestsAlphabetically", false);
54   public static final BooleanProperty SORT_BY_DURATION = new BooleanProperty("sortTestsByDuration", false);
55   public static final BooleanProperty SELECT_FIRST_DEFECT = new BooleanProperty("selectFirtsDefect", false);
56   public static final BooleanProperty TRACK_RUNNING_TEST = new BooleanProperty("trackRunningTest", true);
57   public static final BooleanProperty HIDE_IGNORED_TEST = new BooleanProperty("hideIgnoredTests", false);
58   public static final BooleanProperty HIDE_PASSED_TESTS = new BooleanProperty("hidePassedTests", true);
59   public static final BooleanProperty SCROLL_TO_SOURCE = new BooleanProperty("scrollToSource", false);
60   public static final BooleanProperty OPEN_FAILURE_LINE = new BooleanProperty("openFailureLine", true);
61   public static final BooleanProperty TRACK_CODE_COVERAGE = new BooleanProperty("trackCodeCoverage", false);
62   public static final BooleanProperty SHOW_STATISTICS = new BooleanProperty("showStatistics", false);
63   public static final BooleanProperty SHOW_INLINE_STATISTICS = new BooleanProperty("showInlineStatistics", true);
64   public static final BooleanProperty INCLUDE_NON_STARTED_IN_RERUN_FAILED = new BooleanProperty("includeNonStarted", true);
65   public static final BooleanProperty HIDE_SUCCESSFUL_CONFIG = new BooleanProperty("hideConfig", false);
66
67   private final Project myProject;
68   private final Executor myExecutor;
69   private ConsoleView myConsole;
70   private boolean myUsePredefinedMessageFilter = true;
71   private GlobalSearchScope myScope;
72   private boolean myPreservePresentableName = false;
73
74   protected final Map<AbstractProperty, List<TestFrameworkPropertyListener>> myListeners = ContainerUtil.newHashMap();
75
76   public TestConsoleProperties(@NotNull Storage storage, Project project, Executor executor) {
77     super(storage);
78     myProject = project;
79     myExecutor = executor;
80   }
81
82   public Project getProject() {
83     return myProject;
84   }
85
86   @NotNull
87   public GlobalSearchScope getScope() {
88     if (myScope == null) {
89       myScope = initScope();
90     }
91     return myScope;
92   }
93
94   @NotNull
95   protected GlobalSearchScope initScope() {
96     RunProfile configuration = getConfiguration();
97     if (!(configuration instanceof ModuleRunProfile)) {
98       return GlobalSearchScope.allScope(myProject);
99     }
100
101     Module[] modules = ((ModuleRunProfile)configuration).getModules();
102     if (modules.length == 0) {
103       return GlobalSearchScope.allScope(myProject);
104     }
105
106     GlobalSearchScope scope = GlobalSearchScope.EMPTY_SCOPE;
107     for (Module each : modules) {
108       scope = scope.uniteWith(GlobalSearchScope.moduleRuntimeScope(each, true));
109     }
110     return scope;
111   }
112
113   public boolean isPreservePresentableName() {
114     return myPreservePresentableName;
115   }
116
117   public void setPreservePresentableName(boolean preservePresentableName) {
118     myPreservePresentableName = preservePresentableName;
119   }
120
121   public <T> void addListener(@NotNull AbstractProperty<T> property, @NotNull TestFrameworkPropertyListener<T> listener) {
122     List<TestFrameworkPropertyListener> listeners = myListeners.get(property);
123     if (listeners == null) {
124       myListeners.put(property, (listeners = ContainerUtil.newArrayList()));
125     }
126     listeners.add(listener);
127   }
128
129   public <T> void addListenerAndSendValue(@NotNull AbstractProperty<T> property, @NotNull TestFrameworkPropertyListener<T> listener) {
130     addListener(property, listener);
131     listener.onChanged(property.get(this));
132   }
133
134   public <T> void removeListener(@NotNull AbstractProperty<T> property, @NotNull TestFrameworkPropertyListener listener) {
135     List<TestFrameworkPropertyListener> listeners = myListeners.get(property);
136     if (listeners != null) {
137       listeners.remove(listener);
138     }
139   }
140
141   public Executor getExecutor() {
142     return myExecutor;
143   }
144
145   public boolean isDebug() {
146     return myExecutor.getId() == DefaultDebugExecutor.EXECUTOR_ID;
147   }
148
149   public boolean isPaused() {
150     XDebugSession debuggerSession = XDebuggerManager.getInstance(myProject).getDebugSession(getConsole());
151     return debuggerSession != null && debuggerSession.isPaused();
152   }
153
154   @Override
155   protected <T> void onPropertyChanged(@NotNull AbstractProperty<T> property, T value) {
156     List<TestFrameworkPropertyListener> listeners = myListeners.get(property);
157     if (listeners != null) {
158       for (Object o : listeners.toArray()) {
159         @SuppressWarnings("unchecked") TestFrameworkPropertyListener<T> listener = (TestFrameworkPropertyListener<T>)o;
160         listener.onChanged(value);
161       }
162     }
163   }
164
165   public void setConsole(ConsoleView console) {
166     myConsole = console;
167   }
168
169   @Override
170   public void dispose() {
171     myListeners.clear();
172   }
173
174   public abstract RunProfile getConfiguration();
175
176   /**
177    * Allows to make console editable and disable/enable input sending in process stdin stream.
178    * Normally tests shouldn't ask anything in stdin so console is view only by default.
179    * <p/>
180    * NB1: Process input support feature isn't fully implemented. Input text will be lost after
181    * switching to any other test/suite in tests results view. It's highly not recommended to change
182    * default behaviour. Please do it only in critical cases and only if you are sure that you need this feature.
183    * <p/>
184    * NB2: If you are using Service Messages based test runner please ensure that before each service message
185    * (e.g. #teamcity[...]) you always send "\n" to the output stream.
186    *
187    * @return False for view-only mode and true for stdin support.
188    */
189   public boolean isEditable() {
190     return false;
191   }
192
193   protected ExecutionConsole getConsole() {
194     return myConsole;
195   }
196
197   public boolean isUsePredefinedMessageFilter() {
198     return myUsePredefinedMessageFilter;
199   }
200
201   public void setUsePredefinedMessageFilter(boolean usePredefinedMessageFilter) {
202     myUsePredefinedMessageFilter = usePredefinedMessageFilter;
203   }
204
205   public void appendAdditionalActions(DefaultActionGroup actionGroup, JComponent parent, TestConsoleProperties target) { }
206   
207   @Nullable
208   protected AnAction createImportAction() {
209     return null;
210   }
211
212   @NotNull
213   protected ToggleBooleanProperty createIncludeNonStartedInRerun(TestConsoleProperties target) {
214     String text = ExecutionBundle.message("junit.runing.info.include.non.started.in.rerun.failed.action.name");
215     return new DumbAwareToggleBooleanProperty(text, null, null, target, INCLUDE_NON_STARTED_IN_RERUN_FAILED);
216   }
217   
218   @NotNull
219   protected ToggleBooleanProperty createHideSuccessfulConfig(TestConsoleProperties target) {
220     String text = ExecutionBundle.message("junit.runing.info.hide.successful.config.action.name");
221     setIfUndefined(HIDE_SUCCESSFUL_CONFIG, true);
222     return new DumbAwareToggleBooleanProperty(text, null, null, target, HIDE_SUCCESSFUL_CONFIG);
223   }
224
225   @JdkConstants.TreeSelectionMode
226   public int getSelectionMode() {
227     return TreeSelectionModel.SINGLE_TREE_SELECTION;
228   }
229   
230   @NotNull
231   public ExecutionTarget getExecutionTarget() {
232     return DefaultExecutionTarget.INSTANCE;
233   }
234 }