source: Dev/trunk/node_modules/mocha/lib/reporters/json-cov.js

Last change on this file was 484, checked in by hendrikvanantwerpen, 11 years ago

Commit node_modules, to make checkouts and builds more deterministic.

File size: 2.7 KB
Line 
1
2/**
3 * Module dependencies.
4 */
5
6var Base = require('./base');
7
8/**
9 * Expose `JSONCov`.
10 */
11
12exports = module.exports = JSONCov;
13
14/**
15 * Initialize a new `JsCoverage` reporter.
16 *
17 * @param {Runner} runner
18 * @param {Boolean} output
19 * @api public
20 */
21
22function JSONCov(runner, output) {
23  var self = this
24    , output = 1 == arguments.length ? true : output;
25
26  Base.call(this, runner);
27
28  var tests = []
29    , failures = []
30    , passes = [];
31
32  runner.on('test end', function(test){
33    tests.push(test);
34  });
35
36  runner.on('pass', function(test){
37    passes.push(test);
38  });
39
40  runner.on('fail', function(test){
41    failures.push(test);
42  });
43
44  runner.on('end', function(){
45    var cov = global._$jscoverage || {};
46    var result = self.cov = map(cov);
47    result.stats = self.stats;
48    result.tests = tests.map(clean);
49    result.failures = failures.map(clean);
50    result.passes = passes.map(clean);
51    if (!output) return;
52    process.stdout.write(JSON.stringify(result, null, 2 ));
53  });
54}
55
56/**
57 * Map jscoverage data to a JSON structure
58 * suitable for reporting.
59 *
60 * @param {Object} cov
61 * @return {Object}
62 * @api private
63 */
64
65function map(cov) {
66  var ret = {
67      instrumentation: 'node-jscoverage'
68    , sloc: 0
69    , hits: 0
70    , misses: 0
71    , coverage: 0
72    , files: []
73  };
74
75  for (var filename in cov) {
76    var data = coverage(filename, cov[filename]);
77    ret.files.push(data);
78    ret.hits += data.hits;
79    ret.misses += data.misses;
80    ret.sloc += data.sloc;
81  }
82
83  ret.files.sort(function(a, b) {
84    return a.filename.localeCompare(b.filename);
85  });
86
87  if (ret.sloc > 0) {
88    ret.coverage = (ret.hits / ret.sloc) * 100;
89  }
90
91  return ret;
92};
93
94/**
95 * Map jscoverage data for a single source file
96 * to a JSON structure suitable for reporting.
97 *
98 * @param {String} filename name of the source file
99 * @param {Object} data jscoverage coverage data
100 * @return {Object}
101 * @api private
102 */
103
104function coverage(filename, data) {
105  var ret = {
106    filename: filename,
107    coverage: 0,
108    hits: 0,
109    misses: 0,
110    sloc: 0,
111    source: {}
112  };
113
114  data.source.forEach(function(line, num){
115    num++;
116
117    if (data[num] === 0) {
118      ret.misses++;
119      ret.sloc++;
120    } else if (data[num] !== undefined) {
121      ret.hits++;
122      ret.sloc++;
123    }
124
125    ret.source[num] = {
126        source: line
127      , coverage: data[num] === undefined
128        ? ''
129        : data[num]
130    };
131  });
132
133  ret.coverage = ret.hits / ret.sloc * 100;
134
135  return ret;
136}
137
138/**
139 * Return a plain-object representation of `test`
140 * free of cyclic properties etc.
141 *
142 * @param {Object} test
143 * @return {Object}
144 * @api private
145 */
146
147function clean(test) {
148  return {
149      title: test.title
150    , fullTitle: test.fullTitle()
151    , duration: test.duration
152  }
153}
Note: See TracBrowser for help on using the repository browser.