package com.lightd.ideap.maven.execution;
import com.intellij.execution.actions.ConfigurationContext;
import com.intellij.execution.junit.JUnitUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiJavaFile;
import com.intellij.psi.PsiMethod;
import com.intellij.util.text.VersionComparatorUtil;
import com.lightd.ideap.maven.MvnBundle;
import com.lightd.ideap.maven.MvnRunConfiguration;
import com.lightd.ideap.maven.RunType;
import com.lightd.ideap.maven.settings.MvnRunConfigurationSettings;
import org.jetbrains.idea.maven.model.MavenConstants;
import java.util.ArrayList;
import java.util.List;
public class MvnTestConfigurationProducer extends JavaElementConfigurationProducer {
protected PsiMethod psiMethod;
protected boolean isTestAll;
@Override
protected RunType getRunType() {
return RunType.Test;
}
@Override
protected boolean setupMavenContext(MvnRunConfiguration config, List<String> goals) {
boolean setup = super.setupMavenContext(config, goals);
if (config.getRunnerSettings() != null) {
config.getRunnerSettings().setSkipTests(false);
}
return setup;
}
@Override
protected boolean initContext(ConfigurationContext context) {
psiMethod = null;
isTestAll = false;
if (super.initContext(context)) {
isTestAll = psiClass == null && psiPackage == null;
isTestAll |= psiPackage != null && StringUtil.isEmpty(psiPackage.getQualifiedName());
if (psiClass != null)
psiMethod = JUnitUtil.getTestMethod(context.getPsiLocation());
return true;
}
return false;
}
private boolean isPom(){
return psiFile != null && MavenConstants.POM_XML.equals(psiFile.getName());
}
@Override
protected boolean isContext(ConfigurationContext context) {
if (super.isContext(context) && (isTestAll || psiPackage != null || psiClass != null)) {
isPom();
return !(psiClass != null && !JUnitUtil.isTestClass(psiClass)) && !isPom();
}
return false;
}
@Override
protected boolean isSameParameters(List<String> parameters, List<String> configParameters) {
String mvnTest = MvnBundle.message("mvn.param.test");
if (parameters.contains(mvnTest) && configParameters.contains(mvnTest)) {
String prefix = MvnBundle.message("mvn.param.test.object", "");
return findByPrefix(parameters, prefix).equals(findByPrefix(configParameters, prefix));
}
return false;
}
@Override
protected String generateName() {
String moduleName = mavenProject.getMavenId().getArtifactId();
if (isTestAll) {
return MvnBundle.message("action.all.tests.text", moduleName);
}
if (psiPackage != null) {
return MvnBundle.message("mvn.config.in.package.name", psiPackage.getQualifiedName(), moduleName);
}
String name = super.generateName();
if (psiMethod != null)
name += "." + psiMethod.getName();
return name;
}
protected List<String> generateMvnParameters() {
List<String> testParameters = new ArrayList<String>();
testParameters.add(MvnBundle.message("mvn.param.test.compile"));
testParameters.add(MvnBundle.message("mvn.param.test"));
if (!isTestAll) {
String mvnTestParam;
if (psiPackage != null) {
mvnTestParam = MvnBundle.message("mvn.package.test.suffix", psiPackage.getQualifiedName());
} else {
PsiJavaFile psiJavaFile = (PsiJavaFile) psiClass.getScope();
mvnTestParam = getJavaClassName(psiJavaFile.getPackageName(), psiClass.getName());
if (psiMethod != null) {
mvnTestParam = MvnBundle.message("mvn.method.test.suffix", mvnTestParam, psiMethod.getName());
}
}
testParameters.add(MvnBundle.message("mvn.param.test.object", mvnTestParam));
}
if (Boolean.valueOf(mavenProject.getProperties().getProperty("maven.test.skip", "false")))
testParameters.add(MvnBundle.message("mvn.param.skip"));
if (psiMethod == null) {
MvnRunConfigurationSettings settings = MvnRunConfigurationSettings.getInstance();
if (isForking()) {
testParameters.add(MvnBundle.message("mvn.param.fork.count", settings.getForkCount()));
if (settings.getForkCount() == 1)
testParameters.add(MvnBundle.message("mvn.param.reuse.forks", settings.isReuseForks()));
} else {
testParameters.add(MvnBundle.message("mvn.param.fork.mode",
getForkMode(settings.getForkCount(), settings.isReuseForks())));
if (testParameters.get(testParameters.size() - 1).contains("perthread")) {
testParameters.add(MvnBundle.message("mvn.param.fork.thread", settings.getForkCount()));
}
}
}
return testParameters;
}
private boolean isForking() {
for (org.jetbrains.idea.maven.model.MavenPlugin plugin : mavenProject.getPlugins()) {
if (plugin.getMavenId().equals("org.apache.maven.plugins", "maven-surefire-plugin")) {
return "2.14".equals(VersionComparatorUtil.min(plugin.getVersion(), "2.14"));
}
}
return false;
}
private String getForkMode(int forkCount, boolean reuseForks) {
if (forkCount <= 1) {
return reuseForks ? "once" : "always";
}
return forkCount == 0 ? "never" : "perthread";
}
}