"use strict"; exports.expectReceive = function(properties, configuration, factory) { var message; factory.root(properties, configuration, factory); message = this.message; if (properties.hasOwnProperty('expected')) message += ' Expected ' + properties.expected + '.'; if (properties.hasOwnProperty('received')) message += ' Received: ' + properties.received + '.'; this.message = message; }; exports.root = function(properties, configuration, factories) { var _this = this; var code; var config = { stackLength: Error.stackTraceLimit, rootOnly: true }; var messageStr = ''; var originalStackLength = Error.stackTraceLimit; var stack; function updateStack() { stack[0] = _this.toString(); _this.stack = stack.join('\n'); } // get configuration options if (!configuration || typeof configuration !== 'object') configuration = {}; if (configuration.hasOwnProperty('stackLength') && typeof configuration.stackLength === 'number' && !isNaN(configuration.stackLength) && configuration.stackLength >= 0) config.stackLength = configuration.stackLength; if (!configuration.hasOwnProperty('rootOnly')) config.rootOnly = configuration.rootOnly; // check if this should only be run as root if (!config.rootOnly || this.CustomError.parent === Error) { // copy properties onto this object Object.keys(properties).forEach(function(key) { switch(key) { case 'code': code = properties.code || void 0; break; case 'message': messageStr = properties.message || ''; break; default: _this[key] = properties[key]; } }); // generate the stack trace Error.stackTraceLimit = config.stackLength + 2; stack = (new Error()).stack.split('\n'); stack.splice(0, 3); stack.unshift(''); Error.stackTraceLimit = originalStackLength; this.stack = stack.join('\n'); Object.defineProperty(this, 'code', { configurable: true, enumerable: true, get: function() { return code; }, set: function(value) { code = value; updateStack(); } }); Object.defineProperty(this, 'message', { configurable: true, enumerable: true, get: function() { return messageStr; }, set: function(value) { messageStr = value; updateStack(); } }); updateStack(); } };