forked from jestjs/jest
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCoverageCollector.js
80 lines (65 loc) · 2.18 KB
/
CoverageCollector.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/**
* Copyright (c) 2014, Facebook, Inc. All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
'use strict';
const CoverageInstrumentor = require('cover/instrument').Instrumentor;
const fs = require('graceful-fs');
const path = require('path');
const COVERAGE_TEMPLATE_PATH = path.join(__dirname, 'coverage.template');
let _memoizedCoverageTemplate = null;
function _getCoverageTemplate() {
if (_memoizedCoverageTemplate === null) {
_memoizedCoverageTemplate = require('lodash.template')(
fs.readFileSync(COVERAGE_TEMPLATE_PATH, 'utf8')
);
}
return _memoizedCoverageTemplate;
}
class CoverageCollector {
constructor(sourceText) {
this._coverageDataStore = {};
this._instrumentedSourceText = null;
this._instrumentor = new CoverageInstrumentor();
this._origSourceText = sourceText;
}
getCoverageDataStore() {
return this._coverageDataStore;
}
getInstrumentedSource(storageVarName) {
if (this._instrumentedSourceText === null) {
this._instrumentedSourceText = _getCoverageTemplate()({
instrumented: this._instrumentor,
coverageStorageVar: storageVarName,
source: this._instrumentor.instrument(this._origSourceText),
});
}
return this._instrumentedSourceText;
}
extractRuntimeCoverageInfo() {
const instrumentationInfo = this._instrumentor.objectify();
const coverageInfo = {
coveredSpans: [],
uncoveredSpans: [],
sourceText: this._origSourceText,
};
let nodeIndex;
// Find all covered spans
for (nodeIndex in this._coverageDataStore.nodes) {
coverageInfo.coveredSpans.push(instrumentationInfo.nodes[nodeIndex].loc);
}
// Find all definitely uncovered spans
for (nodeIndex in instrumentationInfo.nodes) {
if (!this._coverageDataStore.nodes.hasOwnProperty(nodeIndex)) {
coverageInfo.uncoveredSpans.push(
instrumentationInfo.nodes[nodeIndex].loc
);
}
}
return coverageInfo;
}
}
module.exports = CoverageCollector;