123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- 'use strict';
- /*
- Copyright 2012-2015, Yahoo Inc.
- Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.
- */
- const { ReportBase } = require('istanbul-lib-report');
- class CloverReport extends ReportBase {
- constructor(opts) {
- super();
- this.cw = null;
- this.xml = null;
- this.projectRoot = opts.projectRoot || process.cwd();
- this.file = opts.file || 'clover.xml';
- }
- onStart(root, context) {
- this.cw = context.writer.writeFile(this.file);
- this.xml = context.getXMLWriter(this.cw);
- this.writeRootStats(root, context);
- }
- onEnd() {
- this.xml.closeAll();
- this.cw.close();
- }
- getTreeStats(node, context) {
- const state = {
- packages: 0,
- files: 0,
- classes: 0
- };
- const visitor = {
- onSummary(node, state) {
- const metrics = node.getCoverageSummary(true);
- if (metrics) {
- state.packages += 1;
- }
- },
- onDetail(node, state) {
- state.classes += 1;
- state.files += 1;
- }
- };
- node.visit(context.getVisitor(visitor), state);
- return state;
- }
- writeRootStats(node, context) {
- this.cw.println('<?xml version="1.0" encoding="UTF-8"?>');
- this.xml.openTag('coverage', {
- generated: Date.now().toString(),
- clover: '3.2.0'
- });
- this.xml.openTag('project', {
- timestamp: Date.now().toString(),
- name: 'All files'
- });
- const metrics = node.getCoverageSummary();
- this.xml.inlineTag('metrics', {
- statements: metrics.lines.total,
- coveredstatements: metrics.lines.covered,
- conditionals: metrics.branches.total,
- coveredconditionals: metrics.branches.covered,
- methods: metrics.functions.total,
- coveredmethods: metrics.functions.covered,
- elements:
- metrics.lines.total +
- metrics.branches.total +
- metrics.functions.total,
- coveredelements:
- metrics.lines.covered +
- metrics.branches.covered +
- metrics.functions.covered,
- complexity: 0,
- loc: metrics.lines.total,
- ncloc: metrics.lines.total, // what? copied as-is from old report
- ...this.getTreeStats(node, context)
- });
- }
- writeMetrics(metrics) {
- this.xml.inlineTag('metrics', {
- statements: metrics.lines.total,
- coveredstatements: metrics.lines.covered,
- conditionals: metrics.branches.total,
- coveredconditionals: metrics.branches.covered,
- methods: metrics.functions.total,
- coveredmethods: metrics.functions.covered
- });
- }
- onSummary(node) {
- if (node.isRoot()) {
- return;
- }
- const metrics = node.getCoverageSummary(true);
- if (!metrics) {
- return;
- }
- this.xml.openTag('package', {
- name: asJavaPackage(node)
- });
- this.writeMetrics(metrics);
- }
- onSummaryEnd(node) {
- if (node.isRoot()) {
- return;
- }
- this.xml.closeTag('package');
- }
- onDetail(node) {
- const fileCoverage = node.getFileCoverage();
- const metrics = node.getCoverageSummary();
- const branchByLine = fileCoverage.getBranchCoverageByLine();
- this.xml.openTag('file', {
- name: asClassName(node),
- path: fileCoverage.path
- });
- this.writeMetrics(metrics);
- const lines = fileCoverage.getLineCoverage();
- Object.entries(lines).forEach(([k, count]) => {
- const attrs = {
- num: k,
- count,
- type: 'stmt'
- };
- const branchDetail = branchByLine[k];
- if (branchDetail) {
- attrs.type = 'cond';
- attrs.truecount = branchDetail.covered;
- attrs.falsecount = branchDetail.total - branchDetail.covered;
- }
- this.xml.inlineTag('line', attrs);
- });
- this.xml.closeTag('file');
- }
- }
- function asJavaPackage(node) {
- return node
- .getRelativeName()
- .replace(/\//g, '.')
- .replace(/\\/g, '.')
- .replace(/\.$/, '');
- }
- function asClassName(node) {
- return node.getRelativeName().replace(/.*[\\/]/, '');
- }
- module.exports = CloverReport;
|