/* * Copyright 2013-2016 Sergey Ignatov, Alexander Zolotov, Florin Patan * * 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.goide.runconfig.testing.coverage; import com.goide.GoFileType; import com.goide.runconfig.testing.GoTestFinder; import com.goide.runconfig.testing.GoTestRunConfiguration; import com.intellij.coverage.*; import com.intellij.coverage.view.CoverageViewExtension; import com.intellij.coverage.view.CoverageViewManager; import com.intellij.coverage.view.DirectoryCoverageViewExtension; import com.intellij.execution.configurations.RunConfigurationBase; import com.intellij.execution.configurations.coverage.CoverageEnabledConfiguration; import com.intellij.execution.testframework.AbstractTestProxy; import com.intellij.ide.util.treeView.AbstractTreeNode; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Set; public class GoCoverageEngine extends CoverageEngine { private static final Condition<AbstractTreeNode> NODE_TO_COVERAGE = node -> { Object value = node.getValue(); if (value instanceof PsiFile) { return isProductionGoFile((PsiFile)value); } return !StringUtil.equals(node.getName(), Project.DIRECTORY_STORE_FOLDER); }; public static final GoCoverageEngine INSTANCE = new GoCoverageEngine(); private static final String PRESENTABLE_TEXT = "Go Coverage"; @Override public boolean isApplicableTo(@Nullable RunConfigurationBase conf) { return conf instanceof GoTestRunConfiguration; } @Override public boolean canHavePerTestCoverage(@Nullable RunConfigurationBase conf) { return false; } @NotNull @Override public CoverageEnabledConfiguration createCoverageEnabledConfiguration(@Nullable RunConfigurationBase conf) { return new GoCoverageEnabledConfiguration((GoTestRunConfiguration)conf); } @Override public CoverageSuite createCoverageSuite(@NotNull CoverageRunner runner, @NotNull String name, @NotNull CoverageFileProvider coverageDataFileProvider, @Nullable String[] filters, long lastCoverageTimeStamp, @Nullable String suiteToMerge, boolean coverageByTestEnabled, boolean tracingEnabled, boolean trackTestFolders, Project project) { return new GoCoverageSuite(name, coverageDataFileProvider, lastCoverageTimeStamp, runner, project); } @Override public CoverageSuite createCoverageSuite(@NotNull CoverageRunner runner, @NotNull String name, @NotNull CoverageFileProvider coverageDataFileProvider, @NotNull CoverageEnabledConfiguration config) { if (config instanceof GoCoverageEnabledConfiguration) { return new GoCoverageSuite(name, coverageDataFileProvider, new Date().getTime(), runner, config.getConfiguration().getProject()); } return null; } @Override public CoverageSuite createEmptyCoverageSuite(@NotNull CoverageRunner coverageRunner) { return new GoCoverageSuite(); } @NotNull @Override public CoverageAnnotator getCoverageAnnotator(Project project) { return GoCoverageAnnotator.getInstance(project); } @Override public boolean coverageEditorHighlightingApplicableTo(@NotNull PsiFile psiFile) { return isProductionGoFile(psiFile); } @Override public boolean acceptedByFilters(@NotNull PsiFile psiFile, @NotNull CoverageSuitesBundle suite) { return isProductionGoFile(psiFile); } private static boolean isProductionGoFile(@NotNull PsiFile psiFile) { return psiFile.getFileType() == GoFileType.INSTANCE && !GoTestFinder.isTestFile(psiFile); } @Override public boolean recompileProjectAndRerunAction(@NotNull Module module, @NotNull CoverageSuitesBundle suite, @NotNull Runnable chooseSuiteAction) { return false; } @Override public String getQualifiedName(@NotNull File outputFile, @NotNull PsiFile sourceFile) { return sourceFile.getVirtualFile().getPath(); } @NotNull @Override public Set<String> getQualifiedNames(@NotNull PsiFile sourceFile) { return Collections.singleton(sourceFile.getVirtualFile().getPath()); } @Override public boolean includeUntouchedFileInCoverage(@NotNull String qualifiedName, @NotNull File outputFile, @NotNull PsiFile sourceFile, @NotNull CoverageSuitesBundle suite) { return false; } @Override public List<Integer> collectSrcLinesForUntouchedFile(@NotNull File classFile, @NotNull CoverageSuitesBundle suite) { return null; } @Override public List<PsiElement> findTestsByNames(@NotNull String[] testNames, @NotNull Project project) { return Collections.emptyList(); } @Override public String getTestMethodName(@NotNull PsiElement element, @NotNull AbstractTestProxy testProxy) { return null; } @Override public String getPresentableText() { return PRESENTABLE_TEXT; } @Override public boolean coverageProjectViewStatisticsApplicableTo(VirtualFile fileOrDir) { return !fileOrDir.isDirectory() && fileOrDir.getFileType() == GoFileType.INSTANCE && !GoTestFinder.isTestFile(fileOrDir); } @Override public CoverageViewExtension createCoverageViewExtension(Project project, CoverageSuitesBundle suiteBundle, CoverageViewManager.StateBean stateBean) { return new DirectoryCoverageViewExtension(project, getCoverageAnnotator(project), suiteBundle, stateBean) { @Override public List<AbstractTreeNode> getChildrenNodes(AbstractTreeNode node) { return ContainerUtil.filter(super.getChildrenNodes(node), NODE_TO_COVERAGE); } }; } }