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.
112 lines
2.7 KiB
112 lines
2.7 KiB
/* |
|
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 |
|
};
|
|
|