From 71b2512a9919a1490cdbb80e6d4c924399a283fe Mon Sep 17 00:00:00 2001 From: Keith Cirkel Date: Wed, 21 Oct 2015 11:49:38 +0100 Subject: [PATCH] chai@3.4.0 --- chai.js | 217 ++++++++++++++++++++++++++++++++++++++++++--------- lib/chai.js | 2 +- package.json | 2 +- 3 files changed, 180 insertions(+), 41 deletions(-) diff --git a/chai.js b/chai.js index 66990f494..898cb72e0 100644 --- a/chai.js +++ b/chai.js @@ -15,7 +15,7 @@ var used = [] * Chai version */ -exports.version = '3.3.0'; +exports.version = '3.4.0'; /*! * Assertion Error @@ -96,7 +96,7 @@ exports.use(should); var assert = require('./chai/interface/assert'); exports.use(assert); -},{"./chai/assertion":3,"./chai/config":4,"./chai/core/assertions":5,"./chai/interface/assert":6,"./chai/interface/expect":7,"./chai/interface/should":8,"./chai/utils":21,"assertion-error":29}],3:[function(require,module,exports){ +},{"./chai/assertion":3,"./chai/config":4,"./chai/core/assertions":5,"./chai/interface/assert":6,"./chai/interface/expect":7,"./chai/interface/should":8,"./chai/utils":22,"assertion-error":30}],3:[function(require,module,exports){ /*! * chai * http://chaijs.com @@ -425,6 +425,7 @@ module.exports = function (chai, _) { * expect({ foo: 'bar' }).to.be.an('object'); * expect(null).to.be.a('null'); * expect(undefined).to.be.an('undefined'); + * expect(new Error).to.be.an('error'); * expect(new Promise).to.be.a('promise'); * expect(new Float32Array()).to.be.a('float32array'); * expect(Symbol()).to.be.a('symbol'); @@ -484,9 +485,12 @@ module.exports = function (chai, _) { } function include (val, msg) { + _.expectTypes(this, ['array', 'object', 'string']); + if (msg) flag(this, 'message', msg); var obj = flag(this, 'object'); var expected = false; + if (_.type(obj) === 'array' && _.type(val) === 'object') { for (var i in obj) { if (_.eql(obj[i], val)) { @@ -681,8 +685,17 @@ module.exports = function (chai, _) { */ Assertion.addProperty('empty', function () { + var obj = flag(this, 'object') + , expected = obj; + + if (Array.isArray(obj) || 'string' === typeof object) { + expected = obj.length; + } else if (typeof obj === 'object') { + expected = Object.keys(obj).length; + } + this.assert( - Object.keys(Object(flag(this, 'object'))).length === 0 + !expected , 'expected #{this} to be empty' , 'expected #{this} not to be empty' ); @@ -1532,9 +1545,9 @@ module.exports = function (chai, _) { constructor = null; errMsg = null; } else if (typeof constructor === 'function') { - name = constructor.prototype.name || constructor.name; - if (name === 'Error' && constructor !== Error) { - name = (new constructor()).name; + name = constructor.prototype.name; + if (!name || (name === 'Error' && constructor !== Error)) { + name = constructor.name || (new constructor()).name; } } else { constructor = null; @@ -1730,19 +1743,20 @@ module.exports = function (chai, _) { * expect(1.5).to.be.closeTo(1, 0.5); * * @name closeTo + * @alias approximately * @param {Number} expected * @param {Number} delta * @param {String} message _optional_ * @api public */ - Assertion.addMethod('closeTo', function (expected, delta, msg) { + function closeTo(expected, delta, msg) { if (msg) flag(this, 'message', msg); var obj = flag(this, 'object'); new Assertion(obj, msg).is.a('number'); if (_.type(expected) !== 'number' || _.type(delta) !== 'number') { - throw new Error('the arguments to closeTo must be numbers'); + throw new Error('the arguments to closeTo or approximately must be numbers'); } this.assert( @@ -1750,7 +1764,10 @@ module.exports = function (chai, _) { , 'expected #{this} to be close to ' + expected + ' +/- ' + delta , 'expected #{this} not to be close to ' + expected + ' +/- ' + delta ); - }); + } + + Assertion.addMethod('closeTo', closeTo); + Assertion.addMethod('approximately', closeTo); function isSubsetOf(subset, superset, cmp) { return subset.every(function(elem) { @@ -1812,6 +1829,44 @@ module.exports = function (chai, _) { ); }); + /** + * ### .oneOf(list) + * + * Assert that a value appears somewhere in the top level of array `list`. + * + * expect('a').to.be.oneOf(['a', 'b', 'c']); + * expect(9).to.not.be.oneOf(['z']); + * expect([3]).to.not.be.oneOf([1, 2, [3]]); + * + * var three = [3]; + * // for object-types, contents are not compared + * expect(three).to.not.be.oneOf([1, 2, [3]]); + * // comparing references works + * expect(three).to.be.oneOf([1, 2, three]); + * + * @name oneOf + * @param {Array<*>} list + * @param {String} message _optional_ + * @api public + */ + + function oneOf (list, msg) { + if (msg) flag(this, 'message', msg); + var expected = flag(this, 'object'); + new Assertion(list).to.be.an('array'); + + this.assert( + list.indexOf(expected) > -1 + , 'expected #{this} to be one of #{exp}' + , 'expected #{this} to not be one of #{exp}' + , list + , expected + ); + } + + Assertion.addMethod('oneOf', oneOf); + + /** * ### .change(function) * @@ -3072,7 +3127,7 @@ module.exports = function (chai, util) { * Asserts that `object` has a `length` property with the expected value. * * assert.lengthOf([1,2,3], 3, 'array has length of 3'); - * assert.lengthOf('foobar', 5, 'string has length of 6'); + * assert.lengthOf('foobar', 6, 'string has length of 6'); * * @name lengthOf * @param {Mixed} object @@ -3218,6 +3273,25 @@ module.exports = function (chai, util) { new Assertion(act, msg).to.be.closeTo(exp, delta); }; + /** + * ### .approximately(actual, expected, delta, [message]) + * + * Asserts that the target is equal `expected`, to within a +/- `delta` range. + * + * assert.approximately(1.5, 1, 0.5, 'numbers are close'); + * + * @name approximately + * @param {Number} actual + * @param {Number} expected + * @param {Number} delta + * @param {String} message + * @api public + */ + + assert.approximately = function (act, exp, delta, msg) { + new Assertion(act, msg).to.be.approximately(exp, delta); + }; + /** * ### .sameMembers(set1, set2, [message]) * @@ -3275,6 +3349,24 @@ module.exports = function (chai, util) { new Assertion(superset, msg).to.include.members(subset); } + /** + * ### .oneOf(inList, list, [message]) + * + * Asserts that non-object, non-array value `inList` appears in the flat array `list`. + * + * assert.oneOf(1, [ 2, 1 ], 'Not found in list'); + * + * @name oneOf + * @param {*} inList + * @param {Array<*>} list + * @param {String} message + * @api public + */ + + assert.oneOf = function (inList, list, msg) { + new Assertion(inList, msg).to.be.oneOf(list); + } + /** * ### .changes(function, object, property) * @@ -3811,7 +3903,7 @@ module.exports = function (ctx, name, method, chainingBehavior) { }); }; -},{"../config":4,"./flag":12,"./transferFlags":28}],10:[function(require,module,exports){ +},{"../config":4,"./flag":13,"./transferFlags":29}],10:[function(require,module,exports){ /*! * Chai - addMethod utility * Copyright(c) 2012-2014 Jake Luer @@ -3856,7 +3948,7 @@ module.exports = function (ctx, name, method) { }; }; -},{"../config":4,"./flag":12}],11:[function(require,module,exports){ +},{"../config":4,"./flag":13}],11:[function(require,module,exports){ /*! * Chai - addProperty utility * Copyright(c) 2012-2014 Jake Luer @@ -3905,7 +3997,50 @@ module.exports = function (ctx, name, getter) { }); }; -},{"../config":4,"./flag":12}],12:[function(require,module,exports){ +},{"../config":4,"./flag":13}],12:[function(require,module,exports){ +/*! + * Chai - expectTypes utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + +/** + * ### expectTypes(obj, types) + * + * Ensures that the object being tested against is of a valid type. + * + * utils.expectTypes(this, ['array', 'object', 'string']); + * + * @param {Mixed} obj constructed Assertion + * @param {Array} type A list of allowed types for this assertion + * @name expectTypes + * @api public + */ + +var AssertionError = require('assertion-error'); +var flag = require('./flag'); +var type = require('type-detect'); + +module.exports = function (obj, types) { + var obj = flag(obj, 'object'); + types = types.map(function (t) { return t.toLowerCase(); }); + types.sort(); + + // Transforms ['lorem', 'ipsum'] into 'a lirum, or an ipsum' + var str = types.map(function (t, index) { + var art = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(t.charAt(0)) ? 'an' : 'a'; + var or = types.length > 1 && index === types.length - 1 ? 'or ' : ''; + return or + art + ' ' + t; + }).join(', '); + + if (!types.some(function (expected) { return type(obj) === expected; })) { + throw new AssertionError( + 'object tested must be ' + str + ', but ' + type(obj) + ' given' + ); + } +}; + +},{"./flag":13,"assertion-error":30,"type-detect":35}],13:[function(require,module,exports){ /*! * Chai - flag utility * Copyright(c) 2012-2014 Jake Luer @@ -3939,7 +4074,7 @@ module.exports = function (obj, key, value) { } }; -},{}],13:[function(require,module,exports){ +},{}],14:[function(require,module,exports){ /*! * Chai - getActual utility * Copyright(c) 2012-2014 Jake Luer @@ -3959,7 +4094,7 @@ module.exports = function (obj, args) { return args.length > 4 ? args[4] : obj._obj; }; -},{}],14:[function(require,module,exports){ +},{}],15:[function(require,module,exports){ /*! * Chai - getEnumerableProperties utility * Copyright(c) 2012-2014 Jake Luer @@ -3986,7 +4121,7 @@ module.exports = function getEnumerableProperties(object) { return result; }; -},{}],15:[function(require,module,exports){ +},{}],16:[function(require,module,exports){ /*! * Chai - message composition utility * Copyright(c) 2012-2014 Jake Luer @@ -4038,7 +4173,7 @@ module.exports = function (obj, args) { return flagMsg ? flagMsg + ': ' + msg : msg; }; -},{"./flag":12,"./getActual":13,"./inspect":22,"./objDisplay":23}],16:[function(require,module,exports){ +},{"./flag":13,"./getActual":14,"./inspect":23,"./objDisplay":24}],17:[function(require,module,exports){ /*! * Chai - getName utility * Copyright(c) 2012-2014 Jake Luer @@ -4060,7 +4195,7 @@ module.exports = function (func) { return match && match[1] ? match[1] : ""; }; -},{}],17:[function(require,module,exports){ +},{}],18:[function(require,module,exports){ /*! * Chai - getPathInfo utility * Copyright(c) 2012-2014 Jake Luer @@ -4172,7 +4307,7 @@ function _getPathValue (parsed, obj, index) { return res; } -},{"./hasProperty":20}],18:[function(require,module,exports){ +},{"./hasProperty":21}],19:[function(require,module,exports){ /*! * Chai - getPathValue utility * Copyright(c) 2012-2014 Jake Luer @@ -4216,7 +4351,7 @@ module.exports = function(path, obj) { return info.value; }; -},{"./getPathInfo":17}],19:[function(require,module,exports){ +},{"./getPathInfo":18}],20:[function(require,module,exports){ /*! * Chai - getProperties utility * Copyright(c) 2012-2014 Jake Luer @@ -4253,7 +4388,7 @@ module.exports = function getProperties(object) { return result; }; -},{}],20:[function(require,module,exports){ +},{}],21:[function(require,module,exports){ /*! * Chai - hasProperty utility * Copyright(c) 2012-2014 Jake Luer @@ -4318,7 +4453,7 @@ module.exports = function hasProperty(name, obj) { return name in obj; }; -},{"type-detect":34}],21:[function(require,module,exports){ +},{"type-detect":35}],22:[function(require,module,exports){ /*! * chai * Copyright(c) 2011 Jake Luer @@ -4343,6 +4478,11 @@ exports.test = require('./test'); exports.type = require('type-detect'); +/*! + * expectTypes utility + */ +exports.expectTypes = require('./expectTypes'); + /*! * message utility */ @@ -4445,8 +4585,7 @@ exports.addChainableMethod = require('./addChainableMethod'); exports.overwriteChainableMethod = require('./overwriteChainableMethod'); - -},{"./addChainableMethod":9,"./addMethod":10,"./addProperty":11,"./flag":12,"./getActual":13,"./getMessage":15,"./getName":16,"./getPathInfo":17,"./getPathValue":18,"./hasProperty":20,"./inspect":22,"./objDisplay":23,"./overwriteChainableMethod":24,"./overwriteMethod":25,"./overwriteProperty":26,"./test":27,"./transferFlags":28,"deep-eql":30,"type-detect":34}],22:[function(require,module,exports){ +},{"./addChainableMethod":9,"./addMethod":10,"./addProperty":11,"./expectTypes":12,"./flag":13,"./getActual":14,"./getMessage":16,"./getName":17,"./getPathInfo":18,"./getPathValue":19,"./hasProperty":21,"./inspect":23,"./objDisplay":24,"./overwriteChainableMethod":25,"./overwriteMethod":26,"./overwriteProperty":27,"./test":28,"./transferFlags":29,"deep-eql":31,"type-detect":35}],23:[function(require,module,exports){ // This is (almost) directly from Node.js utils // https://github.com/joyent/node/blob/f8c335d0caf47f16d31413f89aa28eda3878e3aa/lib/util.js @@ -4781,7 +4920,7 @@ function objectToString(o) { return Object.prototype.toString.call(o); } -},{"./getEnumerableProperties":14,"./getName":16,"./getProperties":19}],23:[function(require,module,exports){ +},{"./getEnumerableProperties":15,"./getName":17,"./getProperties":20}],24:[function(require,module,exports){ /*! * Chai - flag utility * Copyright(c) 2012-2014 Jake Luer @@ -4832,7 +4971,7 @@ module.exports = function (obj) { } }; -},{"../config":4,"./inspect":22}],24:[function(require,module,exports){ +},{"../config":4,"./inspect":23}],25:[function(require,module,exports){ /*! * Chai - overwriteChainableMethod utility * Copyright(c) 2012-2014 Jake Luer @@ -4887,7 +5026,7 @@ module.exports = function (ctx, name, method, chainingBehavior) { }; }; -},{}],25:[function(require,module,exports){ +},{}],26:[function(require,module,exports){ /*! * Chai - overwriteMethod utility * Copyright(c) 2012-2014 Jake Luer @@ -4940,7 +5079,7 @@ module.exports = function (ctx, name, method) { } }; -},{}],26:[function(require,module,exports){ +},{}],27:[function(require,module,exports){ /*! * Chai - overwriteProperty utility * Copyright(c) 2012-2014 Jake Luer @@ -4996,7 +5135,7 @@ module.exports = function (ctx, name, getter) { }); }; -},{}],27:[function(require,module,exports){ +},{}],28:[function(require,module,exports){ /*! * Chai - test utility * Copyright(c) 2012-2014 Jake Luer @@ -5024,7 +5163,7 @@ module.exports = function (obj, args) { return negate ? !expr : expr; }; -},{"./flag":12}],28:[function(require,module,exports){ +},{"./flag":13}],29:[function(require,module,exports){ /*! * Chai - transferFlags utility * Copyright(c) 2012-2014 Jake Luer @@ -5070,7 +5209,7 @@ module.exports = function (assertion, object, includeAll) { } }; -},{}],29:[function(require,module,exports){ +},{}],30:[function(require,module,exports){ /*! * assertion-error * Copyright(c) 2013 Jake Luer @@ -5184,10 +5323,10 @@ AssertionError.prototype.toJSON = function (stack) { return props; }; -},{}],30:[function(require,module,exports){ +},{}],31:[function(require,module,exports){ module.exports = require('./lib/eql'); -},{"./lib/eql":31}],31:[function(require,module,exports){ +},{"./lib/eql":32}],32:[function(require,module,exports){ /*! * deep-eql * Copyright(c) 2013 Jake Luer @@ -5446,10 +5585,10 @@ function objectEqual(a, b, m) { return true; } -},{"buffer":undefined,"type-detect":32}],32:[function(require,module,exports){ +},{"buffer":undefined,"type-detect":33}],33:[function(require,module,exports){ module.exports = require('./lib/type'); -},{"./lib/type":33}],33:[function(require,module,exports){ +},{"./lib/type":34}],34:[function(require,module,exports){ /*! * type-detect * Copyright(c) 2013 jake luer @@ -5593,9 +5732,9 @@ Library.prototype.test = function (obj, type) { } }; -},{}],34:[function(require,module,exports){ -arguments[4][32][0].apply(exports,arguments) -},{"./lib/type":35,"dup":32}],35:[function(require,module,exports){ +},{}],35:[function(require,module,exports){ +arguments[4][33][0].apply(exports,arguments) +},{"./lib/type":36,"dup":33}],36:[function(require,module,exports){ /*! * type-detect * Copyright(c) 2013 jake luer @@ -5732,4 +5871,4 @@ Library.prototype.test = function(obj, type) { }; },{}]},{},[1])(1) -}); +}); \ No newline at end of file diff --git a/lib/chai.js b/lib/chai.js index 258a89c80..87cfbfb0c 100644 --- a/lib/chai.js +++ b/lib/chai.js @@ -11,7 +11,7 @@ var used = [] * Chai version */ -exports.version = '3.3.0'; +exports.version = '3.4.0'; /*! * Assertion Error diff --git a/package.json b/package.json index 406dcd85b..bbd7eaf54 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "Veselin Todorov ", "John Firebaugh " ], - "version": "3.3.0", + "version": "3.4.0", "repository": { "type": "git", "url": "https://github.com/chaijs/chai"