/* * Copyright 2012-2014 Sergey Ignatov * * 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 org.intellij.erlang.eunit; import com.intellij.execution.actions.ConfigurationContext; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.util.containers.ContainerUtil; import org.intellij.erlang.psi.ErlangFile; import org.intellij.erlang.psi.ErlangFunction; import org.intellij.erlang.psi.impl.ErlangPsiImplUtil; import org.intellij.erlang.runconfig.ErlangDebuggableRunConfigurationProducer; import org.jetbrains.annotations.NotNull; import java.util.Collection; import java.util.LinkedHashSet; public class ErlangUnitRunConfigurationProducer extends ErlangDebuggableRunConfigurationProducer<ErlangUnitRunConfiguration> { public ErlangUnitRunConfigurationProducer() { super(ErlangUnitRunConfigurationType.getInstance()); } @Override protected boolean setupConfigurationFromContextImpl(@NotNull ErlangUnitRunConfiguration configuration, @NotNull ConfigurationContext context, @NotNull PsiElement psiElement) { if (!ErlangTestRunConfigProducersUtil.shouldProduceEunitTestRunConfiguration(context.getProject(), context.getModule())) { return false; } configuration.setModule(context.getModule()); LinkedHashSet<String> functionNames = findTestFunctionNames(psiElement); if (!functionNames.isEmpty()) { configuration.getConfigData().setFunctionNames(functionNames); configuration.getConfigData().setKind(ErlangUnitRunConfiguration.ErlangUnitRunConfigurationKind.FUNCTION); configuration.setName(functionNames.iterator().next() + (functionNames.size() > 1 ? " and " + (functionNames.size() - 1) + " more" : "")); } else { LinkedHashSet<String> moduleNames = findTestModuleNames(context); if (moduleNames.isEmpty()) return false; configuration.getConfigData().setModuleNames(moduleNames); configuration.getConfigData().setKind(ErlangUnitRunConfiguration.ErlangUnitRunConfigurationKind.MODULE); configuration.setName(moduleNames.iterator().next() + (moduleNames.size() > 1 ? " and " + (moduleNames.size() - 1) + " more" : "")); } return true; } @Override public boolean isConfigurationFromContextImpl(@NotNull ErlangUnitRunConfiguration configuration, @NotNull ConfigurationContext context, @NotNull PsiElement psiElement) { ErlangUnitRunConfiguration.ErlangUnitRunConfigurationKind configurationKind = configuration.getConfigData().getKind(); if (configurationKind == ErlangUnitRunConfiguration.ErlangUnitRunConfigurationKind.FUNCTION) { LinkedHashSet<String> testFunctionNames = findTestFunctionNames(psiElement); return !testFunctionNames.isEmpty() && configuration.getConfigData().getFunctionNames().equals(testFunctionNames); } else if (configurationKind == ErlangUnitRunConfiguration.ErlangUnitRunConfigurationKind.MODULE) { return configuration.getConfigData().getModuleNames().equals(findTestModuleNames(context)); } return false; } @NotNull private static LinkedHashSet<String> findTestModuleNames(@NotNull ConfigurationContext context) { LinkedHashSet<String> moduleNames = new LinkedHashSet<>(); for (ErlangFile f : ErlangUnitTestElementUtil.findFileTestElements(context.getProject(), context.getDataContext())) { VirtualFile virtualFile = f.getVirtualFile(); if (virtualFile != null) { moduleNames.add(virtualFile.getNameWithoutExtension()); } } return moduleNames; } @NotNull private static LinkedHashSet<String> findTestFunctionNames(@NotNull PsiElement context) { Collection<ErlangFunction> functions = ErlangUnitTestElementUtil.findFunctionTestElements(context); functions = ContainerUtil.filter(functions, ErlangPsiImplUtil::isEunitTestFunction); LinkedHashSet<String> functionNames = new LinkedHashSet<>(); for (ErlangFunction f : functions) { functionNames.add(ErlangPsiImplUtil.getQualifiedFunctionName(f)); } return functionNames; } }