UNPKG

cloudboost-tv

Version:

Database Service that does Storage, Search, Real-time and a whole lot more.

1,638 lines (1,455 loc) 86.5 kB
/* * should - test framework agnostic BDD-style assertions * @version v5.1.0 * @author TJ Holowaychuk <tj@vision-media.ca> and contributors * @link https://github.com/shouldjs/should.js * @license MIT */ !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.Should=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ /*! * Should * Copyright(c) 2010-2014 TJ Holowaychuk <tj@vision-media.ca> * MIT Licensed */ var util = require('./util'); /** * Our function should * * @param {*} obj Object to assert * @returns {should.Assertion} Returns new Assertion for beginning assertion chain * @example * * var should = require('should'); * should('abc').be.a.string; */ var should = function should(obj) { return (new should.Assertion(obj)).proxied(); }; should.AssertionError = require('./assertion-error'); should.Assertion = require('./assertion'); should.format = require('should-format'); should.type = require('should-type'); should.util = util; /** * Object with configuration. * It contains such properties: * * `checkProtoEql` boolean - Affect if `.eql` will check objects prototypes * * `useOldDeepEqual` boolean - Use old deepEqual implementation, that was copied from node's assert.deepEqual (will be removed in 5.x) * * @type {Object} * @memberOf should * @static * @example * * var a = { a: 10 }, b = Object.create(null); * b.a = 10; * * a.should.be.eql(b); * //not throws * * should.config.checkProtoEql = true; * a.should.be.eql(b); * //throws AssertionError: expected { a: 10 } to equal { a: 10 } (because A and B have different prototypes) */ should.config = require('./config'); //Expose should to external world. exports = module.exports = should; /** * Allow to extend given prototype with should property using given name. This getter will **unwrap** all standard wrappers like `Number`, `Boolean`, `String`. * Using `should(obj)` is the equivalent of using `obj.should` with known issues (like nulls and method calls etc). * * @param {string} [propertyName] Name of property to add. Default is `'should'`. * @param {Object} [proto] Prototype to extend with. Default is `Object.prototype`. * @memberOf should * @returns {{ name: string, descriptor: Object, proto: Object }} Descriptor enough to return all back * @static * @example * * var prev = should.extend('must', Object.prototype); * * 'abc'.must.startWith('a'); * * var should = should.noConflict(prev); * should.not.exist(Object.prototype.must); */ should.extend = function(propertyName, proto) { propertyName = propertyName || 'should'; proto = proto || Object.prototype; var prevDescriptor = Object.getOwnPropertyDescriptor(proto, propertyName); Object.defineProperty(proto, propertyName, { set: function() { }, get: function() { return should(util.isWrapperType(this) ? this.valueOf() : this); }, configurable: true }); return { name: propertyName, descriptor: prevDescriptor, proto: proto }; }; /** * Delete previous extension. If `desc` missing it will remove default extension. * * @param {{ name: string, descriptor: Object, proto: Object }} [desc] Returned from `should.extend` object * @memberOf should * @returns {Function} Returns should function * @static * @example * * var should = require('should').noConflict(); * * should(Object.prototype).not.have.property('should'); * * var prev = should.extend('must', Object.prototype); * 'abc'.must.startWith('a'); * should.noConflict(prev); * * should(Object.prototype).not.have.property('must'); */ should.noConflict = function(desc) { desc = desc || prevShould; if(desc) { delete desc.proto[desc.name]; if(desc.descriptor) { Object.defineProperty(desc.proto, desc.name, desc.descriptor); } } return should; }; /** * Simple utility function for a bit more easier should assertion extension * @param {Function} f So called plugin function. It should accept 2 arguments: `should` function and `Assertion` constructor * @memberOf should * @returns {Function} Returns `should` function * @static * @example * * should.use(function(should, Assertion) { * Assertion.add('asset', function() { * this.params = { operator: 'to be asset' }; * * this.obj.should.have.property('id').which.is.a.Number; * this.obj.should.have.property('path'); * }) * }) */ should.use = function(f) { f(should, should.Assertion); return this; }; should .use(require('./ext/assert')) .use(require('./ext/chain')) .use(require('./ext/bool')) .use(require('./ext/number')) .use(require('./ext/eql')) .use(require('./ext/type')) .use(require('./ext/string')) .use(require('./ext/property')) .use(require('./ext/error')) .use(require('./ext/match')) .use(require('./ext/contain')); var defaultProto = Object.prototype; var defaultProperty = 'should'; //Expose api via `Object#should`. var prevShould = should.extend(defaultProperty, defaultProto); },{"./assertion":3,"./assertion-error":2,"./config":4,"./ext/assert":6,"./ext/bool":7,"./ext/chain":8,"./ext/contain":9,"./ext/eql":10,"./ext/error":11,"./ext/match":12,"./ext/number":13,"./ext/property":14,"./ext/string":15,"./ext/type":16,"./util":17,"should-format":19,"should-type":20}],2:[function(require,module,exports){ var util = require('./util'); var format = require('should-format'); /** * should AssertionError * @param {Object} options * @constructor * @memberOf should * @static */ var AssertionError = function AssertionError(options) { util.merge(this, options); if(!options.message) { Object.defineProperty(this, 'message', { get: function() { if(!this._message) { this._message = this.generateMessage(); this.generatedMessage = true; } return this._message; }, configurable: true, enumerable: false } ) } if(Error.captureStackTrace) { Error.captureStackTrace(this, this.stackStartFunction); } else { // non v8 browsers so we can have a stacktrace var err = new Error(); if(err.stack) { var out = err.stack; if(this.stackStartFunction) { // try to strip useless frames var fn_name = util.functionName(this.stackStartFunction); var idx = out.indexOf('\n' + fn_name); if(idx >= 0) { // once we have located the function frame // we need to strip out everything before it (and its line) var next_line = out.indexOf('\n', idx + 1); out = out.substring(next_line + 1); } } this.stack = out; } } }; var indent = ' '; function prependIndent(line) { return indent + line; } function indentLines(text) { return text.split('\n').map(prependIndent).join('\n'); } // assert.AssertionError instanceof Error AssertionError.prototype = Object.create(Error.prototype, { name: { value: 'AssertionError' }, generateMessage: { value: function() { if(!this.operator && this.previous) { return this.previous.message; } var actual = format(this.actual); var expected = 'expected' in this ? ' ' + format(this.expected) : ''; var details = 'details' in this && this.details ? ' (' + this.details + ')' : ''; var previous = this.previous ? '\n' + indentLines(this.previous.message) : ''; return 'expected ' + actual + (this.negate ? ' not ' : ' ') + this.operator + expected + details + previous; } } }); module.exports = AssertionError; },{"./util":17,"should-format":19}],3:[function(require,module,exports){ var AssertionError = require('./assertion-error'); var util = require('./util'); var format = require('should-format'); /** * should Assertion * @param {*} obj Given object for assertion * @constructor * @memberOf should * @static */ function Assertion(obj) { this.obj = obj; this.anyOne = false; this.negate = false; this.params = {actual: obj}; } /** * Way to extend Assertion function. It uses some logic * to define only positive assertions and itself rule with negative assertion. * * All actions happen in subcontext and this method take care about negation. * Potentially we can add some more modifiers that does not depends from state of assertion. * @memberOf Assertion * @category assertion * @static * @param {String} name Name of assertion. It will be used for defining method or getter on Assertion.prototype * @param {Function} func Function that will be called on executing assertion * @param {Boolean} [isGetter] If this assertion is getter. By default it is false. * @example * * Assertion.add('asset', function() { * this.params = { operator: 'to be asset' }; * * this.obj.should.have.property('id').which.is.a.Number; * this.obj.should.have.property('path'); * }); */ Assertion.add = function(name, func, isGetter) { var prop = {enumerable: true, configurable: true}; isGetter = !!isGetter; prop[isGetter ? 'get' : 'value'] = function() { var context = new Assertion(this.obj, this, name); context.anyOne = this.anyOne; try { func.apply(context, arguments); } catch(e) { //check for fail if(e instanceof AssertionError) { //negative fail if(this.negate) { this.obj = context.obj; this.negate = false; return this.proxied(); } //console.log('catch', name, context.params.operator, e.operator); //console.log(name, e.actual, context.obj, context.params.actual, this.params.actual); /*if(e.operator !== context.params.operator) {// it means assertion happen because own context if(!('obj' in context.params)) { if(!('actual' in context.params)) { context.params.actual = context.obj; } } util.merge(e, context.params); //e.operato //e.operator = context.params.operator; }*/ if(context != e.assertion) { context.params.previous = e; } //positive fail context.negate = false; context.fail(); } // throw if it is another exception throw e; } //negative pass if(this.negate) { context.negate = true;//because .fail will set negate context.params.details = "false negative fail"; context.fail(); } //positive pass if(!this.params.operator) this.params = context.params;//shortcut this.obj = context.obj; this.negate = false; return this.proxied(); }; Object.defineProperty(Assertion.prototype, name, prop); }; Assertion.addChain = function(name, onCall) { onCall = onCall || function() { }; Object.defineProperty(Assertion.prototype, name, { get: function() { onCall(); return this.proxied(); }, enumerable: true }); }; /** * Create alias for some `Assertion` property * * @memberOf Assertion * @category assertion * @static * @param {String} from Name of to map * @param {String} to Name of alias * @example * * Assertion.alias('true', 'True'); */ Assertion.alias = function(from, to) { var desc = Object.getOwnPropertyDescriptor(Assertion.prototype, from); if(!desc) throw new Error('Alias ' + from + ' -> ' + to + ' could not be created as ' + from + ' not defined'); Object.defineProperty(Assertion.prototype, to, desc); }; Assertion.prototype = { constructor: Assertion, /** * Base method for assertions. Before calling this method need to fill Assertion#params object. This method usually called from other assertion methods. * `Assertion#params` can contain such properties: * * `operator` - required string containing description of this assertion * * `obj` - optional replacement for this.obj, it usefull if you prepare more clear object then given * * `message` - if this property filled with string any others will be ignored and this one used as assertion message * * `expected` - any object used when you need to assert relation between given object and expected. Like given == expected (== is a relation) * * `details` - additional string with details to generated message * * @memberOf Assertion * @category assertion * @param {*} expr Any expression that will be used as a condition for asserting. * @example * * var a = new should.Assertion(42); * * a.params = { * operator: 'to be magic number', * } * * a.assert(false); * //throws AssertionError: expected 42 to be magic number */ assert: function(expr) { if(expr) return this.proxied(); var params = this.params; if('obj' in params && !('actual' in params)) { params.actual = params.obj; } else if(!('obj' in params) && !('actual' in params)) { params.actual = this.obj; } params.stackStartFunction = params.stackStartFunction || this.assert; params.negate = this.negate; params.assertion = this; throw new AssertionError(params); }, /** * Shortcut for `Assertion#assert(false)`. * * @memberOf Assertion * @category assertion * @example * * var a = new should.Assertion(42); * * a.params = { * operator: 'to be magic number', * } * * a.fail(); * //throws AssertionError: expected 42 to be magic number */ fail: function() { return this.assert(false); }, /** * Negation modifier. Current assertion chain become negated. Each call invert negation on current assertion. * * @memberOf Assertion * @category assertion */ get not() { this.negate = !this.negate; return this.proxied(); }, /** * Any modifier - it affect on execution of sequenced assertion to do not `check all`, but `check any of`. * * @memberOf Assertion * @category assertion */ get any() { this.anyOne = true; return this.proxied(); }, proxied: function() { if(typeof Proxy == 'function') { return new Proxy(this, { get: function(target, name) { if(name in target) { return target[name]; } else { throw new Error('Assertion has no property ' + util.formatProp(name)); } } }) } return this; } }; module.exports = Assertion; },{"./assertion-error":2,"./util":17,"should-format":19}],4:[function(require,module,exports){ var config = { checkProtoEql: false }; module.exports = config; },{}],5:[function(require,module,exports){ // implement assert interface using already written peaces of should.js // http://wiki.commonjs.org/wiki/Unit_Testing/1.0 // // THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! // // Originally from narwhal.js (http://narwhaljs.org) // Copyright (c) 2009 Thomas Robinson <280north.com> // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the 'Software'), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // when used in node, this will actually load the util module we depend on // versus loading the builtin util module as happens otherwise // this is a bug in node module loading as far as I am concerned var util = require('./../util'); var Assertion = require('./../assertion'); var _deepEqual = require('should-equal'); var pSlice = Array.prototype.slice; // 1. The assert module provides functions that throw // AssertionError's when particular conditions are not met. The // assert module must conform to the following interface. var assert = module.exports = ok; // 3. All of the following functions must throw an AssertionError // when a corresponding condition is not met, with a message that // may be undefined if not provided. All assertion methods provide // both the actual and expected values to the assertion error for // display purposes. /** * Node.js standard [`assert.fail`](http://nodejs.org/api/assert.html#assert_assert_fail_actual_expected_message_operator). * @static * @memberOf should * @category assertion assert * @param {*} actual Actual object * @param {*} expected Expected object * @param {string} message Message for assertion * @param {string} operator Operator text */ function fail(actual, expected, message, operator, stackStartFunction) { var a = new Assertion(actual); a.params = { operator: operator, expected: expected, message: message, stackStartFunction: stackStartFunction || fail }; a.fail(); } // EXTENSION! allows for well behaved errors defined elsewhere. assert.fail = fail; // 4. Pure assertion tests whether a value is truthy, as determined // by !!guard. // assert.ok(guard, message_opt); // This statement is equivalent to assert.equal(true, !!guard, // message_opt);. To test strictly for the value true, use // assert.strictEqual(true, guard, message_opt);. /** * Node.js standard [`assert.ok`](http://nodejs.org/api/assert.html#assert_assert_value_message_assert_ok_value_message). * @static * @memberOf should * @category assertion assert * @param {*} value * @param {string} [message] */ function ok(value, message) { if(!value) fail(value, true, message, '==', assert.ok); } assert.ok = ok; // 5. The equality assertion tests shallow, coercive equality with // ==. // assert.equal(actual, expected, message_opt); /** * Node.js standard [`assert.equal`](http://nodejs.org/api/assert.html#assert_assert_equal_actual_expected_message). * @static * @memberOf should * @category assertion assert * @param {*} actual * @param {*} expected * @param {string} [message] */ assert.equal = function equal(actual, expected, message) { if(actual != expected) fail(actual, expected, message, '==', assert.equal); }; // 6. The non-equality assertion tests for whether two objects are not equal // with != assert.notEqual(actual, expected, message_opt); /** * Node.js standard [`assert.notEqual`](http://nodejs.org/api/assert.html#assert_assert_notequal_actual_expected_message). * @static * @memberOf should * @category assertion assert * @param {*} actual * @param {*} expected * @param {string} [message] */ assert.notEqual = function notEqual(actual, expected, message) { if(actual == expected) { fail(actual, expected, message, '!=', assert.notEqual); } }; // 7. The equivalence assertion tests a deep equality relation. // assert.deepEqual(actual, expected, message_opt); /** * Node.js standard [`assert.deepEqual`](http://nodejs.org/api/assert.html#assert_assert_deepequal_actual_expected_message). * @static * @memberOf should * @category assertion assert * @param {*} actual * @param {*} expected * @param {string} [message] */ assert.deepEqual = function deepEqual(actual, expected, message) { if(!_deepEqual(actual, expected).result) { fail(actual, expected, message, 'deepEqual', assert.deepEqual); } }; // 8. The non-equivalence assertion tests for any deep inequality. // assert.notDeepEqual(actual, expected, message_opt); /** * Node.js standard [`assert.notDeepEqual`](http://nodejs.org/api/assert.html#assert_assert_notdeepequal_actual_expected_message). * @static * @memberOf should * @category assertion assert * @param {*} actual * @param {*} expected * @param {string} [message] */ assert.notDeepEqual = function notDeepEqual(actual, expected, message) { if(_deepEqual(actual, expected).result) { fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); } }; // 9. The strict equality assertion tests strict equality, as determined by ===. // assert.strictEqual(actual, expected, message_opt); /** * Node.js standard [`assert.strictEqual`](http://nodejs.org/api/assert.html#assert_assert_strictequal_actual_expected_message). * @static * @memberOf should * @category assertion assert * @param {*} actual * @param {*} expected * @param {string} [message] */ assert.strictEqual = function strictEqual(actual, expected, message) { if(actual !== expected) { fail(actual, expected, message, '===', assert.strictEqual); } }; // 10. The strict non-equality assertion tests for strict inequality, as // determined by !==. assert.notStrictEqual(actual, expected, message_opt); /** * Node.js standard [`assert.notStrictEqual`](http://nodejs.org/api/assert.html#assert_assert_notstrictequal_actual_expected_message). * @static * @memberOf should * @category assertion assert * @param {*} actual * @param {*} expected * @param {string} [message] */ assert.notStrictEqual = function notStrictEqual(actual, expected, message) { if(actual === expected) { fail(actual, expected, message, '!==', assert.notStrictEqual); } }; function expectedException(actual, expected) { if(!actual || !expected) { return false; } if(Object.prototype.toString.call(expected) == '[object RegExp]') { return expected.test(actual); } else if(actual instanceof expected) { return true; } else if(expected.call({}, actual) === true) { return true; } return false; } function _throws(shouldThrow, block, expected, message) { var actual; if(typeof expected == 'string') { message = expected; expected = null; } try { block(); } catch(e) { actual = e; } message = (expected && expected.name ? ' (' + expected.name + ')' : '.') + (message ? ' ' + message : '.'); if(shouldThrow && !actual) { fail(actual, expected, 'Missing expected exception' + message); } if(!shouldThrow && expectedException(actual, expected)) { fail(actual, expected, 'Got unwanted exception' + message); } if((shouldThrow && actual && expected && !expectedException(actual, expected)) || (!shouldThrow && actual)) { throw actual; } } // 11. Expected to throw an error: // assert.throws(block, Error_opt, message_opt); /** * Node.js standard [`assert.throws`](http://nodejs.org/api/assert.html#assert_assert_throws_block_error_message). * @static * @memberOf should * @category assertion assert * @param {Function} block * @param {Function} [error] * @param {String} [message] */ assert.throws = function(block, /*optional*/error, /*optional*/message) { _throws.apply(this, [true].concat(pSlice.call(arguments))); }; // EXTENSION! This is annoying to write outside this module. /** * Node.js standard [`assert.doesNotThrow`](http://nodejs.org/api/assert.html#assert_assert_doesnotthrow_block_message). * @static * @memberOf should * @category assertion assert * @param {Function} block * @param {String} [message] */ assert.doesNotThrow = function(block, /*optional*/message) { _throws.apply(this, [false].concat(pSlice.call(arguments))); }; /** * Node.js standard [`assert.ifError`](http://nodejs.org/api/assert.html#assert_assert_iferror_value). * @static * @memberOf should * @category assertion assert * @param {Error} err */ assert.ifError = function(err) { if(err) { throw err; } }; },{"./../assertion":3,"./../util":17,"should-equal":18}],6:[function(require,module,exports){ /*! * Should * Copyright(c) 2010-2014 TJ Holowaychuk <tj@vision-media.ca> * MIT Licensed */ var util = require('../util') , assert = require('./_assert') , AssertionError = require('../assertion-error'); module.exports = function(should) { var i = should.format; /* * Expose assert to should * * This allows you to do things like below * without require()ing the assert module. * * should.equal(foo.bar, undefined); * */ util.merge(should, assert); /** * Assert _obj_ exists, with optional message. * * @static * @memberOf should * @category assertion assert * @alias should.exists * @param {*} obj * @param {String} [msg] * @example * * should.exist(1); * should.exist(new Date()); */ should.exist = should.exists = function(obj, msg) { if(null == obj) { throw new AssertionError({ message: msg || ('expected ' + i(obj) + ' to exist'), stackStartFunction: should.exist }); } }; should.not = {}; /** * Asserts _obj_ does not exist, with optional message. * * @name not.exist * @static * @memberOf should * @category assertion assert * @alias should.not.exists * @param {*} obj * @param {String} [msg] * @example * * should.not.exist(null); * should.not.exist(void 0); */ should.not.exist = should.not.exists = function(obj, msg) { if(null != obj) { throw new AssertionError({ message: msg || ('expected ' + i(obj) + ' to not exist'), stackStartFunction: should.not.exist }); } }; }; },{"../assertion-error":2,"../util":17,"./_assert":5}],7:[function(require,module,exports){ /*! * Should * Copyright(c) 2010-2014 TJ Holowaychuk <tj@vision-media.ca> * MIT Licensed */ module.exports = function(should, Assertion) { /** * Assert given object is exactly `true`. * * @name true * @memberOf Assertion * @category assertion bool * @alias Assertion#True * @example * * (true).should.be.true; * false.should.not.be.True; * * ({ a: 10}).should.not.be.true; */ Assertion.add('true', function() { this.is.exactly(true); }, true); Assertion.alias('true', 'True'); /** * Assert given object is exactly `false`. * * @name false * @memberOf Assertion * @category assertion bool * @alias Assertion#False * @example * * (true).should.not.be.false; * false.should.be.False; */ Assertion.add('false', function() { this.is.exactly(false); }, true); Assertion.alias('false', 'False'); /** * Assert given object is thuthy according javascript type conversions. * * @name ok * @memberOf Assertion * @category assertion bool * @example * * (true).should.be.ok; * ''.should.not.be.ok; * should(null).not.be.ok; * should(void 0).not.be.ok; * * (10).should.be.ok; * (0).should.not.be.ok; */ Assertion.add('ok', function() { this.params = { operator: 'to be truthy' }; this.assert(this.obj); }, true); }; },{}],8:[function(require,module,exports){ module.exports = function(should, Assertion) { /** * Simple chaining. It actually do nothing. * * @memberOf Assertion * @name be * @alias Assertion#an * @alias Assertion#of * @alias Assertion#a * @alias Assertion#and * @alias Assertion#have * @alias Assertion#with * @alias Assertion#is * @alias Assertion#which * @alias Assertion#the * @category assertion chaining */ ['an', 'of', 'a', 'and', 'be', 'has', 'have', 'with', 'is', 'which', 'the', 'it'].forEach(function(name) { Assertion.addChain(name); }); }; },{}],9:[function(require,module,exports){ /*! * Should * Copyright(c) 2010-2014 TJ Holowaychuk <tj@vision-media.ca> * MIT Licensed */ var util = require('../util'); var eql = require('should-equal'); module.exports = function(should, Assertion) { var i = should.format; var type = should.type; /** * Assert that given object contain something that equal to `other`. It uses `should-equal` for equality checks. * If given object is array it search that one of elements was equal to `other`. * If given object is string it checks if `other` is a substring - expected that `other` is a string. * If given object is Object it checks that `other` is a subobject - expected that `other` is a object. * * @name containEql * @memberOf Assertion * @category assertion contain * @param {*} other Nested object * @example * * [1, 2, 3].should.containEql(1); * [{ a: 1 }, 'a', 10].should.containEql({ a: 1 }); * * 'abc'.should.containEql('b'); * 'ab1c'.should.containEql(1); * * ({ a: 10, c: { d: 10 }}).should.containEql({ a: 10 }); * ({ a: 10, c: { d: 10 }}).should.containEql({ c: { d: 10 }}); * ({ a: 10, c: { d: 10 }}).should.containEql({ b: 10 }); * // throws AssertionError: expected { a: 10, c: { d: 10 } } to contain { b: 10 } * // expected { a: 10, c: { d: 10 } } to have property b */ Assertion.add('containEql', function(other) { this.params = {operator: 'to contain ' + i(other)}; this.is.not.null.and.not.undefined; var obj = this.obj; var tpe = should.type(obj); if(tpe == should.type.STRING) { this.assert(obj.indexOf(String(other)) >= 0); } else if(util.isIndexable(obj)) { this.assert(util.some(obj, function(v) { return eql(v, other).result; })); } else { this.have.properties(other); } }); /** * Assert that given object is contain equally structured object on the same depth level. * If given object is an array and `other` is an array it checks that the eql elements is going in the same sequence in given array (recursive) * For string it is working as `Assertion#containEql * If given object is an object it checks that the same keys contain deep equal values (recursive) * On other cases it try to check with `.eql` * * @name containDeepOrdered * @memberOf Assertion * @category assertion contain * @param {*} other Nested object * @example * * [ 1, 2, 3].should.containDeepOrdered([1, 2]); * [ 1, 2, [ 1, 2, 3 ]].should.containDeepOrdered([ 1, [ 2, 3 ]]); * * '123'.should.containDeepOrdered('1') * * ({ a: 10, b: { c: 10, d: [1, 2, 3] }}).should.containDeepOrdered({a: 10}); * ({ a: 10, b: { c: 10, d: [1, 2, 3] }}).should.containDeepOrdered({b: {c: 10}}); * ({ a: 10, b: { c: 10, d: [1, 2, 3] }}).should.containDeepOrdered({b: {d: [1, 3]}}); */ Assertion.add('containDeepOrdered', function(other) { this.params = {operator: 'to contain ' + i(other)}; var obj = this.obj; if(type(obj) == type.STRING) {// expect other to be string this.assert(obj.indexOf(String(other)) >= 0); } else if(util.isIndexable(obj) && util.isIndexable(other)) { for(var objIdx = 0, otherIdx = 0, objLength = util.length(obj), otherLength = util.length(other); objIdx < objLength && otherIdx < otherLength; objIdx++) { try { should(obj[objIdx]).containDeepOrdered(other[otherIdx]); otherIdx++; } catch(e) { if(e instanceof should.AssertionError) { continue; } throw e; } } this.assert(otherIdx == otherLength); } else if(obj != null && other != null && typeof obj == 'object' && typeof other == 'object') {// object contains object case util.forEach(other, function(value, key) { should(obj[key]).containDeepOrdered(value); }); // if both objects is empty means we finish traversing - and we need to compare for hidden values if(util.isEmptyObject(other)) { this.eql(other); } } else { this.eql(other); } }); /** * The same like `Assertion#containDeepOrdered` but all checks on arrays without order. * * @name containDeep * @memberOf Assertion * @category assertion contain * @param {*} other Nested object * @example * * [ 1, 2, 3].should.containDeep([2, 1]); * [ 1, 2, [ 1, 2, 3 ]].should.containDeep([ 1, [ 3, 1 ]]); */ Assertion.add('containDeep', function(other) { this.params = {operator: 'to contain ' + i(other)}; var obj = this.obj; if(typeof obj == 'string') {// expect other to be string this.assert(obj.indexOf(String(other)) >= 0); } else if(util.isIndexable(obj) && util.isIndexable(other)) { var usedKeys = {}; util.forEach(other, function(otherItem) { this.assert(util.some(obj, function(item, index) { if(index in usedKeys) return false; try { should(item).containDeep(otherItem); usedKeys[index] = true; return true; } catch(e) { if(e instanceof should.AssertionError) { return false; } throw e; } })); }, this); } else if(obj != null && other != null && typeof obj == 'object' && typeof other == 'object') {// object contains object case util.forEach(other, function(value, key) { should(obj[key]).containDeep(value); }); // if both objects is empty means we finish traversing - and we need to compare for hidden values if(util.isEmptyObject(other)) { this.eql(other); } } else { this.eql(other); } }); }; },{"../util":17,"should-equal":18}],10:[function(require,module,exports){ /*! * Should * Copyright(c) 2010-2014 TJ Holowaychuk <tj@vision-media.ca> * MIT Licensed */ var eql = require('should-equal'); var type = require('should-type'); var util = require('../util'); function formatEqlResult(r, a, b, format) { return ((r.path.length > 0 ? 'at ' + r.path.map(util.formatProp).join(' -> ') : '') + (r.a === a ? '' : ', A has ' + format(r.a)) + (r.b === b ? '' : ' and B has ' + format(r.b)) + (r.showReason ? ' because ' + r.reason: '')).trim(); } module.exports = function(should, Assertion) { /** * Deep object equality comparison. For full spec see [`should-equal tests`](https://github.com/shouldjs/equal/blob/master/test.js). * * @name eql * @memberOf Assertion * @category assertion equality * @param {*} val Expected value * @param {string} [description] Optional message * @example * * (10).should.be.eql(10); * ('10').should.not.be.eql(10); * (-0).should.not.be.eql(+0); * * NaN.should.be.eql(NaN); * * ({ a: 10}).should.be.eql({ a: 10 }); * [ 'a' ].should.not.be.eql({ '0': 'a' }); */ Assertion.add('eql', function(val, description) { this.params = {operator: 'to equal', expected: val, message: description}; var strictResult = eql(this.obj, val, should.config); this.params.details = strictResult.result ? '': formatEqlResult(strictResult, this.obj, val, should.format); this.params.showDiff = type(this.obj) == type(val); this.assert(strictResult.result); }); /** * Exact comparison using ===. * * @name equal * @memberOf Assertion * @category assertion equality * @alias Assertion#exactly * @param {*} val Expected value * @param {string} [description] Optional message * @example * * 10.should.be.equal(10); * 'a'.should.be.exactly('a'); * * should(null).be.exactly(null); */ Assertion.add('equal', function(val, description) { this.params = {operator: 'to be', expected: val, message: description}; this.params.showDiff = type(this.obj) == type(val); this.assert(val === this.obj); }); Assertion.alias('equal', 'exactly'); }; },{"../util":17,"should-equal":18,"should-type":20}],11:[function(require,module,exports){ /*! * Should * Copyright(c) 2010-2014 TJ Holowaychuk <tj@vision-media.ca> * MIT Licensed */ var util = require('../util'); module.exports = function(should, Assertion) { var i = should.format; /** * Assert given function throws error with such message. * * @name throw * @memberOf Assertion * @category assertion errors * @alias Assertion#throwError * @param {string|RegExp|Function|Object|GeneratorFunction|GeneratorObject} [message] Message to match or properties * @param {Object} [properties] Optional properties that will be matched to thrown error * @example * * (function(){ throw new Error('fail') }).should.throw(); * (function(){ throw new Error('fail') }).should.throw('fail'); * (function(){ throw new Error('fail') }).should.throw(/fail/); * * (function(){ throw new Error('fail') }).should.throw(Error); * var error = new Error(); * error.a = 10; * (function(){ throw error; }).should.throw(Error, { a: 10 }); * (function(){ throw error; }).should.throw({ a: 10 }); * (function*() { * yield throwError(); * }).should.throw(); */ Assertion.add('throw', function(message, properties) { var fn = this.obj , err = {} , errorInfo = '' , thrown = false; if(util.isGeneratorFunction(fn)) { return fn().should.throw(message, properties); } else if(util.isGeneratorObject(fn)) { return fn.next.should.throw(message, properties); } this.is.a.Function; var errorMatched = true; try { fn(); } catch(e) { thrown = true; err = e; } if(thrown) { if(message) { if('string' == typeof message) { errorMatched = message == err.message; } else if(message instanceof RegExp) { errorMatched = message.test(err.message); } else if('function' == typeof message) { errorMatched = err instanceof message; } else if(null != message) { try { err.should.match(message); } catch(e) { if(e instanceof should.AssertionError) { errorInfo = ": " + e.message; errorMatched = false; } else { throw e; } } } if(!errorMatched) { if('string' == typeof message || message instanceof RegExp) { errorInfo = " with a message matching " + i(message) + ", but got '" + err.message + "'"; } else if('function' == typeof message) { errorInfo = " of type " + util.functionName(message) + ", but got " + util.functionName(err.constructor); } } else if('function' == typeof message && properties) { try { err.should.match(properties); } catch(e) { if(e instanceof should.AssertionError) { errorInfo = ": " + e.message; errorMatched = false; } else { throw e; } } } } else { errorInfo = " (got " + i(err) + ")"; } } this.params = { operator: 'to throw exception' + errorInfo }; this.assert(thrown); this.assert(errorMatched); }); Assertion.alias('throw', 'throwError'); }; },{"../util":17}],12:[function(require,module,exports){ /*! * Should * Copyright(c) 2010-2014 TJ Holowaychuk <tj@vision-media.ca> * MIT Licensed */ var util = require('../util'); var eql = require('should-equal'); module.exports = function(should, Assertion) { var i = should.format; /** * Asserts if given object match `other` object, using some assumptions: * First object matched if they are equal, * If `other` is a regexp and given object is a string check on matching with regexp * If `other` is a regexp and given object is an array check if all elements matched regexp * If `other` is a regexp and given object is an object check values on matching regexp * If `other` is a function check if this function throws AssertionError on given object or return false - it will be assumed as not matched * If `other` is an object check if the same keys matched with above rules * All other cases failed * * @name match * @memberOf Assertion * @category assertion matching * @param {*} other Object to match * @param {string} [description] Optional message * @example * 'foobar'.should.match(/^foo/); * 'foobar'.should.not.match(/^bar/); * * ({ a: 'foo', c: 'barfoo' }).should.match(/foo$/); * * ['a', 'b', 'c'].should.match(/[a-z]/); * * (5).should.not.match(function(n) { * return n < 0; * }); * (5).should.not.match(function(it) { * it.should.be.an.Array; * }); * ({ a: 10, b: 'abc', c: { d: 10 }, d: 0 }).should * .match({ a: 10, b: /c$/, c: function(it) { * return it.should.have.property('d', 10); * }}); * * [10, 'abc', { d: 10 }, 0].should * .match({ '0': 10, '1': /c$/, '2': function(it) { * return it.should.have.property('d', 10); * }}); */ Assertion.add('match', function(other, description) { this.params = {operator: 'to match ' + i(other), message: description}; if(!eql(this.obj, other).result) { if(other instanceof RegExp) { // something - regex if(typeof this.obj == 'string') { this.assert(other.exec(this.obj)); } else if(util.isIndexable(this.obj)) { util.forEach(this.obj, function(item) { this.assert(other.exec(item));// should we try to convert to String and exec? }, this); } else if(null != this.obj && typeof this.obj == 'object') { var notMatchedProps = [], matchedProps = []; util.forEach(this.obj, function(value, name) { if(other.exec(value)) matchedProps.push(util.formatProp(name)); else notMatchedProps.push(util.formatProp(name) + ' (' + i(value) + ')'); }, this); if(notMatchedProps.length) this.params.operator += '\n not matched properties: ' + notMatchedProps.join(', '); if(matchedProps.length) this.params.operator += '\n matched properties: ' + matchedProps.join(', '); this.assert(notMatchedProps.length == 0); } // should we try to convert to String and exec? } else if(typeof other == 'function') { var res; res = other(this.obj); //if(res instanceof Assertion) { // this.params.operator += '\n ' + res.getMessage(); //} //if we throw exception ok - it is used .should inside if(typeof res == 'boolean') { this.assert(res); // if it is just boolean function assert on it } } else if(other != null && typeof other == 'object') { // try to match properties (for Object and Array) notMatchedProps = []; matchedProps = []; util.forEach(other, function(value, key) { try { should(this.obj[key]).match(value); matchedProps.push(util.formatProp(key)); } catch(e) { if(e instanceof should.AssertionError) { notMatchedProps.push(util.formatProp(key) + ' (' + i(this.obj[key]) + ')'); } else { throw e; } } }, this); if(notMatchedProps.length) this.params.operator += '\n not matched properties: ' + notMatchedProps.join(', '); if(matchedProps.length) this.params.operator += '\n matched properties: ' + matchedProps.join(', '); this.assert(notMatchedProps.length == 0); } else { this.assert(false); } } }); /** * Asserts if given object values or array elements all match `other` object, using some assumptions: * First object matched if they are equal, * If `other` is a regexp - matching with regexp * If `other` is a function check if this function throws AssertionError on given object or return false - it will be assumed as not matched * All other cases check if this `other` equal to each element * * @name matchEach * @memberOf Assertion * @category assertion matching * @param {*} other Object to match * @param {string} [description] Optional message * @example * [ 'a', 'b', 'c'].should.matchEach(/\w+/); * [ 'a', 'a', 'a'].should.matchEach('a'); * * [ 'a', 'a', 'a'].should.matchEach(function(value) { value.should.be.eql('a') }); * * { a: 'a', b: 'a', c: 'a' }.should.matchEach(function(value) { value.should.be.eql('a') }); */ Assertion.add('matchEach', function(other, description) { this.params = {operator: 'to match each ' + i(other), message: description}; var f = other; if(other instanceof RegExp) f = function(it) { return !!other.exec(it); }; else if(typeof other != 'function') f = function(it) { return eql(it, other).result; }; util.forEach(this.obj, function(value, key) { var res = f(value, key); //if we throw exception ok - it is used .should inside if(typeof res == 'boolean') { this.assert(res); // if it is just boolean function assert on it } }, this); }); }; },{"../util":17,"should-equal":18}],13:[function(require,module,exports){ /*! * Should * Copyright(c) 2010-2014 TJ Holowaychuk <tj@vision-media.ca> * MIT Licensed */ module.exports = function(should, Assertion) { /** * Assert given object is NaN * @name NaN * @memberOf Assertion * @category assertion numbers * @example * * (10).should.not.be.NaN; * NaN.should.be.NaN; */ Assertion.add('NaN', function() { this.params = { operator: 'to be NaN' }; this.assert(this.obj !== this.obj); }, true); /** * Assert given object is not finite (positive or negative) * * @name Infinity * @memberOf Assertion * @category assertion numbers * @example * * (10).should.not.be.Infinity; * NaN.should.not.be.Infinity; */ Assertion.add('Infinity', function() { this.params = { operator: 'to be Infinity' }; this.is.a.Number .and.not.a.NaN .and.assert(!isFinite(this.obj)); }, true); /** * Assert given number between `start` and `finish` or equal one of them. * * @name within * @memberOf Assertion * @category assertion numbers * @param {number} start Start number * @param {number} finish Finish number * @param {string} [description] Optional message * @example * * (10).should.be.within(0, 20); */ Assertion.add('within', function(start, finish, description) { this.params = { operator: 'to be within ' + start + '..' + finish, message: description }; this.assert(this.obj >= start && this.obj <= finish); }); /** * Assert given number near some other `value` within `delta` * * @name approximately * @memberOf Assertion * @category assertion numbers * @param {number} value Center number * @param {number} delta Radius * @param {string} [description] Optional message * @example * * (9.99).should.be.approximately(10, 0.1); */ Assertion.add('approximately', function(value, delta, description) { this.params = { operator: 'to be approximately ' + value + " ±" + delta, message: description }; this.assert(Math.abs(this.obj - value) <= delta); }); /** * Assert given number above `n`. * * @name above * @alias Assertion#greaterThan * @memberOf Assertion * @category assertion numbers * @param {number} n Margin number * @param {string} [description] Optional message * @example * * (10).should.be.above(0); */ Assertion.add('above', function(n, description) { this.params = { operator: 'to be above ' + n, message: description }; this.assert(this.obj > n); }); /** * Assert given number below `n`. * * @name below * @alias Assertion#lessThan * @memberOf Assertion * @category assertion numbers * @param {number} n Margin number * @param {string} [description] Optional message * @example * * (0).should.be.above(10); */ Assertion.add('below', function(n, description) { this.params = { operator: 'to be below ' + n, message: description }; this.assert(this.obj < n); }); Assertion.alias('above', 'greaterThan'); Assertion.alias('below', 'lessThan'); }; },{}],14:[function(require,module,exports){ /*! * Should * Copyright(c) 2010-2014 TJ Holowaychuk <tj@vision-media.ca> * MIT Licensed */ var util = require('../util'); var eql = require('should-equal'); var aSlice = Array.prototype.slice; module.exports = function(should, Assertion) { var i = should.format; /** * Asserts given object has some descriptor. **On success it change given object to be value of property**. * * @name propertyWithDescriptor * @memberOf Assertion * @category assertion property * @param {string} name Name of property * @param {Object} desc Descriptor like used in Object.defineProperty (not required to add all properties) * @example * * ({ a: 10 }).should.have.propertyWithDescriptor('a', { enumerable: true }); */ Assertion.add('propertyWithDescriptor', function(name, desc) { this.params = {actual: this.obj, operator: 'to have own property with descriptor ' + i(desc)}; var obj = this.obj; this.have.ownProperty(name); should(Object.getOwnPropertyDescriptor(Object(obj), name)).have.properties(desc); }); function processPropsArgs() { var args = {}; if(arguments.length > 1) { args.names = aSlice.call(arguments); } else { var arg = arguments[0]; var t = should.type(arg); if(t == should.type.STRING) { args.names = [arg]; } else if(util.isIndexable(arg)) { args.names = arg; } else { args.names = Object.keys(ar