UNPKG

babel-istanbul

Version:

Yet another JS code coverage tool that computes statement, line, function and branch coverage with module loader hooks to transparently add coverage when running tests. Supports all JS coverage use cases including unit tests, server side functional tests

93 lines (78 loc) 3.08 kB
/* Copyright (c) 2012, Yahoo! Inc. All rights reserved. Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. */ var path = require('path'), util = require('util'), mkdirp = require('mkdirp'), fs = require('fs'), utils = require('../object-utils'), Report = require('./index'); /** * a `Report` implementation that produces system messages interpretable by TeamCity. * * Usage * ----- * * var report = require('istanbul').Report.create('teamcity'); * * @class TeamcityReport * @extends Report * @module report * @constructor * @param {Object} opts optional * @param {String} [opts.dir] the directory in which to the text coverage report will be written, when writing to a file * @param {String} [opts.file] the filename for the report. When omitted, the report is written to console */ function TeamcityReport(opts) { Report.call(this); opts = opts || {}; this.dir = opts.dir || process.cwd(); this.file = opts.file; this.blockName = opts.blockName || this.getDefaultConfig().blockName; } TeamcityReport.TYPE = 'teamcity'; util.inherits(TeamcityReport, Report); function lineForKey(value, teamcityVar) { return '##teamcity[buildStatisticValue key=\'' + teamcityVar + '\' value=\'' + value + '\']'; } Report.mix(TeamcityReport, { synopsis: function () { return 'report with system messages that can be interpreted with TeamCity'; }, getDefaultConfig: function () { return { file: null , blockName: 'Code Coverage Summary'}; }, writeReport: function (collector /*, sync */) { var summaries = [], finalSummary, lines = [], text; collector.files().forEach(function (file) { summaries.push(utils.summarizeFileCoverage(collector.fileCoverageFor(file))); }); finalSummary = utils.mergeSummaryObjects.apply(null, summaries); lines.push(''); lines.push('##teamcity[blockOpened name=\''+ this.blockName +'\']'); //Statements Covered lines.push(lineForKey(finalSummary.statements.pct, 'CodeCoverageB')); //Methods Covered lines.push(lineForKey(finalSummary.functions.covered, 'CodeCoverageAbsMCovered')); lines.push(lineForKey(finalSummary.functions.total, 'CodeCoverageAbsMTotal')); lines.push(lineForKey(finalSummary.functions.pct, 'CodeCoverageM')); //Lines Covered lines.push(lineForKey(finalSummary.lines.covered, 'CodeCoverageAbsLCovered')); lines.push(lineForKey(finalSummary.lines.total, 'CodeCoverageAbsLTotal')); lines.push(lineForKey(finalSummary.lines.pct, 'CodeCoverageL')); lines.push('##teamcity[blockClosed name=\''+ this.blockName +'\']'); text = lines.join('\n'); if (this.file) { mkdirp.sync(this.dir); fs.writeFileSync(path.join(this.dir, this.file), text, 'utf8'); } else { console.log(text); } this.emit('done'); } }); module.exports = TeamcityReport;