|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- /*
- 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()
- };
- }
-
- // 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'];
- keys.forEach(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'
- ]);
-
- module.exports = {
- CoverageSummary
- };
|