blob: 01c8ac68540c33b3527ed90c4891e5cfbf0e65cd [file] [log] [blame]
/*
* Copyright 2000-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.jetbrains.python.testing;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.Executor;
import com.intellij.execution.Location;
import com.intellij.execution.configurations.GeneralCommandLine;
import com.intellij.execution.configurations.RunConfigurationBase;
import com.intellij.execution.configurations.RunProfileState;
import com.intellij.execution.runners.ExecutionEnvironment;
import com.intellij.execution.testframework.AbstractTestProxy;
import com.intellij.execution.testframework.TestFrameworkRunningModel;
import com.intellij.execution.testframework.actions.AbstractRerunFailedTestsAction;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.ComponentContainer;
import com.intellij.psi.PsiElement;
import com.intellij.psi.search.GlobalSearchScope;
import com.jetbrains.python.run.AbstractPythonRunConfiguration;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
public class PyRerunFailedTestsAction extends AbstractRerunFailedTestsAction {
protected PyRerunFailedTestsAction(@NotNull ComponentContainer componentContainer) {
super(componentContainer);
}
@Override
@Nullable
protected MyRunProfile getRunProfile(@NotNull ExecutionEnvironment environment) {
final TestFrameworkRunningModel model = getModel();
if (model == null) {
return null;
}
return new MyTestRunProfile((AbstractPythonRunConfiguration)model.getProperties().getConfiguration());
}
private class MyTestRunProfile extends MyRunProfile {
public MyTestRunProfile(RunConfigurationBase configuration) {
super(configuration);
}
@NotNull
@Override
public Module[] getModules() {
return ((AbstractPythonRunConfiguration)getPeer()).getModules();
}
@Nullable
@Override
public RunProfileState getState(@NotNull Executor executor, @NotNull ExecutionEnvironment env) throws ExecutionException {
final AbstractPythonRunConfiguration configuration = ((AbstractPythonRunConfiguration)getPeer());
// If configuration wants to take care about rerun itself
if (configuration instanceof TestRunConfigurationReRunResponsible) {
// TODO: Extract method
final Set<PsiElement> failedTestElements = new HashSet<PsiElement>();
for (final AbstractTestProxy proxy : getFailedTests(getProject())) {
final Location<?> location = proxy.getLocation(getProject(), GlobalSearchScope.allScope(getProject()));
if (location != null) {
failedTestElements.add(location.getPsiElement());
}
}
return ((TestRunConfigurationReRunResponsible)configuration).rerunTests(executor, env, failedTestElements);
}
return new FailedPythonTestCommandLineStateBase(configuration, env,
(PythonTestCommandLineStateBase)configuration.getState(executor, env));
}
}
private class FailedPythonTestCommandLineStateBase extends PythonTestCommandLineStateBase {
private final PythonTestCommandLineStateBase myState;
private final Project myProject;
public FailedPythonTestCommandLineStateBase(AbstractPythonRunConfiguration configuration,
ExecutionEnvironment env,
PythonTestCommandLineStateBase state) {
super(configuration, env);
myState = state;
myProject = configuration.getProject();
}
@Override
protected String getRunner() {
return myState.getRunner();
}
@Override
protected List<String> getTestSpecs() {
List<String> specs = new ArrayList<String>();
List<AbstractTestProxy> failedTests = getFailedTests(myProject);
for (AbstractTestProxy failedTest : failedTests) {
if (failedTest.isLeaf()) {
final Location location = failedTest.getLocation(myProject, myConsoleProperties.getScope());
if (location != null) {
String spec = getConfiguration().getTestSpec(location);
if (spec != null && !specs.contains(spec)) {
specs.add(spec);
}
}
}
}
return specs;
}
@Override
protected void addAfterParameters(GeneralCommandLine cmd) throws ExecutionException {
myState.addAfterParameters(cmd);
}
@Override
protected void addBeforeParameters(GeneralCommandLine cmd) throws ExecutionException {
myState.addBeforeParameters(cmd);
}
@Override
public void addPredefinedEnvironmentVariables(Map<String, String> envs, boolean passParentEnvs) {
myState.addPredefinedEnvironmentVariables(envs,
passParentEnvs);
}
}
}