You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
164 lines
4.5 KiB
164 lines
4.5 KiB
'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;
|
|
|