1 | 'use strict';
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | var Base = require('./base');
|
10 | var constants = require('../runner').constants;
|
11 | var EVENT_TEST_PASS = constants.EVENT_TEST_PASS;
|
12 | var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL;
|
13 | var EVENT_TEST_END = constants.EVENT_TEST_END;
|
14 | var EVENT_RUN_END = constants.EVENT_RUN_END;
|
15 | var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING;
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 | exports = module.exports = JSONReporter;
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 | function JSONReporter(runner, options) {
|
34 | Base.call(this, runner, options);
|
35 |
|
36 | var self = this;
|
37 | var tests = [];
|
38 | var pending = [];
|
39 | var failures = [];
|
40 | var passes = [];
|
41 |
|
42 | runner.on(EVENT_TEST_END, function(test) {
|
43 | tests.push(test);
|
44 | });
|
45 |
|
46 | runner.on(EVENT_TEST_PASS, function(test) {
|
47 | passes.push(test);
|
48 | });
|
49 |
|
50 | runner.on(EVENT_TEST_FAIL, function(test) {
|
51 | failures.push(test);
|
52 | });
|
53 |
|
54 | runner.on(EVENT_TEST_PENDING, function(test) {
|
55 | pending.push(test);
|
56 | });
|
57 |
|
58 | runner.once(EVENT_RUN_END, function() {
|
59 | var obj = {
|
60 | stats: self.stats,
|
61 | tests: tests.map(clean),
|
62 | pending: pending.map(clean),
|
63 | failures: failures.map(clean),
|
64 | passes: passes.map(clean)
|
65 | };
|
66 |
|
67 | runner.testResults = obj;
|
68 |
|
69 | process.stdout.write(JSON.stringify(obj, null, 2));
|
70 | });
|
71 | }
|
72 |
|
73 |
|
74 |
|
75 |
|
76 |
|
77 |
|
78 |
|
79 |
|
80 |
|
81 | function clean(test) {
|
82 | var err = test.err || {};
|
83 | if (err instanceof Error) {
|
84 | err = errorJSON(err);
|
85 | }
|
86 |
|
87 | return {
|
88 | title: test.title,
|
89 | fullTitle: test.fullTitle(),
|
90 | file: test.file,
|
91 | duration: test.duration,
|
92 | currentRetry: test.currentRetry(),
|
93 | speed: test.speed,
|
94 | err: cleanCycles(err)
|
95 | };
|
96 | }
|
97 |
|
98 |
|
99 |
|
100 |
|
101 |
|
102 |
|
103 |
|
104 |
|
105 | function cleanCycles(obj) {
|
106 | var cache = [];
|
107 | return JSON.parse(
|
108 | JSON.stringify(obj, function(key, value) {
|
109 | if (typeof value === 'object' && value !== null) {
|
110 | if (cache.indexOf(value) !== -1) {
|
111 |
|
112 | return '' + value;
|
113 | }
|
114 | cache.push(value);
|
115 | }
|
116 |
|
117 | return value;
|
118 | })
|
119 | );
|
120 | }
|
121 |
|
122 |
|
123 |
|
124 |
|
125 |
|
126 |
|
127 |
|
128 |
|
129 | function errorJSON(err) {
|
130 | var res = {};
|
131 | Object.getOwnPropertyNames(err).forEach(function(key) {
|
132 | res[key] = err[key];
|
133 | }, err);
|
134 | return res;
|
135 | }
|
136 |
|
137 | JSONReporter.description = 'single JSON object';
|