Skip to content

Commit b2ca904

Browse files
committed
Add coverage report in xml format.
1 parent fbf7f69 commit b2ca904

File tree

2 files changed

+86
-0
lines changed

2 files changed

+86
-0
lines changed

bin/vows

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ var help = [
5959
" --cover-plain Print plain coverage map if detected",
6060
" --cover-html Write coverage map to \"coverage.html\"",
6161
" --cover-json Write unified coverage map to \"coverage.json\"",
62+
" --cover-xml Write coverage map to \"coverage.xml\" in Emma xml",
6263
" --no-color Don't use terminal colors",
6364
" --version Show version",
6465
" -h, --help You're staring at it"
@@ -134,6 +135,10 @@ while (arg = argv.shift()) {
134135
options.coverage = true;
135136
_coverage = require('../lib/vows/coverage/report-json');
136137
break;
138+
case 'cover-xml':
139+
options.coverage = true;
140+
_coverage = require('../lib/vows/coverage/report-xml');
141+
break;
137142
case 'verbose':
138143
case 'v':
139144
options.verbose = true;

lib/vows/coverage/report-xml.js

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
var util = require('util'),
2+
file = require('./file');
3+
4+
this.name = 'coverage-report-xml';
5+
6+
this.report = function (coverageMap) {
7+
var all = {
8+
xml: '',
9+
packages: 0,
10+
files: 0,
11+
lines: 0,
12+
hits: 0
13+
},
14+
data = {};
15+
16+
// group data by path
17+
for (var filename in coverageMap) {
18+
if (coverageMap.hasOwnProperty(filename)) {
19+
var pkg = (filename.indexOf('/') > 0)
20+
? filename.substr(0, filename.lastIndexOf('/'))
21+
: filename;
22+
if (!data[pkg]) {
23+
data[pkg] = {};
24+
}
25+
data[pkg][ (filename.indexOf('/'))
26+
? filename.substr(filename.lastIndexOf('/') + 1, filename.length)
27+
: filename ]
28+
= file.coverage(filename, coverageMap[filename]);
29+
}
30+
}
31+
32+
// generate groups xml-fragment
33+
for (var pkg in data) {
34+
if (data.hasOwnProperty(pkg)) {
35+
var pkgStat = {
36+
xml: '',
37+
files: 0,
38+
lines: 0,
39+
hits: 0
40+
};
41+
42+
all.xml += '\t<package name="' + pkg + '">\n';
43+
44+
for (var filename in data[pkg]) {
45+
if (data[pkg].hasOwnProperty(filename)) {
46+
pkgStat.files += 1;
47+
pkgStat.lines += data[pkg][filename].sloc;
48+
pkgStat.hits += data[pkg][filename].hits;
49+
50+
pkgStat.xml += '\t\t<srcfile name="' + filename + '">\n'
51+
+ '\t\t\t<coverage type="line, %" value="' + data[pkg][filename].coverage.toFixed(2) + '% (' + data[pkg][filename].hits + '/' + data[pkg][filename].sloc + ')"/>\n'
52+
+ '\t\t</srcfile>\n';
53+
}
54+
}
55+
56+
all.packages += 1;
57+
all.files += pkgStat.files;
58+
all.lines += pkgStat.lines;
59+
all.hits += pkgStat.hits;
60+
61+
all.xml += '\t\t<coverage type="line, %" value="' + ((pkgStat.hits * 100) / pkgStat.lines).toFixed(2) + '% (' + pkgStat.hits + '/' + pkgStat.lines + ')"/>\n'
62+
+ pkgStat.xml
63+
+ '\t</package>\n';
64+
}
65+
}
66+
67+
all.xml = '<?xml version="1.0" encoding="UTF-8"?>\n'
68+
+ '<report>\n<stats>\n'
69+
+ '\t<packages value="' + all.packages + '"/>\n'
70+
+ '\t<classes value="0"/>\n'
71+
+ '\t<methods value="0"/>\n'
72+
+ '\t<srcfiles value="' + all.files + '"/>\n'
73+
+ '\t<srclines value="' + all.lines + '"/>\n'
74+
+ '</stats>\n<data>\n'
75+
+ '<all name="all classes">\n'
76+
+ '\t<coverage type="line, %" value="' + ((all.hits * 100) / all.lines).toFixed(2) + '% (' + all.hits + '/' + all.lines + ')"/>\n'
77+
+ all.xml
78+
+ '</all>\n</data>\n</report>\n';
79+
80+
util.print(all.xml);
81+
};

0 commit comments

Comments
 (0)