diff --git a/src/bld/java/rife/bld/extension/JacocoReportOperationBuild.java b/src/bld/java/rife/bld/extension/JacocoReportOperationBuild.java index 1a2e032..5b0773d 100644 --- a/src/bld/java/rife/bld/extension/JacocoReportOperationBuild.java +++ b/src/bld/java/rife/bld/extension/JacocoReportOperationBuild.java @@ -42,10 +42,10 @@ public class JacocoReportOperationBuild extends Project { var jacocoVersion = new VersionNumber(0, 8, 10); scope(compile) - .include(dependency("org.jacoco", "jacoco", jacocoVersion)) + .include(dependency("org.jacoco", "jacoco", jacocoVersion).exclude("*", "org.jacoco.doc")) .include(dependency("com.uwyn.rife2", "rife2", version(1, 6, 1))); scope(runtime) - .include(dependency("org.jacoco", "jacoco", jacocoVersion)); + .include(dependency("org.jacoco", "jacoco", jacocoVersion).exclude("*", "org.jacoco.doc")); scope(test) .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 9, 2))) .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 9, 2))) diff --git a/src/main/java/rife/bld/extension/JacocoReportOperation.java b/src/main/java/rife/bld/extension/JacocoReportOperation.java index 1330794..1b018cb 100644 --- a/src/main/java/rife/bld/extension/JacocoReportOperation.java +++ b/src/main/java/rife/bld/extension/JacocoReportOperation.java @@ -16,16 +16,27 @@ package rife.bld.extension; +import org.jacoco.core.analysis.Analyzer; +import org.jacoco.core.analysis.CoverageBuilder; +import org.jacoco.core.analysis.IBundleCoverage; +import org.jacoco.core.data.ExecutionDataStore; +import org.jacoco.core.tools.ExecFileLoader; +import org.jacoco.report.*; +import org.jacoco.report.csv.CSVFormatter; +import org.jacoco.report.html.HTMLFormatter; +import org.jacoco.report.xml.XMLFormatter; import rife.bld.BaseProject; import rife.bld.operations.AbstractOperation; -import rife.tools.FileUtils; import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import java.util.regex.Pattern; + /** * Generates JaCoCo reports. @@ -41,16 +52,26 @@ public class JacocoReportOperation extends AbstractOperation classFiles) { + public JacocoReportOperation classFiles(List classFiles) { this.classFiles.addAll(classFiles); return this; } @@ -74,7 +95,7 @@ public class JacocoReportOperation extends AbstractOperation execFiles) { + public JacocoReportOperation execFiles(List execFiles) { this.execFiles.addAll(execFiles); return this; } @@ -92,27 +113,37 @@ public class JacocoReportOperation extends AbstractOperation getClassFiles(File directory) { - return FileUtils.getFileList(directory, Pattern.compile("^.*\\.class$"), null) - .stream().map(f -> new File(directory, f)).toList(); + if (html == null) { + html = new File(buildJacocoReportsDir, "html"); + } + + if (xml == null) { + xml = new File(buildJacocoReportsDir, "jacocoTestReport.xml"); + } + + if (csv == null) { + csv = new File(buildJacocoReportsDir, "jacocoTestReport.csv"); + } + + //noinspection ResultOfMethodCallIgnored + buildJacocoReportsDir.mkdirs(); + + var loader = loadExecFiles(); + var bundle = analyze(loader.getExecutionDataStore()); + writeReports(bundle, loader); + } } /** @@ -123,10 +154,6 @@ public class JacocoReportOperation extends AbstractOperation visitors = new ArrayList<>(); + + if (xml != null) { + var formatter = new XMLFormatter(); + visitors.add(formatter.createVisitor(Files.newOutputStream(xml.toPath()))); + } + + if (csv != null) { + var formatter = new CSVFormatter(); + visitors.add(formatter.createVisitor(Files.newOutputStream(csv.toPath()))); + } + + if (html != null) { + var formatter = new HTMLFormatter(); + visitors.add(formatter.createVisitor(new FileMultiReportOutput(html))); + } + + return new MultiReportVisitor(visitors); + } + /** * Sets the locations of the source files. **/ - public JacocoReportOperation sourceFiles(ArrayList sourceFiles) { + public JacocoReportOperation sourceFiles(List sourceFiles) { this.sourceFiles.addAll(sourceFiles); return this; } + @SuppressWarnings("PMD.AvoidInstantiatingObjectsInLoops") + private ISourceFileLocator sourceLocator() { + var multi = new MultiSourceFileLocator(tabWidth); + for (var f : sourceFiles) { + multi.add(new DirectorySourceFileLocator(f, encoding, tabWidth)); + } + return multi; + } + /** * Sets the tab stop width for the source pages. Default is {@code 4}. */ - public JacocoReportOperation tabWidth(int tabWitdh) { - this.tabWidth = tabWitdh; + public JacocoReportOperation tabWidth(int tabWidth) { + this.tabWidth = tabWidth; return this; } + private void writeReports(IBundleCoverage bundle, ExecFileLoader loader) + throws IOException { + if (LOGGER.isLoggable(Level.INFO) && !quiet) { + LOGGER.log(Level.INFO, "Analyzing {0} classes.", + bundle.getClassCounter().getTotalCount()); + } + IReportVisitor visitor = reportVisitor(); + visitor.visitInfo(loader.getSessionInfoStore().getInfos(), + loader.getExecutionDataStore().getContents()); + visitor.visitBundle(bundle, sourceLocator()); + visitor.visitEnd(); + } + /** * Sets the location of the XML report. */ @@ -174,4 +260,5 @@ public class JacocoReportOperation extends AbstractOperation