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.
		
		
		
		
		
			
		
			
				
					
					
						
							143 lines
						
					
					
						
							4.1 KiB
						
					
					
				
			
		
		
	
	
							143 lines
						
					
					
						
							4.1 KiB
						
					
					
				/* | 
						|
 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;
 | 
						|
 |