var path = require('path'), Report = require('./index'), FileWriter = require('../util/file-writer'), TreeSummarizer = require('../util/tree-summarizer'), utils = require('../object-utils'); function CloverReport(opts) { Report.call(this); opts = opts || {}; this.projectRoot = process.cwd(); this.dir = opts.dir || this.projectRoot; this.file = opts.file || 'clover.xml'; this.opts = opts; } CloverReport.TYPE = 'clover'; function asJavaPackage(node) { return node.displayShortName(). replace(/\//g, '.'). replace(/\\/g, '.'). replace(/\.$/, ''); } function asClassName(node) { /*jslint regexp: true */ return node.fullPath().replace(/.*[\\\/]/, ''); } function quote(thing) { return '"' + thing + '"'; } function attr(n, v) { return ' ' + n + '=' + quote(v) + ' '; } function branchCoverageByLine(fileCoverage) { var branchMap = fileCoverage.branchMap, branches = fileCoverage.b, ret = {}; Object.keys(branchMap).forEach(function (k) { var line = branchMap[k].line, branchData = branches[k]; ret[line] = ret[line] || []; ret[line].push.apply(ret[line], branchData); }); Object.keys(ret).forEach(function (k) { var dataArray = ret[k], covered = dataArray.filter(function (item) { return item > 0; }), coverage = covered.length / dataArray.length * 100; ret[k] = { covered: covered.length, total: dataArray.length, coverage: coverage }; }); return ret; } function addClassStats(node, fileCoverage, writer) { var metrics = node.metrics, branchByLine = branchCoverageByLine(fileCoverage), fnMap, lines; writer.println('\t\t\t'); writer.println('\t\t\t\t'); fnMap = fileCoverage.fnMap; lines = fileCoverage.l; Object.keys(lines).forEach(function (k) { var str = '\t\t\t\t'); }); writer.println('\t\t\t'); } function walk(node, collector, writer, level, projectRoot) { var metrics, totalFiles = 0, totalPackages = 0, totalLines = 0, tempLines = 0; if (level === 0) { metrics = node.metrics; writer.println(''); writer.println(''); writer.println('\t'); node.children.filter(function (child) { return child.kind === 'dir'; }). forEach(function (child) { totalPackages += 1; child.children.filter(function (child) { return child.kind !== 'dir'; }). forEach(function (child) { Object.keys(collector.fileCoverageFor(child.fullPath()).l).forEach(function (k){ tempLines = k; }); totalLines += Number(tempLines); totalFiles += 1; }); }); writer.println('\t\t'); } if (node.packageMetrics) { metrics = node.packageMetrics; writer.println('\t\t'); writer.println('\t\t\t'); node.children.filter(function (child) { return child.kind !== 'dir'; }). forEach(function (child) { addClassStats(child, collector.fileCoverageFor(child.fullPath()), writer); }); writer.println('\t\t'); } node.children.filter(function (child) { return child.kind === 'dir'; }). forEach(function (child) { walk(child, collector, writer, level + 1, projectRoot); }); if (level === 0) { writer.println('\t'); writer.println(''); } } Report.mix(CloverReport, { writeReport: function (collector, sync) { var summarizer = new TreeSummarizer(), outputFile = path.join(this.dir, this.file), writer = this.opts.writer || new FileWriter(sync), projectRoot = this.projectRoot, tree, root; collector.files().forEach(function (key) { summarizer.addFileCoverageSummary(key, utils.summarizeFileCoverage(collector.fileCoverageFor(key))); }); tree = summarizer.getTreeSummary(); root = tree.root; writer.writeFile(outputFile, function (contentWriter) { walk(root, collector, contentWriter, 0, projectRoot); }); } }); module.exports = CloverReport;