176 lines
5.8 KiB
JavaScript
176 lines
5.8 KiB
JavaScript
/*!
|
|
* chai
|
|
* http://chaijs.com
|
|
* Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com>
|
|
* MIT Licensed
|
|
*/
|
|
|
|
var config = require('./config');
|
|
|
|
module.exports = function (_chai, util) {
|
|
/*!
|
|
* Module dependencies.
|
|
*/
|
|
|
|
var AssertionError = _chai.AssertionError
|
|
, flag = util.flag;
|
|
|
|
/*!
|
|
* Module export.
|
|
*/
|
|
|
|
_chai.Assertion = Assertion;
|
|
|
|
/*!
|
|
* Assertion Constructor
|
|
*
|
|
* Creates object for chaining.
|
|
*
|
|
* `Assertion` objects contain metadata in the form of flags. Three flags can
|
|
* be assigned during instantiation by passing arguments to this constructor:
|
|
*
|
|
* - `object`: This flag contains the target of the assertion. For example, in
|
|
* the assertion `expect(numKittens).to.equal(7);`, the `object` flag will
|
|
* contain `numKittens` so that the `equal` assertion can reference it when
|
|
* needed.
|
|
*
|
|
* - `message`: This flag contains an optional custom error message to be
|
|
* prepended to the error message that's generated by the assertion when it
|
|
* fails.
|
|
*
|
|
* - `ssfi`: This flag stands for "start stack function indicator". It
|
|
* contains a function reference that serves as the starting point for
|
|
* removing frames from the stack trace of the error that's created by the
|
|
* assertion when it fails. The goal is to provide a cleaner stack trace to
|
|
* end users by removing Chai's internal functions. Note that it only works
|
|
* in environments that support `Error.captureStackTrace`, and only when
|
|
* `Chai.config.includeStack` hasn't been set to `false`.
|
|
*
|
|
* - `lockSsfi`: This flag controls whether or not the given `ssfi` flag
|
|
* should retain its current value, even as assertions are chained off of
|
|
* this object. This is usually set to `true` when creating a new assertion
|
|
* from within another assertion. It's also temporarily set to `true` before
|
|
* an overwritten assertion gets called by the overwriting assertion.
|
|
*
|
|
* @param {Mixed} obj target of the assertion
|
|
* @param {String} msg (optional) custom error message
|
|
* @param {Function} ssfi (optional) starting point for removing stack frames
|
|
* @param {Boolean} lockSsfi (optional) whether or not the ssfi flag is locked
|
|
* @api private
|
|
*/
|
|
|
|
function Assertion (obj, msg, ssfi, lockSsfi) {
|
|
flag(this, 'ssfi', ssfi || Assertion);
|
|
flag(this, 'lockSsfi', lockSsfi);
|
|
flag(this, 'object', obj);
|
|
flag(this, 'message', msg);
|
|
|
|
return util.proxify(this);
|
|
}
|
|
|
|
Object.defineProperty(Assertion, 'includeStack', {
|
|
get: function() {
|
|
console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.');
|
|
return config.includeStack;
|
|
},
|
|
set: function(value) {
|
|
console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.');
|
|
config.includeStack = value;
|
|
}
|
|
});
|
|
|
|
Object.defineProperty(Assertion, 'showDiff', {
|
|
get: function() {
|
|
console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.');
|
|
return config.showDiff;
|
|
},
|
|
set: function(value) {
|
|
console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.');
|
|
config.showDiff = value;
|
|
}
|
|
});
|
|
|
|
Assertion.addProperty = function (name, fn) {
|
|
util.addProperty(this.prototype, name, fn);
|
|
};
|
|
|
|
Assertion.addMethod = function (name, fn) {
|
|
util.addMethod(this.prototype, name, fn);
|
|
};
|
|
|
|
Assertion.addChainableMethod = function (name, fn, chainingBehavior) {
|
|
util.addChainableMethod(this.prototype, name, fn, chainingBehavior);
|
|
};
|
|
|
|
Assertion.overwriteProperty = function (name, fn) {
|
|
util.overwriteProperty(this.prototype, name, fn);
|
|
};
|
|
|
|
Assertion.overwriteMethod = function (name, fn) {
|
|
util.overwriteMethod(this.prototype, name, fn);
|
|
};
|
|
|
|
Assertion.overwriteChainableMethod = function (name, fn, chainingBehavior) {
|
|
util.overwriteChainableMethod(this.prototype, name, fn, chainingBehavior);
|
|
};
|
|
|
|
/**
|
|
* ### .assert(expression, message, negateMessage, expected, actual, showDiff)
|
|
*
|
|
* Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass.
|
|
*
|
|
* @name assert
|
|
* @param {Philosophical} expression to be tested
|
|
* @param {String|Function} message or function that returns message to display if expression fails
|
|
* @param {String|Function} negatedMessage or function that returns negatedMessage to display if negated expression fails
|
|
* @param {Mixed} expected value (remember to check for negation)
|
|
* @param {Mixed} actual (optional) will default to `this.obj`
|
|
* @param {Boolean} showDiff (optional) when set to `true`, assert will display a diff in addition to the message if expression fails
|
|
* @api private
|
|
*/
|
|
|
|
Assertion.prototype.assert = function (expr, msg, negateMsg, expected, _actual, showDiff) {
|
|
var ok = util.test(this, arguments);
|
|
if (false !== showDiff) showDiff = true;
|
|
if (undefined === expected && undefined === _actual) showDiff = false;
|
|
if (true !== config.showDiff) showDiff = false;
|
|
|
|
if (!ok) {
|
|
msg = util.getMessage(this, arguments);
|
|
var actual = util.getActual(this, arguments);
|
|
var assertionErrorObjectProperties = {
|
|
actual: actual
|
|
, expected: expected
|
|
, showDiff: showDiff
|
|
};
|
|
|
|
var operator = util.getOperator(this, arguments);
|
|
if (operator) {
|
|
assertionErrorObjectProperties.operator = operator;
|
|
}
|
|
|
|
throw new AssertionError(
|
|
msg,
|
|
assertionErrorObjectProperties,
|
|
(config.includeStack) ? this.assert : flag(this, 'ssfi'));
|
|
}
|
|
};
|
|
|
|
/*!
|
|
* ### ._obj
|
|
*
|
|
* Quick reference to stored `actual` value for plugin developers.
|
|
*
|
|
* @api private
|
|
*/
|
|
|
|
Object.defineProperty(Assertion.prototype, '_obj',
|
|
{ get: function () {
|
|
return flag(this, 'object');
|
|
}
|
|
, set: function (val) {
|
|
flag(this, 'object', val);
|
|
}
|
|
});
|
|
};
|