'use strict'; var Runnable = require('./runnable'); const {inherits, constants} = require('./utils'); const {MOCHA_ID_PROP_NAME} = constants; /** * Expose `Hook`. */ module.exports = Hook; /** * Initialize a new `Hook` with the given `title` and callback `fn` * * @class * @extends Runnable * @param {String} title * @param {Function} fn */ function Hook(title, fn) { Runnable.call(this, title, fn); this.type = 'hook'; } /** * Inherit from `Runnable.prototype`. */ inherits(Hook, Runnable); /** * Resets the state for a next run. */ Hook.prototype.reset = function () { Runnable.prototype.reset.call(this); delete this._error; }; /** * Get or set the test `err`. * * @memberof Hook * @public * @param {Error} err * @return {Error} */ Hook.prototype.error = function (err) { if (!arguments.length) { err = this._error; this._error = null; return err; } this._error = err; }; /** * Returns an object suitable for IPC. * Functions are represented by keys beginning with `$$`. * @private * @returns {Object} */ Hook.prototype.serialize = function serialize() { return { $$currentRetry: this.currentRetry(), $$fullTitle: this.fullTitle(), $$isPending: Boolean(this.isPending()), $$titlePath: this.titlePath(), ctx: this.ctx && this.ctx.currentTest ? { currentTest: { title: this.ctx.currentTest.title, [MOCHA_ID_PROP_NAME]: this.ctx.currentTest.id } } : {}, duration: this.duration, file: this.file, parent: { $$fullTitle: this.parent.fullTitle(), [MOCHA_ID_PROP_NAME]: this.parent.id }, state: this.state, title: this.title, type: this.type, [MOCHA_ID_PROP_NAME]: this.id }; };