| 'use strict'; | |
| /** | |
| * @module JSONStream | |
| */ | |
| /** | |
| * Module dependencies. | |
| */ | |
| var Base = require('./base'); | |
| var constants = require('../runner').constants; | |
| var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; | |
| var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; | |
| var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; | |
| var EVENT_RUN_END = constants.EVENT_RUN_END; | |
| /** | |
| * Expose `JSONStream`. | |
| */ | |
| exports = module.exports = JSONStream; | |
| /** | |
| * Constructs a new `JSONStream` reporter instance. | |
| * | |
| * @public | |
| * @class | |
| * @memberof Mocha.reporters | |
| * @extends Mocha.reporters.Base | |
| * @param {Runner} runner - Instance triggers reporter actions. | |
| * @param {Object} [options] - runner options | |
| */ | |
| function JSONStream(runner, options) { | |
| Base.call(this, runner, options); | |
| var self = this; | |
| var total = runner.total; | |
| runner.once(EVENT_RUN_BEGIN, function() { | |
| writeEvent(['start', {total: total}]); | |
| }); | |
| runner.on(EVENT_TEST_PASS, function(test) { | |
| writeEvent(['pass', clean(test)]); | |
| }); | |
| runner.on(EVENT_TEST_FAIL, function(test, err) { | |
| test = clean(test); | |
| test.err = err.message; | |
| test.stack = err.stack || null; | |
| writeEvent(['fail', test]); | |
| }); | |
| runner.once(EVENT_RUN_END, function() { | |
| writeEvent(['end', self.stats]); | |
| }); | |
| } | |
| /** | |
| * Mocha event to be written to the output stream. | |
| * @typedef {Array} JSONStream~MochaEvent | |
| */ | |
| /** | |
| * Writes Mocha event to reporter output stream. | |
| * | |
| * @private | |
| * @param {JSONStream~MochaEvent} event - Mocha event to be output. | |
| */ | |
| function writeEvent(event) { | |
| process.stdout.write(JSON.stringify(event) + '\n'); | |
| } | |
| /** | |
| * Returns an object literal representation of `test` | |
| * free of cyclic properties, etc. | |
| * | |
| * @private | |
| * @param {Test} test - Instance used as data source. | |
| * @return {Object} object containing pared-down test instance data | |
| */ | |
| function clean(test) { | |
| return { | |
| title: test.title, | |
| fullTitle: test.fullTitle(), | |
| duration: test.duration, | |
| currentRetry: test.currentRetry() | |
| }; | |
| } | |
| JSONStream.description = 'newline delimited JSON events'; |