blob: c5a6be421a91b7e8740f50dc91221ae65a8d98ef [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* 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.android.tools.idea.testartifacts.junit;
import com.android.tools.idea.AndroidPsiUtils;
import com.android.tools.idea.gradle.util.GradleProjects;
import com.intellij.execution.*;
import com.intellij.execution.actions.ConfigurationContext;
import com.intellij.execution.actions.ConfigurationFromContext;
import com.intellij.execution.actions.RunConfigurationProducer;
import com.intellij.execution.configurations.ConfigurationFactory;
import com.intellij.execution.configurations.ModuleBasedConfiguration;
import com.intellij.execution.configurations.RunConfiguration;
import com.intellij.execution.junit.JUnitConfiguration;
import com.intellij.execution.junit.JUnitUtil;
import com.intellij.execution.junit.PatternConfigurationProducer;
import com.intellij.execution.junit.TestObject;
import com.intellij.openapi.module.Module;
import com.intellij.psi.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Common code for the {@link RunConfigurationProducer}s in Android JUnit configurations.
*/
public class AndroidJUnitConfigurations {
public static boolean shouldUseAndroidJUnitConfigurations(@NotNull ConfigurationFromContext self,
@NotNull ConfigurationFromContext other) {
RunConfiguration androidConfiguration = self.getConfiguration();
RunConfiguration otherConfiguration = other.getConfiguration();
if (androidConfiguration instanceof ModuleBasedConfiguration &&
(otherConfiguration instanceof JUnitConfiguration) &&
!(otherConfiguration instanceof AndroidJUnitConfiguration)) {
Module module = ((ModuleBasedConfiguration)androidConfiguration).getConfigurationModule().getModule();
if (module != null && GradleProjects.isIdeaAndroidModule(module)) {
return true;
}
}
return false;
}
public static boolean isFromContext(@NotNull JUnitConfiguration junitConfiguration,
@NotNull ConfigurationContext context,
@NotNull ConfigurationFactory configurationFactory) {
if (RunConfigurationProducer.getInstance(PatternConfigurationProducer.class).isMultipleElementsSelected(context)) {
return false;
}
Location contextLocation = context.getLocation();
if (contextLocation == null) {
return false;
}
PsiElement leaf = contextLocation.getPsiElement();
Location<PsiMethod> methodLocation = getTestMethodLocation(leaf);
PsiClass testClass = getTestClass(leaf);
TestObject testObject = junitConfiguration.getTestObject();
if (!testObject.isConfiguredByElement(junitConfiguration, testClass, methodLocation == null ? null : methodLocation.getPsiElement(), null, null)) {
return false;
}
return settingsMatchTemplate(junitConfiguration, context, configurationFactory);
}
private static boolean settingsMatchTemplate(@NotNull JUnitConfiguration junitConfiguration,
@NotNull ConfigurationContext configurationContext,
@NotNull ConfigurationFactory configurationFactory) {
RunConfiguration predefinedConfiguration = configurationContext.getOriginalConfiguration(AndroidJUnitConfigurationType.getInstance());
if (predefinedConfiguration != null && predefinedConfiguration instanceof CommonJavaRunConfigurationParameters) {
String vmParameters = ((CommonJavaRunConfigurationParameters)predefinedConfiguration).getVMParameters();
if (vmParameters != null && !junitConfiguration.getVMParameters().equals(vmParameters)) {
return false;
}
}
RunnerAndConfigurationSettings template = RunManager.getInstance(junitConfiguration.getProject()).getConfigurationTemplate(configurationFactory);
Module predefinedModule = ((ModuleBasedConfiguration)template.getConfiguration()).getConfigurationModule().getModule();
Module configurationModule = junitConfiguration.getConfigurationModule().getModule();
Module contextModule = configurationContext.getLocation() == null ? null : configurationContext.getLocation().getModule();
return configurationModule == contextModule || configurationModule == predefinedModule;
}
@Nullable
private static PsiClass getTestClass(@NotNull PsiElement leaf) {
PsiClass psiClass = AndroidPsiUtils.getPsiParentOfType(leaf, PsiClass.class, false);
if (psiClass != null && JUnitUtil.isTestClass(psiClass)) {
return psiClass;
}
return null;
}
@Nullable
private static Location<PsiMethod> getTestMethodLocation(@NotNull PsiElement leaf) {
PsiMethod method = AndroidPsiUtils.getPsiParentOfType(leaf, PsiMethod.class, false);
if (method != null) {
Location<PsiMethod> methodLocation = PsiLocation.fromPsiElement(method);
if (methodLocation != null && JUnitUtil.isTestMethod(methodLocation, false)) {
return methodLocation;
}
}
return null;
}
}