144 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			144 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | /* | ||
|  |  Copyright 2012-2015, Yahoo Inc. | ||
|  |  Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. | ||
|  |  */ | ||
|  | const path = require('path'); | ||
|  | function CoberturaReport(opts) { | ||
|  |     this.cw = null; | ||
|  |     this.xml = null; | ||
|  |     this.projectRoot = opts.projectRoot || process.cwd(); | ||
|  |     this.file = opts.file || 'cobertura-coverage.xml'; | ||
|  | } | ||
|  | 
 | ||
|  | function asJavaPackage(node) { | ||
|  |     return node | ||
|  |         .getRelativeName() | ||
|  |         .replace(/\//g, '.') | ||
|  |         .replace(/\\/g, '.') | ||
|  |         .replace(/\.$/, ''); | ||
|  | } | ||
|  | 
 | ||
|  | function asClassName(node) { | ||
|  |     return node.getRelativeName().replace(/.*[\\/]/, ''); | ||
|  | } | ||
|  | 
 | ||
|  | CoberturaReport.prototype.onStart = function(root, context) { | ||
|  |     this.cw = context.writer.writeFile(this.file); | ||
|  |     this.xml = context.getXMLWriter(this.cw); | ||
|  |     this.writeRootStats(root); | ||
|  | }; | ||
|  | 
 | ||
|  | CoberturaReport.prototype.onEnd = function() { | ||
|  |     this.xml.closeAll(); | ||
|  |     this.cw.close(); | ||
|  | }; | ||
|  | 
 | ||
|  | CoberturaReport.prototype.writeRootStats = function(node) { | ||
|  |     const metrics = node.getCoverageSummary(); | ||
|  |     this.cw.println('<?xml version="1.0" ?>'); | ||
|  |     this.cw.println( | ||
|  |         '<!DOCTYPE coverage SYSTEM "http://cobertura.sourceforge.net/xml/coverage-04.dtd">' | ||
|  |     ); | ||
|  |     this.xml.openTag('coverage', { | ||
|  |         'lines-valid': metrics.lines.total, | ||
|  |         'lines-covered': metrics.lines.covered, | ||
|  |         'line-rate': metrics.lines.pct / 100.0, | ||
|  |         'branches-valid': metrics.branches.total, | ||
|  |         'branches-covered': metrics.branches.covered, | ||
|  |         'branch-rate': metrics.branches.pct / 100.0, | ||
|  |         timestamp: Date.now().toString(), | ||
|  |         complexity: '0', | ||
|  |         version: '0.1' | ||
|  |     }); | ||
|  |     this.xml.openTag('sources'); | ||
|  |     this.xml.inlineTag('source', null, this.projectRoot); | ||
|  |     this.xml.closeTag('sources'); | ||
|  |     this.xml.openTag('packages'); | ||
|  | }; | ||
|  | 
 | ||
|  | CoberturaReport.prototype.onSummary = function(node) { | ||
|  |     if (node.isRoot()) { | ||
|  |         return; | ||
|  |     } | ||
|  |     const metrics = node.getCoverageSummary(true); | ||
|  |     if (!metrics) { | ||
|  |         return; | ||
|  |     } | ||
|  |     this.xml.openTag('package', { | ||
|  |         name: asJavaPackage(node), | ||
|  |         'line-rate': metrics.lines.pct / 100.0, | ||
|  |         'branch-rate': metrics.branches.pct / 100.0 | ||
|  |     }); | ||
|  |     this.xml.openTag('classes'); | ||
|  | }; | ||
|  | 
 | ||
|  | CoberturaReport.prototype.onSummaryEnd = function(node) { | ||
|  |     if (node.isRoot()) { | ||
|  |         return; | ||
|  |     } | ||
|  |     this.xml.closeTag('classes'); | ||
|  |     this.xml.closeTag('package'); | ||
|  | }; | ||
|  | 
 | ||
|  | CoberturaReport.prototype.onDetail = function(node) { | ||
|  |     const fileCoverage = node.getFileCoverage(); | ||
|  |     const metrics = node.getCoverageSummary(); | ||
|  |     const branchByLine = fileCoverage.getBranchCoverageByLine(); | ||
|  | 
 | ||
|  |     this.xml.openTag('class', { | ||
|  |         name: asClassName(node), | ||
|  |         filename: path.relative(this.projectRoot, fileCoverage.path), | ||
|  |         'line-rate': metrics.lines.pct / 100.0, | ||
|  |         'branch-rate': metrics.branches.pct / 100.0 | ||
|  |     }); | ||
|  | 
 | ||
|  |     this.xml.openTag('methods'); | ||
|  |     const fnMap = fileCoverage.fnMap; | ||
|  |     Object.keys(fnMap).forEach(k => { | ||
|  |         const name = fnMap[k].name; | ||
|  |         const hits = fileCoverage.f[k]; | ||
|  |         this.xml.openTag('method', { | ||
|  |             name, | ||
|  |             hits, | ||
|  |             signature: '()V' //fake out a no-args void return
 | ||
|  |         }); | ||
|  |         this.xml.openTag('lines'); | ||
|  |         //Add the function definition line and hits so that jenkins cobertura plugin records method hits
 | ||
|  |         this.xml.inlineTag('line', { | ||
|  |             number: fnMap[k].decl.start.line, | ||
|  |             hits | ||
|  |         }); | ||
|  |         this.xml.closeTag('lines'); | ||
|  |         this.xml.closeTag('method'); | ||
|  |     }); | ||
|  |     this.xml.closeTag('methods'); | ||
|  | 
 | ||
|  |     this.xml.openTag('lines'); | ||
|  |     const lines = fileCoverage.getLineCoverage(); | ||
|  |     Object.keys(lines).forEach(k => { | ||
|  |         const attrs = { | ||
|  |             number: k, | ||
|  |             hits: lines[k], | ||
|  |             branch: 'false' | ||
|  |         }; | ||
|  |         const branchDetail = branchByLine[k]; | ||
|  | 
 | ||
|  |         if (branchDetail) { | ||
|  |             attrs.branch = true; | ||
|  |             attrs['condition-coverage'] = | ||
|  |                 branchDetail.coverage + | ||
|  |                 '% (' + | ||
|  |                 branchDetail.covered + | ||
|  |                 '/' + | ||
|  |                 branchDetail.total + | ||
|  |                 ')'; | ||
|  |         } | ||
|  |         this.xml.inlineTag('line', attrs); | ||
|  |     }); | ||
|  | 
 | ||
|  |     this.xml.closeTag('lines'); | ||
|  |     this.xml.closeTag('class'); | ||
|  | }; | ||
|  | 
 | ||
|  | module.exports = CoberturaReport; |