'use strict'; /** * Provides a factory function for a {@link StatsCollector} object. * @module */ var constants = require('./runner').constants; var EVENT_TEST_PASS = constants.EVENT_TEST_PASS; var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL; var EVENT_SUITE_BEGIN = constants.EVENT_SUITE_BEGIN; var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN; var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING; var EVENT_RUN_END = constants.EVENT_RUN_END; var EVENT_TEST_END = constants.EVENT_TEST_END; /** * Test statistics collector. * * @public * @typedef {Object} StatsCollector * @property {number} suites - integer count of suites run. * @property {number} tests - integer count of tests run. * @property {number} passes - integer count of passing tests. * @property {number} pending - integer count of pending tests. * @property {number} failures - integer count of failed tests. * @property {Date} start - time when testing began. * @property {Date} end - time when testing concluded. * @property {number} duration - number of msecs that testing took. */ var Date = global.Date; /** * Provides stats such as test duration, number of tests passed / failed etc., by listening for events emitted by `runner`. * * @private * @param {Runner} runner - Runner instance * @throws {TypeError} If falsy `runner` */ function createStatsCollector(runner) { /** * @type StatsCollector */ var stats = { suites: 0, tests: 0, passes: 0, pending: 0, failures: 0 }; if (!runner) { throw new TypeError('Missing runner argument'); } runner.stats = stats; runner.once(EVENT_RUN_BEGIN, function() { stats.start = new Date(); }); runner.on(EVENT_SUITE_BEGIN, function(suite) { suite.root || stats.suites++; }); runner.on(EVENT_TEST_PASS, function() { stats.passes++; }); runner.on(EVENT_TEST_FAIL, function() { stats.failures++; }); runner.on(EVENT_TEST_PENDING, function() { stats.pending++; }); runner.on(EVENT_TEST_END, function() { stats.tests++; }); runner.once(EVENT_RUN_END, function() { stats.end = new Date(); stats.duration = stats.end - stats.start; }); } module.exports = createStatsCollector;