| /* |
| Copyright 2012-2015, Yahoo Inc. |
| Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. |
| */ |
| 'use strict'; |
| |
| const percent = require('./percent'); |
| const dataProperties = require('./data-properties'); |
| |
| function blankSummary() { |
| const empty = () => ({ |
| total: 0, |
| covered: 0, |
| skipped: 0, |
| pct: 'Unknown' |
| }); |
| |
| return { |
| lines: empty(), |
| statements: empty(), |
| functions: empty(), |
| branches: empty(), |
| branchesTrue: empty() |
| }; |
| } |
| |
| // asserts that a data object "looks like" a summary coverage object |
| function assertValidSummary(obj) { |
| const valid = |
| obj && obj.lines && obj.statements && obj.functions && obj.branches; |
| if (!valid) { |
| throw new Error( |
| 'Invalid summary coverage object, missing keys, found:' + |
| Object.keys(obj).join(',') |
| ); |
| } |
| } |
| |
| /** |
| * CoverageSummary provides a summary of code coverage . It exposes 4 properties, |
| * `lines`, `statements`, `branches`, and `functions`. Each of these properties |
| * is an object that has 4 keys `total`, `covered`, `skipped` and `pct`. |
| * `pct` is a percentage number (0-100). |
| */ |
| class CoverageSummary { |
| /** |
| * @constructor |
| * @param {Object|CoverageSummary} [obj=undefined] an optional data object or |
| * another coverage summary to initialize this object with. |
| */ |
| constructor(obj) { |
| if (!obj) { |
| this.data = blankSummary(); |
| } else if (obj instanceof CoverageSummary) { |
| this.data = obj.data; |
| } else { |
| this.data = obj; |
| } |
| assertValidSummary(this.data); |
| } |
| |
| /** |
| * merges a second summary coverage object into this one |
| * @param {CoverageSummary} obj - another coverage summary object |
| */ |
| merge(obj) { |
| const keys = [ |
| 'lines', |
| 'statements', |
| 'branches', |
| 'functions', |
| 'branchesTrue' |
| ]; |
| keys.forEach(key => { |
| if (obj[key]) { |
| this[key].total += obj[key].total; |
| this[key].covered += obj[key].covered; |
| this[key].skipped += obj[key].skipped; |
| this[key].pct = percent(this[key].covered, this[key].total); |
| } |
| }); |
| |
| return this; |
| } |
| |
| /** |
| * returns a POJO that is JSON serializable. May be used to get the raw |
| * summary object. |
| */ |
| toJSON() { |
| return this.data; |
| } |
| |
| /** |
| * return true if summary has no lines of code |
| */ |
| isEmpty() { |
| return this.lines.total === 0; |
| } |
| } |
| |
| dataProperties(CoverageSummary, [ |
| 'lines', |
| 'statements', |
| 'functions', |
| 'branches', |
| 'branchesTrue' |
| ]); |
| |
| module.exports = { |
| CoverageSummary |
| }; |