-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcoverage.js
More file actions
101 lines (80 loc) · 3.46 KB
/
coverage.js
File metadata and controls
101 lines (80 loc) · 3.46 KB
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
const convert = require('xml-js');
const fs = require('fs');
const process = require('process');
const { retrieveDetailedFilesElements, retrieveDetailedPackagesElements, retrieveGlobalMetricsElement, retrieveMetricsElement } = require('./xml');
const compareDetailedCoverages = (oldCoverages, newCoverages) => {
const out = {
degraded: [],
improved: []
};
for (const resourceName of Object.keys(oldCoverages)) {
if (
typeof newCoverages[resourceName] === 'undefined' ||
oldCoverages[resourceName].coverage === null ||
newCoverages[resourceName].coverage === oldCoverages[resourceName].coverage
) {
continue;
}
const oldCoverage = Number(oldCoverages[resourceName].coverage).valueOf();
const newCoverage = Number(newCoverages[resourceName].coverage).valueOf();
out[newCoverage < oldCoverage ? 'degraded' : 'improved'].push(
{
resourceName,
old: `${oldCoverages[resourceName].covered} / ${oldCoverages[resourceName].total} (${oldCoverages[resourceName].coverage}%)`,
new: `${newCoverages[resourceName].covered} / ${newCoverages[resourceName].total} (${newCoverages[resourceName].coverage}%)`
});
}
return out.degraded.length === 0 && out.improved.length === 0 ? null : out;
}
const extractCoverageFromPackageElement = (packageElement) => {
const packageFiles = retrieveDetailedFilesElements(packageElement);
const out = packageFiles.reduce((previous, current) => {
const currentCoverage = extractCoverageFromMetricsElement(retrieveMetricsElement(current));
return {
total: previous.total + currentCoverage.total,
covered: previous.covered + currentCoverage.covered
};
}, {
total: 0,
covered: 0
});
out.coverage = out.total > 0 ? parseFloat((100 * out.covered / out.total).toFixed(3)) : 100;
return out;
}
const extractCoverageFromMetricsElement = (metrics) => {
const total = parseInt(metrics.attributes.elements, 10);
const covered = parseInt(metrics.attributes.coveredelements, 10);
const coverage = total > 0 ? parseFloat((100 * covered / total).toFixed(3)) : 100;
return { total, covered, coverage };
}
const extractDetailPackageCoverages = (json, elements) => {
const out = {};
for (const element of elements) {
out[element.attributes.name] = extractCoverageFromPackageElement(element);
}
return out;
}
const extractDetailedCoverages = (json, elements) => {
const out = {};
for (const element of elements) {
out[element.attributes.name] = extractCoverageFromMetricsElement(retrieveMetricsElement(element));
}
return out;
}
const parseCoverage = (filename, type) => {
const options = { ignoreComment: true, alwaysChildren: true };
const json = convert.xml2js(fs.readFileSync(filename, { encoding: 'utf8' }), options);
switch (type) {
case 'overall':
return {
overall: extractCoverageFromMetricsElement(retrieveGlobalMetricsElement(json))
};
case 'files':
return extractDetailedCoverages(json, retrieveDetailedFilesElements(json));
case 'packages':
return extractDetailPackageCoverages(json, retrieveDetailedPackagesElements(json));
}
console.error('Unknown type ' + type);
process.exit(-1);
}
module.exports = { compareDetailedCoverages, parseCoverage };