mockit.coverage.OutputFileGenerator Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jmockit Show documentation
Show all versions of jmockit Show documentation
JMockit is a Java toolkit for automated developer testing.
It contains mocking/faking APIs and a code coverage tool, supporting both JUnit and TestNG.
The mocking APIs allow all kinds of Java code, without testability restrictions, to be tested
in isolation from selected dependencies.
/*
* Copyright (c) 2006 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit.coverage;
import java.io.*;
import javax.annotation.*;
import mockit.coverage.data.*;
import mockit.coverage.modification.*;
import mockit.coverage.reporting.*;
@SuppressWarnings("DynamicRegexReplaceableByCompiledPattern")
final class OutputFileGenerator
{
private static final String[] ALL_SOURCE_DIRS = new String[0];
@Nullable private final ClassModification classModification;
@Nonnull private final String[] outputFormats;
@Nonnull private final String outputDir;
@Nullable private final String[] sourceDirs;
OutputFileGenerator(@Nullable ClassModification classModification)
{
this.classModification = classModification;
outputFormats = getOutputFormat();
outputDir = Configuration.getProperty("outputDir", "");
String commaSeparatedDirs = Configuration.getProperty("srcDirs");
if (commaSeparatedDirs == null) {
sourceDirs = CodeCoverage.isTestRun() ? ALL_SOURCE_DIRS : null;
}
else if (commaSeparatedDirs.isEmpty()) {
sourceDirs = null;
}
else {
sourceDirs = commaSeparatedDirs.split("\\s*,\\s*");
}
}
@Nonnull
private static String[] getOutputFormat()
{
String format = Configuration.getProperty("output", "");
return format.isEmpty() ? new String[] {"html-nocp"} : format.trim().split("\\s*,\\s*|\\s+");
}
boolean isOutputToBeGenerated()
{
return isOutputWithCallPointsToBeGenerated() || hasOutputFormat("html-nocp") || hasOutputFormat("xml");
}
private boolean isOutputWithCallPointsToBeGenerated()
{
return hasOutputFormat("html") || hasOutputFormat("serial") || hasOutputFormat("serial-append");
}
boolean isWithCallPoints()
{
return CodeCoverage.isTestRun() && isOutputWithCallPointsToBeGenerated() && !hasOutputFormat("html-nocp");
}
private boolean hasOutputFormat(@Nonnull String format)
{
for (String outputFormat : outputFormats) {
if (format.equals(outputFormat)) {
return true;
}
}
return false;
}
void generate(@Nullable CodeCoverage codeCoverage)
{
if (classModification != null && classModification.shouldConsiderClassesNotLoaded()) {
new ClassesNotLoaded(classModification).gatherCoverageData();
}
if (codeCoverage != null) {
codeCoverage.deactivate();
}
CoverageData coverageData = CoverageData.instance();
if (coverageData.isEmpty()) {
System.out.print("JMockit: No classes were instrumented for coverage; please make sure that ");
String classesRegexp = Configuration.getProperty("classes");
if (classesRegexp == null) {
System.out.print("classes exercised by tests are in a directory included in the runtime classpath");
}
else {
System.out.print(
"classes selected for coverage through the regular expression \"" + classesRegexp +
"\" are available from the runtime classpath");
}
System.out.println(", and that they have been compiled with debug information.");
return;
}
boolean outputDirCreated = createOutputDirIfSpecifiedButNotExists();
try {
generateAccretionDataFileIfRequested(coverageData);
generateXmlDataFileIfRequested(coverageData);
generateHTMLReportIfRequested(coverageData, outputDirCreated);
}
catch (IOException e) {
throw new RuntimeException(e);
}
}
void generateAggregateReportFromInputFiles(@Nonnull String[] inputPaths)
{
boolean outputDirCreated = createOutputDirIfSpecifiedButNotExists();
try {
CoverageData coverageData = new DataFileMerging(inputPaths).merge();
generateHTMLReportIfRequested(coverageData, outputDirCreated);
}
catch (IOException e) {
throw new RuntimeException(e);
}
}
private boolean createOutputDirIfSpecifiedButNotExists()
{
if (outputDir.isEmpty()) {
return false;
}
File outDir = new File(outputDir);
boolean dirCreated = outDir.mkdirs();
return dirCreated;
}
private void generateAccretionDataFileIfRequested(@Nonnull CoverageData newData) throws IOException
{
if (hasOutputFormat("serial")) {
new AccretionFile(outputDir, newData).generate();
}
else if (hasOutputFormat("serial-append")) {
AccretionFile accretionFile = new AccretionFile(outputDir, newData);
accretionFile.mergeDataFromExistingFileIfAny();
accretionFile.generate();
}
}
private void generateXmlDataFileIfRequested(@Nonnull CoverageData newData) throws IOException
{
if (hasOutputFormat("xml")) {
new XmlFile(outputDir, newData).generate();
}
}
private void generateHTMLReportIfRequested(@Nonnull CoverageData coverageData, boolean outputDirCreated)
throws IOException
{
if (hasOutputFormat("html-nocp")) {
new BasicCoverageReport(outputDir, outputDirCreated, sourceDirs, coverageData).generate();
}
else if (hasOutputFormat("html")) {
new FullCoverageReport(outputDir, outputDirCreated, sourceDirs, coverageData).generate();
}
}
}