'use strict'; var Runnable = require('./runnable'); var utils = require('./utils'); var errors = require('./errors'); var createInvalidArgumentTypeError = errors.createInvalidArgumentTypeError; var isString = utils.isString; const {MOCHA_ID_PROP_NAME} = utils.constants; module.exports = Test; /** * Initialize a new `Test` with the given `title` and callback `fn`. * * @public * @class * @extends Runnable * @param {String} title - Test title (required) * @param {Function} [fn] - Test callback. If omitted, the Test is considered "pending" */ function Test(title, fn) { if (!isString(title)) { throw createInvalidArgumentTypeError( 'Test argument "title" should be a string. Received type "' + typeof title + '"', 'title', 'string' ); } this.type = 'test'; Runnable.call(this, title, fn); this.reset(); } /** * Inherit from `Runnable.prototype`. */ utils.inherits(Test, Runnable); /** * Resets the state initially or for a next run. */ Test.prototype.reset = function () { Runnable.prototype.reset.call(this); this.pending = !this.fn; delete this.state; }; /** * Set or get retried test * * @private */ Test.prototype.retriedTest = function (n) { if (!arguments.length) { return this._retriedTest; } this._retriedTest = n; }; /** * Add test to the list of tests marked `only`. * * @private */ Test.prototype.markOnly = function () { this.parent.appendOnlyTest(this); }; Test.prototype.clone = function () { var test = new Test(this.title, this.fn); test.timeout(this.timeout()); test.slow(this.slow()); test.retries(this.retries()); test.currentRetry(this.currentRetry()); test.retriedTest(this.retriedTest() || this); test.globals(this.globals()); test.parent = this.parent; test.file = this.file; test.ctx = this.ctx; return test; }; /** * Returns an minimal object suitable for transmission over IPC. * Functions are represented by keys beginning with `$$`. * @private * @returns {Object} */ Test.prototype.serialize = function serialize() { return { $$currentRetry: this._currentRetry, $$fullTitle: this.fullTitle(), $$isPending: Boolean(this.pending), $$retriedTest: this._retriedTest || null, $$slow: this._slow, $$titlePath: this.titlePath(), body: this.body, duration: this.duration, err: this.err, parent: { $$fullTitle: this.parent.fullTitle(), [MOCHA_ID_PROP_NAME]: this.parent.id }, speed: this.speed, state: this.state, title: this.title, type: this.type, file: this.file, [MOCHA_ID_PROP_NAME]: this.id }; };