/* Copyright 2015, Yahoo Inc. Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. */ "use strict"; var FileCoverage = require('istanbul-lib-coverage').classes.FileCoverage, util = require('util'); function MappedCoverage(pathOrObj) { FileCoverage.call(this, pathOrObj); this.meta = { last: { s: 0, f: 0, b: 0 }, seen: {} }; } util.inherits(MappedCoverage, FileCoverage); function locString(loc) { return [loc.start.line, loc.start.column, loc.end.line, loc.end.column].join(':'); } MappedCoverage.prototype.addStatement = function (loc, hits) { var key = 's:' + locString(loc), meta = this.meta, index = meta.seen[key]; if (index === undefined) { index = meta.last.s; meta.last.s += 1; meta.seen[key] = index; this.statementMap[index] = this.cloneLocation(loc); } this.s[index] = this.s[index] || 0; this.s[index] += hits; return index; }; MappedCoverage.prototype.addFunction = function (name, decl, loc, hits) { var key = 'f:' + locString(decl), meta = this.meta, index = meta.seen[key]; if (index === undefined) { index = meta.last.f; meta.last.f += 1; meta.seen[key] = index; name = name || '(unknown_' + index + ')'; this.fnMap[index] = { name: name, decl: this.cloneLocation(decl), loc: this.cloneLocation(loc) }; } this.f[index] = this.f[index] || 0; this.f[index] += hits; return index; }; MappedCoverage.prototype.addBranch = function (type, loc, branchLocations, hits) { var key = ['b'], meta = this.meta, that = this, index, i; branchLocations.forEach(function (l) { key.push(locString(l)); }); key = key.join(':'); index = meta.seen[key]; if (index === undefined) { index = meta.last.b; meta.last.b += 1; meta.seen[key] = index; this.branchMap[index] = { loc: loc, type: type, locations: branchLocations.map(function (l) { return that.cloneLocation(l); }) }; } if (!this.b[index]) { this.b[index] = []; branchLocations.forEach(function () { that.b[index].push(0); }); } for (i = 0; i < hits.length; i += 1) { that.b[index][i] += hits[i]; } return index; }; // returns a clone of the location object with only // the attributes of interest MappedCoverage.prototype.cloneLocation = function (loc) { return { start: { line: loc.start.line, column: loc.start.column }, end: { line: loc.end.line, column: loc.end.column } }; }; module.exports = { MappedCoverage: MappedCoverage };