| OLD | NEW |
| (Empty) | |
| 1 (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.e
xports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var
g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined")
{g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.chai = f()}})(
function(){var define,module,exports;return (function e(t,n,r){function s(o,u){i
f(!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.c
ode="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}v
ar i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);retu
rn s})({1:[function(require,module,exports){ |
| 2 module.exports = require('./lib/chai'); |
| 3 |
| 4 },{"./lib/chai":2}],2:[function(require,module,exports){ |
| 5 /*! |
| 6 * chai |
| 7 * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com> |
| 8 * MIT Licensed |
| 9 */ |
| 10 |
| 11 var used = [] |
| 12 , exports = module.exports = {}; |
| 13 |
| 14 /*! |
| 15 * Chai version |
| 16 */ |
| 17 |
| 18 exports.version = '3.5.0'; |
| 19 |
| 20 /*! |
| 21 * Assertion Error |
| 22 */ |
| 23 |
| 24 exports.AssertionError = require('assertion-error'); |
| 25 |
| 26 /*! |
| 27 * Utils for plugins (not exported) |
| 28 */ |
| 29 |
| 30 var util = require('./chai/utils'); |
| 31 |
| 32 /** |
| 33 * # .use(function) |
| 34 * |
| 35 * Provides a way to extend the internals of Chai |
| 36 * |
| 37 * @param {Function} |
| 38 * @returns {this} for chaining |
| 39 * @api public |
| 40 */ |
| 41 |
| 42 exports.use = function (fn) { |
| 43 if (!~used.indexOf(fn)) { |
| 44 fn(this, util); |
| 45 used.push(fn); |
| 46 } |
| 47 |
| 48 return this; |
| 49 }; |
| 50 |
| 51 /*! |
| 52 * Utility Functions |
| 53 */ |
| 54 |
| 55 exports.util = util; |
| 56 |
| 57 /*! |
| 58 * Configuration |
| 59 */ |
| 60 |
| 61 var config = require('./chai/config'); |
| 62 exports.config = config; |
| 63 |
| 64 /*! |
| 65 * Primary `Assertion` prototype |
| 66 */ |
| 67 |
| 68 var assertion = require('./chai/assertion'); |
| 69 exports.use(assertion); |
| 70 |
| 71 /*! |
| 72 * Core Assertions |
| 73 */ |
| 74 |
| 75 var core = require('./chai/core/assertions'); |
| 76 exports.use(core); |
| 77 |
| 78 /*! |
| 79 * Expect interface |
| 80 */ |
| 81 |
| 82 var expect = require('./chai/interface/expect'); |
| 83 exports.use(expect); |
| 84 |
| 85 /*! |
| 86 * Should interface |
| 87 */ |
| 88 |
| 89 var should = require('./chai/interface/should'); |
| 90 exports.use(should); |
| 91 |
| 92 /*! |
| 93 * Assert interface |
| 94 */ |
| 95 |
| 96 var assert = require('./chai/interface/assert'); |
| 97 exports.use(assert); |
| 98 |
| 99 },{"./chai/assertion":3,"./chai/config":4,"./chai/core/assertions":5,"./chai/int
erface/assert":6,"./chai/interface/expect":7,"./chai/interface/should":8,"./chai
/utils":22,"assertion-error":30}],3:[function(require,module,exports){ |
| 100 /*! |
| 101 * chai |
| 102 * http://chaijs.com |
| 103 * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com> |
| 104 * MIT Licensed |
| 105 */ |
| 106 |
| 107 var config = require('./config'); |
| 108 |
| 109 module.exports = function (_chai, util) { |
| 110 /*! |
| 111 * Module dependencies. |
| 112 */ |
| 113 |
| 114 var AssertionError = _chai.AssertionError |
| 115 , flag = util.flag; |
| 116 |
| 117 /*! |
| 118 * Module export. |
| 119 */ |
| 120 |
| 121 _chai.Assertion = Assertion; |
| 122 |
| 123 /*! |
| 124 * Assertion Constructor |
| 125 * |
| 126 * Creates object for chaining. |
| 127 * |
| 128 * @api private |
| 129 */ |
| 130 |
| 131 function Assertion (obj, msg, stack) { |
| 132 flag(this, 'ssfi', stack || arguments.callee); |
| 133 flag(this, 'object', obj); |
| 134 flag(this, 'message', msg); |
| 135 } |
| 136 |
| 137 Object.defineProperty(Assertion, 'includeStack', { |
| 138 get: function() { |
| 139 console.warn('Assertion.includeStack is deprecated, use chai.config.includ
eStack instead.'); |
| 140 return config.includeStack; |
| 141 }, |
| 142 set: function(value) { |
| 143 console.warn('Assertion.includeStack is deprecated, use chai.config.includ
eStack instead.'); |
| 144 config.includeStack = value; |
| 145 } |
| 146 }); |
| 147 |
| 148 Object.defineProperty(Assertion, 'showDiff', { |
| 149 get: function() { |
| 150 console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff i
nstead.'); |
| 151 return config.showDiff; |
| 152 }, |
| 153 set: function(value) { |
| 154 console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff i
nstead.'); |
| 155 config.showDiff = value; |
| 156 } |
| 157 }); |
| 158 |
| 159 Assertion.addProperty = function (name, fn) { |
| 160 util.addProperty(this.prototype, name, fn); |
| 161 }; |
| 162 |
| 163 Assertion.addMethod = function (name, fn) { |
| 164 util.addMethod(this.prototype, name, fn); |
| 165 }; |
| 166 |
| 167 Assertion.addChainableMethod = function (name, fn, chainingBehavior) { |
| 168 util.addChainableMethod(this.prototype, name, fn, chainingBehavior); |
| 169 }; |
| 170 |
| 171 Assertion.overwriteProperty = function (name, fn) { |
| 172 util.overwriteProperty(this.prototype, name, fn); |
| 173 }; |
| 174 |
| 175 Assertion.overwriteMethod = function (name, fn) { |
| 176 util.overwriteMethod(this.prototype, name, fn); |
| 177 }; |
| 178 |
| 179 Assertion.overwriteChainableMethod = function (name, fn, chainingBehavior) { |
| 180 util.overwriteChainableMethod(this.prototype, name, fn, chainingBehavior); |
| 181 }; |
| 182 |
| 183 /** |
| 184 * ### .assert(expression, message, negateMessage, expected, actual, showDiff) |
| 185 * |
| 186 * Executes an expression and check expectations. Throws AssertionError for re
porting if test doesn't pass. |
| 187 * |
| 188 * @name assert |
| 189 * @param {Philosophical} expression to be tested |
| 190 * @param {String|Function} message or function that returns message to displa
y if expression fails |
| 191 * @param {String|Function} negatedMessage or function that returns negatedMes
sage to display if negated expression fails |
| 192 * @param {Mixed} expected value (remember to check for negation) |
| 193 * @param {Mixed} actual (optional) will default to `this.obj` |
| 194 * @param {Boolean} showDiff (optional) when set to `true`, assert will displa
y a diff in addition to the message if expression fails |
| 195 * @api private |
| 196 */ |
| 197 |
| 198 Assertion.prototype.assert = function (expr, msg, negateMsg, expected, _actual
, showDiff) { |
| 199 var ok = util.test(this, arguments); |
| 200 if (true !== showDiff) showDiff = false; |
| 201 if (true !== config.showDiff) showDiff = false; |
| 202 |
| 203 if (!ok) { |
| 204 var msg = util.getMessage(this, arguments) |
| 205 , actual = util.getActual(this, arguments); |
| 206 throw new AssertionError(msg, { |
| 207 actual: actual |
| 208 , expected: expected |
| 209 , showDiff: showDiff |
| 210 }, (config.includeStack) ? this.assert : flag(this, 'ssfi')); |
| 211 } |
| 212 }; |
| 213 |
| 214 /*! |
| 215 * ### ._obj |
| 216 * |
| 217 * Quick reference to stored `actual` value for plugin developers. |
| 218 * |
| 219 * @api private |
| 220 */ |
| 221 |
| 222 Object.defineProperty(Assertion.prototype, '_obj', |
| 223 { get: function () { |
| 224 return flag(this, 'object'); |
| 225 } |
| 226 , set: function (val) { |
| 227 flag(this, 'object', val); |
| 228 } |
| 229 }); |
| 230 }; |
| 231 |
| 232 },{"./config":4}],4:[function(require,module,exports){ |
| 233 module.exports = { |
| 234 |
| 235 /** |
| 236 * ### config.includeStack |
| 237 * |
| 238 * User configurable property, influences whether stack trace |
| 239 * is included in Assertion error message. Default of false |
| 240 * suppresses stack trace in the error message. |
| 241 * |
| 242 * chai.config.includeStack = true; // enable stack on error |
| 243 * |
| 244 * @param {Boolean} |
| 245 * @api public |
| 246 */ |
| 247 |
| 248 includeStack: false, |
| 249 |
| 250 /** |
| 251 * ### config.showDiff |
| 252 * |
| 253 * User configurable property, influences whether or not |
| 254 * the `showDiff` flag should be included in the thrown |
| 255 * AssertionErrors. `false` will always be `false`; `true` |
| 256 * will be true when the assertion has requested a diff |
| 257 * be shown. |
| 258 * |
| 259 * @param {Boolean} |
| 260 * @api public |
| 261 */ |
| 262 |
| 263 showDiff: true, |
| 264 |
| 265 /** |
| 266 * ### config.truncateThreshold |
| 267 * |
| 268 * User configurable property, sets length threshold for actual and |
| 269 * expected values in assertion errors. If this threshold is exceeded, for |
| 270 * example for large data structures, the value is replaced with something |
| 271 * like `[ Array(3) ]` or `{ Object (prop1, prop2) }`. |
| 272 * |
| 273 * Set it to zero if you want to disable truncating altogether. |
| 274 * |
| 275 * This is especially userful when doing assertions on arrays: having this |
| 276 * set to a reasonable large value makes the failure messages readily |
| 277 * inspectable. |
| 278 * |
| 279 * chai.config.truncateThreshold = 0; // disable truncating |
| 280 * |
| 281 * @param {Number} |
| 282 * @api public |
| 283 */ |
| 284 |
| 285 truncateThreshold: 40 |
| 286 |
| 287 }; |
| 288 |
| 289 },{}],5:[function(require,module,exports){ |
| 290 /*! |
| 291 * chai |
| 292 * http://chaijs.com |
| 293 * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com> |
| 294 * MIT Licensed |
| 295 */ |
| 296 |
| 297 module.exports = function (chai, _) { |
| 298 var Assertion = chai.Assertion |
| 299 , toString = Object.prototype.toString |
| 300 , flag = _.flag; |
| 301 |
| 302 /** |
| 303 * ### Language Chains |
| 304 * |
| 305 * The following are provided as chainable getters to |
| 306 * improve the readability of your assertions. They |
| 307 * do not provide testing capabilities unless they |
| 308 * have been overwritten by a plugin. |
| 309 * |
| 310 * **Chains** |
| 311 * |
| 312 * - to |
| 313 * - be |
| 314 * - been |
| 315 * - is |
| 316 * - that |
| 317 * - which |
| 318 * - and |
| 319 * - has |
| 320 * - have |
| 321 * - with |
| 322 * - at |
| 323 * - of |
| 324 * - same |
| 325 * |
| 326 * @name language chains |
| 327 * @namespace BDD |
| 328 * @api public |
| 329 */ |
| 330 |
| 331 [ 'to', 'be', 'been' |
| 332 , 'is', 'and', 'has', 'have' |
| 333 , 'with', 'that', 'which', 'at' |
| 334 , 'of', 'same' ].forEach(function (chain) { |
| 335 Assertion.addProperty(chain, function () { |
| 336 return this; |
| 337 }); |
| 338 }); |
| 339 |
| 340 /** |
| 341 * ### .not |
| 342 * |
| 343 * Negates any of assertions following in the chain. |
| 344 * |
| 345 * expect(foo).to.not.equal('bar'); |
| 346 * expect(goodFn).to.not.throw(Error); |
| 347 * expect({ foo: 'baz' }).to.have.property('foo') |
| 348 * .and.not.equal('bar'); |
| 349 * |
| 350 * @name not |
| 351 * @namespace BDD |
| 352 * @api public |
| 353 */ |
| 354 |
| 355 Assertion.addProperty('not', function () { |
| 356 flag(this, 'negate', true); |
| 357 }); |
| 358 |
| 359 /** |
| 360 * ### .deep |
| 361 * |
| 362 * Sets the `deep` flag, later used by the `equal` and |
| 363 * `property` assertions. |
| 364 * |
| 365 * expect(foo).to.deep.equal({ bar: 'baz' }); |
| 366 * expect({ foo: { bar: { baz: 'quux' } } }) |
| 367 * .to.have.deep.property('foo.bar.baz', 'quux'); |
| 368 * |
| 369 * `.deep.property` special characters can be escaped |
| 370 * by adding two slashes before the `.` or `[]`. |
| 371 * |
| 372 * var deepCss = { '.link': { '[target]': 42 }}; |
| 373 * expect(deepCss).to.have.deep.property('\\.link.\\[target\\]', 42); |
| 374 * |
| 375 * @name deep |
| 376 * @namespace BDD |
| 377 * @api public |
| 378 */ |
| 379 |
| 380 Assertion.addProperty('deep', function () { |
| 381 flag(this, 'deep', true); |
| 382 }); |
| 383 |
| 384 /** |
| 385 * ### .any |
| 386 * |
| 387 * Sets the `any` flag, (opposite of the `all` flag) |
| 388 * later used in the `keys` assertion. |
| 389 * |
| 390 * expect(foo).to.have.any.keys('bar', 'baz'); |
| 391 * |
| 392 * @name any |
| 393 * @namespace BDD |
| 394 * @api public |
| 395 */ |
| 396 |
| 397 Assertion.addProperty('any', function () { |
| 398 flag(this, 'any', true); |
| 399 flag(this, 'all', false) |
| 400 }); |
| 401 |
| 402 |
| 403 /** |
| 404 * ### .all |
| 405 * |
| 406 * Sets the `all` flag (opposite of the `any` flag) |
| 407 * later used by the `keys` assertion. |
| 408 * |
| 409 * expect(foo).to.have.all.keys('bar', 'baz'); |
| 410 * |
| 411 * @name all |
| 412 * @namespace BDD |
| 413 * @api public |
| 414 */ |
| 415 |
| 416 Assertion.addProperty('all', function () { |
| 417 flag(this, 'all', true); |
| 418 flag(this, 'any', false); |
| 419 }); |
| 420 |
| 421 /** |
| 422 * ### .a(type) |
| 423 * |
| 424 * The `a` and `an` assertions are aliases that can be |
| 425 * used either as language chains or to assert a value's |
| 426 * type. |
| 427 * |
| 428 * // typeof |
| 429 * expect('test').to.be.a('string'); |
| 430 * expect({ foo: 'bar' }).to.be.an('object'); |
| 431 * expect(null).to.be.a('null'); |
| 432 * expect(undefined).to.be.an('undefined'); |
| 433 * expect(new Error).to.be.an('error'); |
| 434 * expect(new Promise).to.be.a('promise'); |
| 435 * expect(new Float32Array()).to.be.a('float32array'); |
| 436 * expect(Symbol()).to.be.a('symbol'); |
| 437 * |
| 438 * // es6 overrides |
| 439 * expect({[Symbol.toStringTag]:()=>'foo'}).to.be.a('foo'); |
| 440 * |
| 441 * // language chain |
| 442 * expect(foo).to.be.an.instanceof(Foo); |
| 443 * |
| 444 * @name a |
| 445 * @alias an |
| 446 * @param {String} type |
| 447 * @param {String} message _optional_ |
| 448 * @namespace BDD |
| 449 * @api public |
| 450 */ |
| 451 |
| 452 function an (type, msg) { |
| 453 if (msg) flag(this, 'message', msg); |
| 454 type = type.toLowerCase(); |
| 455 var obj = flag(this, 'object') |
| 456 , article = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(type.charAt(0)) ? 'an ' :
'a '; |
| 457 |
| 458 this.assert( |
| 459 type === _.type(obj) |
| 460 , 'expected #{this} to be ' + article + type |
| 461 , 'expected #{this} not to be ' + article + type |
| 462 ); |
| 463 } |
| 464 |
| 465 Assertion.addChainableMethod('an', an); |
| 466 Assertion.addChainableMethod('a', an); |
| 467 |
| 468 /** |
| 469 * ### .include(value) |
| 470 * |
| 471 * The `include` and `contain` assertions can be used as either property |
| 472 * based language chains or as methods to assert the inclusion of an object |
| 473 * in an array or a substring in a string. When used as language chains, |
| 474 * they toggle the `contains` flag for the `keys` assertion. |
| 475 * |
| 476 * expect([1,2,3]).to.include(2); |
| 477 * expect('foobar').to.contain('foo'); |
| 478 * expect({ foo: 'bar', hello: 'universe' }).to.include.keys('foo'); |
| 479 * |
| 480 * @name include |
| 481 * @alias contain |
| 482 * @alias includes |
| 483 * @alias contains |
| 484 * @param {Object|String|Number} obj |
| 485 * @param {String} message _optional_ |
| 486 * @namespace BDD |
| 487 * @api public |
| 488 */ |
| 489 |
| 490 function includeChainingBehavior () { |
| 491 flag(this, 'contains', true); |
| 492 } |
| 493 |
| 494 function include (val, msg) { |
| 495 _.expectTypes(this, ['array', 'object', 'string']); |
| 496 |
| 497 if (msg) flag(this, 'message', msg); |
| 498 var obj = flag(this, 'object'); |
| 499 var expected = false; |
| 500 |
| 501 if (_.type(obj) === 'array' && _.type(val) === 'object') { |
| 502 for (var i in obj) { |
| 503 if (_.eql(obj[i], val)) { |
| 504 expected = true; |
| 505 break; |
| 506 } |
| 507 } |
| 508 } else if (_.type(val) === 'object') { |
| 509 if (!flag(this, 'negate')) { |
| 510 for (var k in val) new Assertion(obj).property(k, val[k]); |
| 511 return; |
| 512 } |
| 513 var subset = {}; |
| 514 for (var k in val) subset[k] = obj[k]; |
| 515 expected = _.eql(subset, val); |
| 516 } else { |
| 517 expected = (obj != undefined) && ~obj.indexOf(val); |
| 518 } |
| 519 this.assert( |
| 520 expected |
| 521 , 'expected #{this} to include ' + _.inspect(val) |
| 522 , 'expected #{this} to not include ' + _.inspect(val)); |
| 523 } |
| 524 |
| 525 Assertion.addChainableMethod('include', include, includeChainingBehavior); |
| 526 Assertion.addChainableMethod('contain', include, includeChainingBehavior); |
| 527 Assertion.addChainableMethod('contains', include, includeChainingBehavior); |
| 528 Assertion.addChainableMethod('includes', include, includeChainingBehavior); |
| 529 |
| 530 /** |
| 531 * ### .ok |
| 532 * |
| 533 * Asserts that the target is truthy. |
| 534 * |
| 535 * expect('everything').to.be.ok; |
| 536 * expect(1).to.be.ok; |
| 537 * expect(false).to.not.be.ok; |
| 538 * expect(undefined).to.not.be.ok; |
| 539 * expect(null).to.not.be.ok; |
| 540 * |
| 541 * @name ok |
| 542 * @namespace BDD |
| 543 * @api public |
| 544 */ |
| 545 |
| 546 Assertion.addProperty('ok', function () { |
| 547 this.assert( |
| 548 flag(this, 'object') |
| 549 , 'expected #{this} to be truthy' |
| 550 , 'expected #{this} to be falsy'); |
| 551 }); |
| 552 |
| 553 /** |
| 554 * ### .true |
| 555 * |
| 556 * Asserts that the target is `true`. |
| 557 * |
| 558 * expect(true).to.be.true; |
| 559 * expect(1).to.not.be.true; |
| 560 * |
| 561 * @name true |
| 562 * @namespace BDD |
| 563 * @api public |
| 564 */ |
| 565 |
| 566 Assertion.addProperty('true', function () { |
| 567 this.assert( |
| 568 true === flag(this, 'object') |
| 569 , 'expected #{this} to be true' |
| 570 , 'expected #{this} to be false' |
| 571 , this.negate ? false : true |
| 572 ); |
| 573 }); |
| 574 |
| 575 /** |
| 576 * ### .false |
| 577 * |
| 578 * Asserts that the target is `false`. |
| 579 * |
| 580 * expect(false).to.be.false; |
| 581 * expect(0).to.not.be.false; |
| 582 * |
| 583 * @name false |
| 584 * @namespace BDD |
| 585 * @api public |
| 586 */ |
| 587 |
| 588 Assertion.addProperty('false', function () { |
| 589 this.assert( |
| 590 false === flag(this, 'object') |
| 591 , 'expected #{this} to be false' |
| 592 , 'expected #{this} to be true' |
| 593 , this.negate ? true : false |
| 594 ); |
| 595 }); |
| 596 |
| 597 /** |
| 598 * ### .null |
| 599 * |
| 600 * Asserts that the target is `null`. |
| 601 * |
| 602 * expect(null).to.be.null; |
| 603 * expect(undefined).to.not.be.null; |
| 604 * |
| 605 * @name null |
| 606 * @namespace BDD |
| 607 * @api public |
| 608 */ |
| 609 |
| 610 Assertion.addProperty('null', function () { |
| 611 this.assert( |
| 612 null === flag(this, 'object') |
| 613 , 'expected #{this} to be null' |
| 614 , 'expected #{this} not to be null' |
| 615 ); |
| 616 }); |
| 617 |
| 618 /** |
| 619 * ### .undefined |
| 620 * |
| 621 * Asserts that the target is `undefined`. |
| 622 * |
| 623 * expect(undefined).to.be.undefined; |
| 624 * expect(null).to.not.be.undefined; |
| 625 * |
| 626 * @name undefined |
| 627 * @namespace BDD |
| 628 * @api public |
| 629 */ |
| 630 |
| 631 Assertion.addProperty('undefined', function () { |
| 632 this.assert( |
| 633 undefined === flag(this, 'object') |
| 634 , 'expected #{this} to be undefined' |
| 635 , 'expected #{this} not to be undefined' |
| 636 ); |
| 637 }); |
| 638 |
| 639 /** |
| 640 * ### .NaN |
| 641 * Asserts that the target is `NaN`. |
| 642 * |
| 643 * expect('foo').to.be.NaN; |
| 644 * expect(4).not.to.be.NaN; |
| 645 * |
| 646 * @name NaN |
| 647 * @namespace BDD |
| 648 * @api public |
| 649 */ |
| 650 |
| 651 Assertion.addProperty('NaN', function () { |
| 652 this.assert( |
| 653 isNaN(flag(this, 'object')) |
| 654 , 'expected #{this} to be NaN' |
| 655 , 'expected #{this} not to be NaN' |
| 656 ); |
| 657 }); |
| 658 |
| 659 /** |
| 660 * ### .exist |
| 661 * |
| 662 * Asserts that the target is neither `null` nor `undefined`. |
| 663 * |
| 664 * var foo = 'hi' |
| 665 * , bar = null |
| 666 * , baz; |
| 667 * |
| 668 * expect(foo).to.exist; |
| 669 * expect(bar).to.not.exist; |
| 670 * expect(baz).to.not.exist; |
| 671 * |
| 672 * @name exist |
| 673 * @namespace BDD |
| 674 * @api public |
| 675 */ |
| 676 |
| 677 Assertion.addProperty('exist', function () { |
| 678 this.assert( |
| 679 null != flag(this, 'object') |
| 680 , 'expected #{this} to exist' |
| 681 , 'expected #{this} to not exist' |
| 682 ); |
| 683 }); |
| 684 |
| 685 |
| 686 /** |
| 687 * ### .empty |
| 688 * |
| 689 * Asserts that the target's length is `0`. For arrays and strings, it checks |
| 690 * the `length` property. For objects, it gets the count of |
| 691 * enumerable keys. |
| 692 * |
| 693 * expect([]).to.be.empty; |
| 694 * expect('').to.be.empty; |
| 695 * expect({}).to.be.empty; |
| 696 * |
| 697 * @name empty |
| 698 * @namespace BDD |
| 699 * @api public |
| 700 */ |
| 701 |
| 702 Assertion.addProperty('empty', function () { |
| 703 var obj = flag(this, 'object') |
| 704 , expected = obj; |
| 705 |
| 706 if (Array.isArray(obj) || 'string' === typeof object) { |
| 707 expected = obj.length; |
| 708 } else if (typeof obj === 'object') { |
| 709 expected = Object.keys(obj).length; |
| 710 } |
| 711 |
| 712 this.assert( |
| 713 !expected |
| 714 , 'expected #{this} to be empty' |
| 715 , 'expected #{this} not to be empty' |
| 716 ); |
| 717 }); |
| 718 |
| 719 /** |
| 720 * ### .arguments |
| 721 * |
| 722 * Asserts that the target is an arguments object. |
| 723 * |
| 724 * function test () { |
| 725 * expect(arguments).to.be.arguments; |
| 726 * } |
| 727 * |
| 728 * @name arguments |
| 729 * @alias Arguments |
| 730 * @namespace BDD |
| 731 * @api public |
| 732 */ |
| 733 |
| 734 function checkArguments () { |
| 735 var obj = flag(this, 'object') |
| 736 , type = Object.prototype.toString.call(obj); |
| 737 this.assert( |
| 738 '[object Arguments]' === type |
| 739 , 'expected #{this} to be arguments but got ' + type |
| 740 , 'expected #{this} to not be arguments' |
| 741 ); |
| 742 } |
| 743 |
| 744 Assertion.addProperty('arguments', checkArguments); |
| 745 Assertion.addProperty('Arguments', checkArguments); |
| 746 |
| 747 /** |
| 748 * ### .equal(value) |
| 749 * |
| 750 * Asserts that the target is strictly equal (`===`) to `value`. |
| 751 * Alternately, if the `deep` flag is set, asserts that |
| 752 * the target is deeply equal to `value`. |
| 753 * |
| 754 * expect('hello').to.equal('hello'); |
| 755 * expect(42).to.equal(42); |
| 756 * expect(1).to.not.equal(true); |
| 757 * expect({ foo: 'bar' }).to.not.equal({ foo: 'bar' }); |
| 758 * expect({ foo: 'bar' }).to.deep.equal({ foo: 'bar' }); |
| 759 * |
| 760 * @name equal |
| 761 * @alias equals |
| 762 * @alias eq |
| 763 * @alias deep.equal |
| 764 * @param {Mixed} value |
| 765 * @param {String} message _optional_ |
| 766 * @namespace BDD |
| 767 * @api public |
| 768 */ |
| 769 |
| 770 function assertEqual (val, msg) { |
| 771 if (msg) flag(this, 'message', msg); |
| 772 var obj = flag(this, 'object'); |
| 773 if (flag(this, 'deep')) { |
| 774 return this.eql(val); |
| 775 } else { |
| 776 this.assert( |
| 777 val === obj |
| 778 , 'expected #{this} to equal #{exp}' |
| 779 , 'expected #{this} to not equal #{exp}' |
| 780 , val |
| 781 , this._obj |
| 782 , true |
| 783 ); |
| 784 } |
| 785 } |
| 786 |
| 787 Assertion.addMethod('equal', assertEqual); |
| 788 Assertion.addMethod('equals', assertEqual); |
| 789 Assertion.addMethod('eq', assertEqual); |
| 790 |
| 791 /** |
| 792 * ### .eql(value) |
| 793 * |
| 794 * Asserts that the target is deeply equal to `value`. |
| 795 * |
| 796 * expect({ foo: 'bar' }).to.eql({ foo: 'bar' }); |
| 797 * expect([ 1, 2, 3 ]).to.eql([ 1, 2, 3 ]); |
| 798 * |
| 799 * @name eql |
| 800 * @alias eqls |
| 801 * @param {Mixed} value |
| 802 * @param {String} message _optional_ |
| 803 * @namespace BDD |
| 804 * @api public |
| 805 */ |
| 806 |
| 807 function assertEql(obj, msg) { |
| 808 if (msg) flag(this, 'message', msg); |
| 809 this.assert( |
| 810 _.eql(obj, flag(this, 'object')) |
| 811 , 'expected #{this} to deeply equal #{exp}' |
| 812 , 'expected #{this} to not deeply equal #{exp}' |
| 813 , obj |
| 814 , this._obj |
| 815 , true |
| 816 ); |
| 817 } |
| 818 |
| 819 Assertion.addMethod('eql', assertEql); |
| 820 Assertion.addMethod('eqls', assertEql); |
| 821 |
| 822 /** |
| 823 * ### .above(value) |
| 824 * |
| 825 * Asserts that the target is greater than `value`. |
| 826 * |
| 827 * expect(10).to.be.above(5); |
| 828 * |
| 829 * Can also be used in conjunction with `length` to |
| 830 * assert a minimum length. The benefit being a |
| 831 * more informative error message than if the length |
| 832 * was supplied directly. |
| 833 * |
| 834 * expect('foo').to.have.length.above(2); |
| 835 * expect([ 1, 2, 3 ]).to.have.length.above(2); |
| 836 * |
| 837 * @name above |
| 838 * @alias gt |
| 839 * @alias greaterThan |
| 840 * @param {Number} value |
| 841 * @param {String} message _optional_ |
| 842 * @namespace BDD |
| 843 * @api public |
| 844 */ |
| 845 |
| 846 function assertAbove (n, msg) { |
| 847 if (msg) flag(this, 'message', msg); |
| 848 var obj = flag(this, 'object'); |
| 849 if (flag(this, 'doLength')) { |
| 850 new Assertion(obj, msg).to.have.property('length'); |
| 851 var len = obj.length; |
| 852 this.assert( |
| 853 len > n |
| 854 , 'expected #{this} to have a length above #{exp} but got #{act}' |
| 855 , 'expected #{this} to not have a length above #{exp}' |
| 856 , n |
| 857 , len |
| 858 ); |
| 859 } else { |
| 860 this.assert( |
| 861 obj > n |
| 862 , 'expected #{this} to be above ' + n |
| 863 , 'expected #{this} to be at most ' + n |
| 864 ); |
| 865 } |
| 866 } |
| 867 |
| 868 Assertion.addMethod('above', assertAbove); |
| 869 Assertion.addMethod('gt', assertAbove); |
| 870 Assertion.addMethod('greaterThan', assertAbove); |
| 871 |
| 872 /** |
| 873 * ### .least(value) |
| 874 * |
| 875 * Asserts that the target is greater than or equal to `value`. |
| 876 * |
| 877 * expect(10).to.be.at.least(10); |
| 878 * |
| 879 * Can also be used in conjunction with `length` to |
| 880 * assert a minimum length. The benefit being a |
| 881 * more informative error message than if the length |
| 882 * was supplied directly. |
| 883 * |
| 884 * expect('foo').to.have.length.of.at.least(2); |
| 885 * expect([ 1, 2, 3 ]).to.have.length.of.at.least(3); |
| 886 * |
| 887 * @name least |
| 888 * @alias gte |
| 889 * @param {Number} value |
| 890 * @param {String} message _optional_ |
| 891 * @namespace BDD |
| 892 * @api public |
| 893 */ |
| 894 |
| 895 function assertLeast (n, msg) { |
| 896 if (msg) flag(this, 'message', msg); |
| 897 var obj = flag(this, 'object'); |
| 898 if (flag(this, 'doLength')) { |
| 899 new Assertion(obj, msg).to.have.property('length'); |
| 900 var len = obj.length; |
| 901 this.assert( |
| 902 len >= n |
| 903 , 'expected #{this} to have a length at least #{exp} but got #{act}' |
| 904 , 'expected #{this} to have a length below #{exp}' |
| 905 , n |
| 906 , len |
| 907 ); |
| 908 } else { |
| 909 this.assert( |
| 910 obj >= n |
| 911 , 'expected #{this} to be at least ' + n |
| 912 , 'expected #{this} to be below ' + n |
| 913 ); |
| 914 } |
| 915 } |
| 916 |
| 917 Assertion.addMethod('least', assertLeast); |
| 918 Assertion.addMethod('gte', assertLeast); |
| 919 |
| 920 /** |
| 921 * ### .below(value) |
| 922 * |
| 923 * Asserts that the target is less than `value`. |
| 924 * |
| 925 * expect(5).to.be.below(10); |
| 926 * |
| 927 * Can also be used in conjunction with `length` to |
| 928 * assert a maximum length. The benefit being a |
| 929 * more informative error message than if the length |
| 930 * was supplied directly. |
| 931 * |
| 932 * expect('foo').to.have.length.below(4); |
| 933 * expect([ 1, 2, 3 ]).to.have.length.below(4); |
| 934 * |
| 935 * @name below |
| 936 * @alias lt |
| 937 * @alias lessThan |
| 938 * @param {Number} value |
| 939 * @param {String} message _optional_ |
| 940 * @namespace BDD |
| 941 * @api public |
| 942 */ |
| 943 |
| 944 function assertBelow (n, msg) { |
| 945 if (msg) flag(this, 'message', msg); |
| 946 var obj = flag(this, 'object'); |
| 947 if (flag(this, 'doLength')) { |
| 948 new Assertion(obj, msg).to.have.property('length'); |
| 949 var len = obj.length; |
| 950 this.assert( |
| 951 len < n |
| 952 , 'expected #{this} to have a length below #{exp} but got #{act}' |
| 953 , 'expected #{this} to not have a length below #{exp}' |
| 954 , n |
| 955 , len |
| 956 ); |
| 957 } else { |
| 958 this.assert( |
| 959 obj < n |
| 960 , 'expected #{this} to be below ' + n |
| 961 , 'expected #{this} to be at least ' + n |
| 962 ); |
| 963 } |
| 964 } |
| 965 |
| 966 Assertion.addMethod('below', assertBelow); |
| 967 Assertion.addMethod('lt', assertBelow); |
| 968 Assertion.addMethod('lessThan', assertBelow); |
| 969 |
| 970 /** |
| 971 * ### .most(value) |
| 972 * |
| 973 * Asserts that the target is less than or equal to `value`. |
| 974 * |
| 975 * expect(5).to.be.at.most(5); |
| 976 * |
| 977 * Can also be used in conjunction with `length` to |
| 978 * assert a maximum length. The benefit being a |
| 979 * more informative error message than if the length |
| 980 * was supplied directly. |
| 981 * |
| 982 * expect('foo').to.have.length.of.at.most(4); |
| 983 * expect([ 1, 2, 3 ]).to.have.length.of.at.most(3); |
| 984 * |
| 985 * @name most |
| 986 * @alias lte |
| 987 * @param {Number} value |
| 988 * @param {String} message _optional_ |
| 989 * @namespace BDD |
| 990 * @api public |
| 991 */ |
| 992 |
| 993 function assertMost (n, msg) { |
| 994 if (msg) flag(this, 'message', msg); |
| 995 var obj = flag(this, 'object'); |
| 996 if (flag(this, 'doLength')) { |
| 997 new Assertion(obj, msg).to.have.property('length'); |
| 998 var len = obj.length; |
| 999 this.assert( |
| 1000 len <= n |
| 1001 , 'expected #{this} to have a length at most #{exp} but got #{act}' |
| 1002 , 'expected #{this} to have a length above #{exp}' |
| 1003 , n |
| 1004 , len |
| 1005 ); |
| 1006 } else { |
| 1007 this.assert( |
| 1008 obj <= n |
| 1009 , 'expected #{this} to be at most ' + n |
| 1010 , 'expected #{this} to be above ' + n |
| 1011 ); |
| 1012 } |
| 1013 } |
| 1014 |
| 1015 Assertion.addMethod('most', assertMost); |
| 1016 Assertion.addMethod('lte', assertMost); |
| 1017 |
| 1018 /** |
| 1019 * ### .within(start, finish) |
| 1020 * |
| 1021 * Asserts that the target is within a range. |
| 1022 * |
| 1023 * expect(7).to.be.within(5,10); |
| 1024 * |
| 1025 * Can also be used in conjunction with `length` to |
| 1026 * assert a length range. The benefit being a |
| 1027 * more informative error message than if the length |
| 1028 * was supplied directly. |
| 1029 * |
| 1030 * expect('foo').to.have.length.within(2,4); |
| 1031 * expect([ 1, 2, 3 ]).to.have.length.within(2,4); |
| 1032 * |
| 1033 * @name within |
| 1034 * @param {Number} start lowerbound inclusive |
| 1035 * @param {Number} finish upperbound inclusive |
| 1036 * @param {String} message _optional_ |
| 1037 * @namespace BDD |
| 1038 * @api public |
| 1039 */ |
| 1040 |
| 1041 Assertion.addMethod('within', function (start, finish, msg) { |
| 1042 if (msg) flag(this, 'message', msg); |
| 1043 var obj = flag(this, 'object') |
| 1044 , range = start + '..' + finish; |
| 1045 if (flag(this, 'doLength')) { |
| 1046 new Assertion(obj, msg).to.have.property('length'); |
| 1047 var len = obj.length; |
| 1048 this.assert( |
| 1049 len >= start && len <= finish |
| 1050 , 'expected #{this} to have a length within ' + range |
| 1051 , 'expected #{this} to not have a length within ' + range |
| 1052 ); |
| 1053 } else { |
| 1054 this.assert( |
| 1055 obj >= start && obj <= finish |
| 1056 , 'expected #{this} to be within ' + range |
| 1057 , 'expected #{this} to not be within ' + range |
| 1058 ); |
| 1059 } |
| 1060 }); |
| 1061 |
| 1062 /** |
| 1063 * ### .instanceof(constructor) |
| 1064 * |
| 1065 * Asserts that the target is an instance of `constructor`. |
| 1066 * |
| 1067 * var Tea = function (name) { this.name = name; } |
| 1068 * , Chai = new Tea('chai'); |
| 1069 * |
| 1070 * expect(Chai).to.be.an.instanceof(Tea); |
| 1071 * expect([ 1, 2, 3 ]).to.be.instanceof(Array); |
| 1072 * |
| 1073 * @name instanceof |
| 1074 * @param {Constructor} constructor |
| 1075 * @param {String} message _optional_ |
| 1076 * @alias instanceOf |
| 1077 * @namespace BDD |
| 1078 * @api public |
| 1079 */ |
| 1080 |
| 1081 function assertInstanceOf (constructor, msg) { |
| 1082 if (msg) flag(this, 'message', msg); |
| 1083 var name = _.getName(constructor); |
| 1084 this.assert( |
| 1085 flag(this, 'object') instanceof constructor |
| 1086 , 'expected #{this} to be an instance of ' + name |
| 1087 , 'expected #{this} to not be an instance of ' + name |
| 1088 ); |
| 1089 }; |
| 1090 |
| 1091 Assertion.addMethod('instanceof', assertInstanceOf); |
| 1092 Assertion.addMethod('instanceOf', assertInstanceOf); |
| 1093 |
| 1094 /** |
| 1095 * ### .property(name, [value]) |
| 1096 * |
| 1097 * Asserts that the target has a property `name`, optionally asserting that |
| 1098 * the value of that property is strictly equal to `value`. |
| 1099 * If the `deep` flag is set, you can use dot- and bracket-notation for deep |
| 1100 * references into objects and arrays. |
| 1101 * |
| 1102 * // simple referencing |
| 1103 * var obj = { foo: 'bar' }; |
| 1104 * expect(obj).to.have.property('foo'); |
| 1105 * expect(obj).to.have.property('foo', 'bar'); |
| 1106 * |
| 1107 * // deep referencing |
| 1108 * var deepObj = { |
| 1109 * green: { tea: 'matcha' } |
| 1110 * , teas: [ 'chai', 'matcha', { tea: 'konacha' } ] |
| 1111 * }; |
| 1112 * |
| 1113 * expect(deepObj).to.have.deep.property('green.tea', 'matcha'); |
| 1114 * expect(deepObj).to.have.deep.property('teas[1]', 'matcha'); |
| 1115 * expect(deepObj).to.have.deep.property('teas[2].tea', 'konacha'); |
| 1116 * |
| 1117 * You can also use an array as the starting point of a `deep.property` |
| 1118 * assertion, or traverse nested arrays. |
| 1119 * |
| 1120 * var arr = [ |
| 1121 * [ 'chai', 'matcha', 'konacha' ] |
| 1122 * , [ { tea: 'chai' } |
| 1123 * , { tea: 'matcha' } |
| 1124 * , { tea: 'konacha' } ] |
| 1125 * ]; |
| 1126 * |
| 1127 * expect(arr).to.have.deep.property('[0][1]', 'matcha'); |
| 1128 * expect(arr).to.have.deep.property('[1][2].tea', 'konacha'); |
| 1129 * |
| 1130 * Furthermore, `property` changes the subject of the assertion |
| 1131 * to be the value of that property from the original object. This |
| 1132 * permits for further chainable assertions on that property. |
| 1133 * |
| 1134 * expect(obj).to.have.property('foo') |
| 1135 * .that.is.a('string'); |
| 1136 * expect(deepObj).to.have.property('green') |
| 1137 * .that.is.an('object') |
| 1138 * .that.deep.equals({ tea: 'matcha' }); |
| 1139 * expect(deepObj).to.have.property('teas') |
| 1140 * .that.is.an('array') |
| 1141 * .with.deep.property('[2]') |
| 1142 * .that.deep.equals({ tea: 'konacha' }); |
| 1143 * |
| 1144 * Note that dots and bracket in `name` must be backslash-escaped when |
| 1145 * the `deep` flag is set, while they must NOT be escaped when the `deep` |
| 1146 * flag is not set. |
| 1147 * |
| 1148 * // simple referencing |
| 1149 * var css = { '.link[target]': 42 }; |
| 1150 * expect(css).to.have.property('.link[target]', 42); |
| 1151 * |
| 1152 * // deep referencing |
| 1153 * var deepCss = { '.link': { '[target]': 42 }}; |
| 1154 * expect(deepCss).to.have.deep.property('\\.link.\\[target\\]', 42); |
| 1155 * |
| 1156 * @name property |
| 1157 * @alias deep.property |
| 1158 * @param {String} name |
| 1159 * @param {Mixed} value (optional) |
| 1160 * @param {String} message _optional_ |
| 1161 * @returns value of property for chaining |
| 1162 * @namespace BDD |
| 1163 * @api public |
| 1164 */ |
| 1165 |
| 1166 Assertion.addMethod('property', function (name, val, msg) { |
| 1167 if (msg) flag(this, 'message', msg); |
| 1168 |
| 1169 var isDeep = !!flag(this, 'deep') |
| 1170 , descriptor = isDeep ? 'deep property ' : 'property ' |
| 1171 , negate = flag(this, 'negate') |
| 1172 , obj = flag(this, 'object') |
| 1173 , pathInfo = isDeep ? _.getPathInfo(name, obj) : null |
| 1174 , hasProperty = isDeep |
| 1175 ? pathInfo.exists |
| 1176 : _.hasProperty(name, obj) |
| 1177 , value = isDeep |
| 1178 ? pathInfo.value |
| 1179 : obj[name]; |
| 1180 |
| 1181 if (negate && arguments.length > 1) { |
| 1182 if (undefined === value) { |
| 1183 msg = (msg != null) ? msg + ': ' : ''; |
| 1184 throw new Error(msg + _.inspect(obj) + ' has no ' + descriptor + _.inspe
ct(name)); |
| 1185 } |
| 1186 } else { |
| 1187 this.assert( |
| 1188 hasProperty |
| 1189 , 'expected #{this} to have a ' + descriptor + _.inspect(name) |
| 1190 , 'expected #{this} to not have ' + descriptor + _.inspect(name)); |
| 1191 } |
| 1192 |
| 1193 if (arguments.length > 1) { |
| 1194 this.assert( |
| 1195 val === value |
| 1196 , 'expected #{this} to have a ' + descriptor + _.inspect(name) + ' of #{
exp}, but got #{act}' |
| 1197 , 'expected #{this} to not have a ' + descriptor + _.inspect(name) + ' o
f #{act}' |
| 1198 , val |
| 1199 , value |
| 1200 ); |
| 1201 } |
| 1202 |
| 1203 flag(this, 'object', value); |
| 1204 }); |
| 1205 |
| 1206 |
| 1207 /** |
| 1208 * ### .ownProperty(name) |
| 1209 * |
| 1210 * Asserts that the target has an own property `name`. |
| 1211 * |
| 1212 * expect('test').to.have.ownProperty('length'); |
| 1213 * |
| 1214 * @name ownProperty |
| 1215 * @alias haveOwnProperty |
| 1216 * @param {String} name |
| 1217 * @param {String} message _optional_ |
| 1218 * @namespace BDD |
| 1219 * @api public |
| 1220 */ |
| 1221 |
| 1222 function assertOwnProperty (name, msg) { |
| 1223 if (msg) flag(this, 'message', msg); |
| 1224 var obj = flag(this, 'object'); |
| 1225 this.assert( |
| 1226 obj.hasOwnProperty(name) |
| 1227 , 'expected #{this} to have own property ' + _.inspect(name) |
| 1228 , 'expected #{this} to not have own property ' + _.inspect(name) |
| 1229 ); |
| 1230 } |
| 1231 |
| 1232 Assertion.addMethod('ownProperty', assertOwnProperty); |
| 1233 Assertion.addMethod('haveOwnProperty', assertOwnProperty); |
| 1234 |
| 1235 /** |
| 1236 * ### .ownPropertyDescriptor(name[, descriptor[, message]]) |
| 1237 * |
| 1238 * Asserts that the target has an own property descriptor `name`, that optiona
lly matches `descriptor`. |
| 1239 * |
| 1240 * expect('test').to.have.ownPropertyDescriptor('length'); |
| 1241 * expect('test').to.have.ownPropertyDescriptor('length', { enumerable: fa
lse, configurable: false, writable: false, value: 4 }); |
| 1242 * expect('test').not.to.have.ownPropertyDescriptor('length', { enumerable
: false, configurable: false, writable: false, value: 3 }); |
| 1243 * expect('test').ownPropertyDescriptor('length').to.have.property('enumer
able', false); |
| 1244 * expect('test').ownPropertyDescriptor('length').to.have.keys('value'); |
| 1245 * |
| 1246 * @name ownPropertyDescriptor |
| 1247 * @alias haveOwnPropertyDescriptor |
| 1248 * @param {String} name |
| 1249 * @param {Object} descriptor _optional_ |
| 1250 * @param {String} message _optional_ |
| 1251 * @namespace BDD |
| 1252 * @api public |
| 1253 */ |
| 1254 |
| 1255 function assertOwnPropertyDescriptor (name, descriptor, msg) { |
| 1256 if (typeof descriptor === 'string') { |
| 1257 msg = descriptor; |
| 1258 descriptor = null; |
| 1259 } |
| 1260 if (msg) flag(this, 'message', msg); |
| 1261 var obj = flag(this, 'object'); |
| 1262 var actualDescriptor = Object.getOwnPropertyDescriptor(Object(obj), name); |
| 1263 if (actualDescriptor && descriptor) { |
| 1264 this.assert( |
| 1265 _.eql(descriptor, actualDescriptor) |
| 1266 , 'expected the own property descriptor for ' + _.inspect(name) + ' on #
{this} to match ' + _.inspect(descriptor) + ', got ' + _.inspect(actualDescripto
r) |
| 1267 , 'expected the own property descriptor for ' + _.inspect(name) + ' on #
{this} to not match ' + _.inspect(descriptor) |
| 1268 , descriptor |
| 1269 , actualDescriptor |
| 1270 , true |
| 1271 ); |
| 1272 } else { |
| 1273 this.assert( |
| 1274 actualDescriptor |
| 1275 , 'expected #{this} to have an own property descriptor for ' + _.inspect
(name) |
| 1276 , 'expected #{this} to not have an own property descriptor for ' + _.ins
pect(name) |
| 1277 ); |
| 1278 } |
| 1279 flag(this, 'object', actualDescriptor); |
| 1280 } |
| 1281 |
| 1282 Assertion.addMethod('ownPropertyDescriptor', assertOwnPropertyDescriptor); |
| 1283 Assertion.addMethod('haveOwnPropertyDescriptor', assertOwnPropertyDescriptor); |
| 1284 |
| 1285 /** |
| 1286 * ### .length |
| 1287 * |
| 1288 * Sets the `doLength` flag later used as a chain precursor to a value |
| 1289 * comparison for the `length` property. |
| 1290 * |
| 1291 * expect('foo').to.have.length.above(2); |
| 1292 * expect([ 1, 2, 3 ]).to.have.length.above(2); |
| 1293 * expect('foo').to.have.length.below(4); |
| 1294 * expect([ 1, 2, 3 ]).to.have.length.below(4); |
| 1295 * expect('foo').to.have.length.within(2,4); |
| 1296 * expect([ 1, 2, 3 ]).to.have.length.within(2,4); |
| 1297 * |
| 1298 * *Deprecation notice:* Using `length` as an assertion will be deprecated |
| 1299 * in version 2.4.0 and removed in 3.0.0. Code using the old style of |
| 1300 * asserting for `length` property value using `length(value)` should be |
| 1301 * switched to use `lengthOf(value)` instead. |
| 1302 * |
| 1303 * @name length |
| 1304 * @namespace BDD |
| 1305 * @api public |
| 1306 */ |
| 1307 |
| 1308 /** |
| 1309 * ### .lengthOf(value[, message]) |
| 1310 * |
| 1311 * Asserts that the target's `length` property has |
| 1312 * the expected value. |
| 1313 * |
| 1314 * expect([ 1, 2, 3]).to.have.lengthOf(3); |
| 1315 * expect('foobar').to.have.lengthOf(6); |
| 1316 * |
| 1317 * @name lengthOf |
| 1318 * @param {Number} length |
| 1319 * @param {String} message _optional_ |
| 1320 * @namespace BDD |
| 1321 * @api public |
| 1322 */ |
| 1323 |
| 1324 function assertLengthChain () { |
| 1325 flag(this, 'doLength', true); |
| 1326 } |
| 1327 |
| 1328 function assertLength (n, msg) { |
| 1329 if (msg) flag(this, 'message', msg); |
| 1330 var obj = flag(this, 'object'); |
| 1331 new Assertion(obj, msg).to.have.property('length'); |
| 1332 var len = obj.length; |
| 1333 |
| 1334 this.assert( |
| 1335 len == n |
| 1336 , 'expected #{this} to have a length of #{exp} but got #{act}' |
| 1337 , 'expected #{this} to not have a length of #{act}' |
| 1338 , n |
| 1339 , len |
| 1340 ); |
| 1341 } |
| 1342 |
| 1343 Assertion.addChainableMethod('length', assertLength, assertLengthChain); |
| 1344 Assertion.addMethod('lengthOf', assertLength); |
| 1345 |
| 1346 /** |
| 1347 * ### .match(regexp) |
| 1348 * |
| 1349 * Asserts that the target matches a regular expression. |
| 1350 * |
| 1351 * expect('foobar').to.match(/^foo/); |
| 1352 * |
| 1353 * @name match |
| 1354 * @alias matches |
| 1355 * @param {RegExp} RegularExpression |
| 1356 * @param {String} message _optional_ |
| 1357 * @namespace BDD |
| 1358 * @api public |
| 1359 */ |
| 1360 function assertMatch(re, msg) { |
| 1361 if (msg) flag(this, 'message', msg); |
| 1362 var obj = flag(this, 'object'); |
| 1363 this.assert( |
| 1364 re.exec(obj) |
| 1365 , 'expected #{this} to match ' + re |
| 1366 , 'expected #{this} not to match ' + re |
| 1367 ); |
| 1368 } |
| 1369 |
| 1370 Assertion.addMethod('match', assertMatch); |
| 1371 Assertion.addMethod('matches', assertMatch); |
| 1372 |
| 1373 /** |
| 1374 * ### .string(string) |
| 1375 * |
| 1376 * Asserts that the string target contains another string. |
| 1377 * |
| 1378 * expect('foobar').to.have.string('bar'); |
| 1379 * |
| 1380 * @name string |
| 1381 * @param {String} string |
| 1382 * @param {String} message _optional_ |
| 1383 * @namespace BDD |
| 1384 * @api public |
| 1385 */ |
| 1386 |
| 1387 Assertion.addMethod('string', function (str, msg) { |
| 1388 if (msg) flag(this, 'message', msg); |
| 1389 var obj = flag(this, 'object'); |
| 1390 new Assertion(obj, msg).is.a('string'); |
| 1391 |
| 1392 this.assert( |
| 1393 ~obj.indexOf(str) |
| 1394 , 'expected #{this} to contain ' + _.inspect(str) |
| 1395 , 'expected #{this} to not contain ' + _.inspect(str) |
| 1396 ); |
| 1397 }); |
| 1398 |
| 1399 |
| 1400 /** |
| 1401 * ### .keys(key1, [key2], [...]) |
| 1402 * |
| 1403 * Asserts that the target contains any or all of the passed-in keys. |
| 1404 * Use in combination with `any`, `all`, `contains`, or `have` will affect |
| 1405 * what will pass. |
| 1406 * |
| 1407 * When used in conjunction with `any`, at least one key that is passed |
| 1408 * in must exist in the target object. This is regardless whether or not |
| 1409 * the `have` or `contain` qualifiers are used. Note, either `any` or `all` |
| 1410 * should be used in the assertion. If neither are used, the assertion is |
| 1411 * defaulted to `all`. |
| 1412 * |
| 1413 * When both `all` and `contain` are used, the target object must have at |
| 1414 * least all of the passed-in keys but may have more keys not listed. |
| 1415 * |
| 1416 * When both `all` and `have` are used, the target object must both contain |
| 1417 * all of the passed-in keys AND the number of keys in the target object must |
| 1418 * match the number of keys passed in (in other words, a target object must |
| 1419 * have all and only all of the passed-in keys). |
| 1420 * |
| 1421 * expect({ foo: 1, bar: 2 }).to.have.any.keys('foo', 'baz'); |
| 1422 * expect({ foo: 1, bar: 2 }).to.have.any.keys('foo'); |
| 1423 * expect({ foo: 1, bar: 2 }).to.contain.any.keys('bar', 'baz'); |
| 1424 * expect({ foo: 1, bar: 2 }).to.contain.any.keys(['foo']); |
| 1425 * expect({ foo: 1, bar: 2 }).to.contain.any.keys({'foo': 6}); |
| 1426 * expect({ foo: 1, bar: 2 }).to.have.all.keys(['bar', 'foo']); |
| 1427 * expect({ foo: 1, bar: 2 }).to.have.all.keys({'bar': 6, 'foo': 7}); |
| 1428 * expect({ foo: 1, bar: 2, baz: 3 }).to.contain.all.keys(['bar', 'foo']); |
| 1429 * expect({ foo: 1, bar: 2, baz: 3 }).to.contain.all.keys({'bar': 6}); |
| 1430 * |
| 1431 * |
| 1432 * @name keys |
| 1433 * @alias key |
| 1434 * @param {...String|Array|Object} keys |
| 1435 * @namespace BDD |
| 1436 * @api public |
| 1437 */ |
| 1438 |
| 1439 function assertKeys (keys) { |
| 1440 var obj = flag(this, 'object') |
| 1441 , str |
| 1442 , ok = true |
| 1443 , mixedArgsMsg = 'keys must be given single argument of Array|Object|Strin
g, or multiple String arguments'; |
| 1444 |
| 1445 switch (_.type(keys)) { |
| 1446 case "array": |
| 1447 if (arguments.length > 1) throw (new Error(mixedArgsMsg)); |
| 1448 break; |
| 1449 case "object": |
| 1450 if (arguments.length > 1) throw (new Error(mixedArgsMsg)); |
| 1451 keys = Object.keys(keys); |
| 1452 break; |
| 1453 default: |
| 1454 keys = Array.prototype.slice.call(arguments); |
| 1455 } |
| 1456 |
| 1457 if (!keys.length) throw new Error('keys required'); |
| 1458 |
| 1459 var actual = Object.keys(obj) |
| 1460 , expected = keys |
| 1461 , len = keys.length |
| 1462 , any = flag(this, 'any') |
| 1463 , all = flag(this, 'all'); |
| 1464 |
| 1465 if (!any && !all) { |
| 1466 all = true; |
| 1467 } |
| 1468 |
| 1469 // Has any |
| 1470 if (any) { |
| 1471 var intersection = expected.filter(function(key) { |
| 1472 return ~actual.indexOf(key); |
| 1473 }); |
| 1474 ok = intersection.length > 0; |
| 1475 } |
| 1476 |
| 1477 // Has all |
| 1478 if (all) { |
| 1479 ok = keys.every(function(key){ |
| 1480 return ~actual.indexOf(key); |
| 1481 }); |
| 1482 if (!flag(this, 'negate') && !flag(this, 'contains')) { |
| 1483 ok = ok && keys.length == actual.length; |
| 1484 } |
| 1485 } |
| 1486 |
| 1487 // Key string |
| 1488 if (len > 1) { |
| 1489 keys = keys.map(function(key){ |
| 1490 return _.inspect(key); |
| 1491 }); |
| 1492 var last = keys.pop(); |
| 1493 if (all) { |
| 1494 str = keys.join(', ') + ', and ' + last; |
| 1495 } |
| 1496 if (any) { |
| 1497 str = keys.join(', ') + ', or ' + last; |
| 1498 } |
| 1499 } else { |
| 1500 str = _.inspect(keys[0]); |
| 1501 } |
| 1502 |
| 1503 // Form |
| 1504 str = (len > 1 ? 'keys ' : 'key ') + str; |
| 1505 |
| 1506 // Have / include |
| 1507 str = (flag(this, 'contains') ? 'contain ' : 'have ') + str; |
| 1508 |
| 1509 // Assertion |
| 1510 this.assert( |
| 1511 ok |
| 1512 , 'expected #{this} to ' + str |
| 1513 , 'expected #{this} to not ' + str |
| 1514 , expected.slice(0).sort() |
| 1515 , actual.sort() |
| 1516 , true |
| 1517 ); |
| 1518 } |
| 1519 |
| 1520 Assertion.addMethod('keys', assertKeys); |
| 1521 Assertion.addMethod('key', assertKeys); |
| 1522 |
| 1523 /** |
| 1524 * ### .throw(constructor) |
| 1525 * |
| 1526 * Asserts that the function target will throw a specific error, or specific t
ype of error |
| 1527 * (as determined using `instanceof`), optionally with a RegExp or string incl
usion test |
| 1528 * for the error's message. |
| 1529 * |
| 1530 * var err = new ReferenceError('This is a bad function.'); |
| 1531 * var fn = function () { throw err; } |
| 1532 * expect(fn).to.throw(ReferenceError); |
| 1533 * expect(fn).to.throw(Error); |
| 1534 * expect(fn).to.throw(/bad function/); |
| 1535 * expect(fn).to.not.throw('good function'); |
| 1536 * expect(fn).to.throw(ReferenceError, /bad function/); |
| 1537 * expect(fn).to.throw(err); |
| 1538 * |
| 1539 * Please note that when a throw expectation is negated, it will check each |
| 1540 * parameter independently, starting with error constructor type. The appropri
ate way |
| 1541 * to check for the existence of a type of error but for a message that does n
ot match |
| 1542 * is to use `and`. |
| 1543 * |
| 1544 * expect(fn).to.throw(ReferenceError) |
| 1545 * .and.not.throw(/good function/); |
| 1546 * |
| 1547 * @name throw |
| 1548 * @alias throws |
| 1549 * @alias Throw |
| 1550 * @param {ErrorConstructor} constructor |
| 1551 * @param {String|RegExp} expected error message |
| 1552 * @param {String} message _optional_ |
| 1553 * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/E
rror#Error_types |
| 1554 * @returns error for chaining (null if no error) |
| 1555 * @namespace BDD |
| 1556 * @api public |
| 1557 */ |
| 1558 |
| 1559 function assertThrows (constructor, errMsg, msg) { |
| 1560 if (msg) flag(this, 'message', msg); |
| 1561 var obj = flag(this, 'object'); |
| 1562 new Assertion(obj, msg).is.a('function'); |
| 1563 |
| 1564 var thrown = false |
| 1565 , desiredError = null |
| 1566 , name = null |
| 1567 , thrownError = null; |
| 1568 |
| 1569 if (arguments.length === 0) { |
| 1570 errMsg = null; |
| 1571 constructor = null; |
| 1572 } else if (constructor && (constructor instanceof RegExp || 'string' === typ
eof constructor)) { |
| 1573 errMsg = constructor; |
| 1574 constructor = null; |
| 1575 } else if (constructor && constructor instanceof Error) { |
| 1576 desiredError = constructor; |
| 1577 constructor = null; |
| 1578 errMsg = null; |
| 1579 } else if (typeof constructor === 'function') { |
| 1580 name = constructor.prototype.name; |
| 1581 if (!name || (name === 'Error' && constructor !== Error)) { |
| 1582 name = constructor.name || (new constructor()).name; |
| 1583 } |
| 1584 } else { |
| 1585 constructor = null; |
| 1586 } |
| 1587 |
| 1588 try { |
| 1589 obj(); |
| 1590 } catch (err) { |
| 1591 // first, check desired error |
| 1592 if (desiredError) { |
| 1593 this.assert( |
| 1594 err === desiredError |
| 1595 , 'expected #{this} to throw #{exp} but #{act} was thrown' |
| 1596 , 'expected #{this} to not throw #{exp}' |
| 1597 , (desiredError instanceof Error ? desiredError.toString() : desiredEr
ror) |
| 1598 , (err instanceof Error ? err.toString() : err) |
| 1599 ); |
| 1600 |
| 1601 flag(this, 'object', err); |
| 1602 return this; |
| 1603 } |
| 1604 |
| 1605 // next, check constructor |
| 1606 if (constructor) { |
| 1607 this.assert( |
| 1608 err instanceof constructor |
| 1609 , 'expected #{this} to throw #{exp} but #{act} was thrown' |
| 1610 , 'expected #{this} to not throw #{exp} but #{act} was thrown' |
| 1611 , name |
| 1612 , (err instanceof Error ? err.toString() : err) |
| 1613 ); |
| 1614 |
| 1615 if (!errMsg) { |
| 1616 flag(this, 'object', err); |
| 1617 return this; |
| 1618 } |
| 1619 } |
| 1620 |
| 1621 // next, check message |
| 1622 var message = 'error' === _.type(err) && "message" in err |
| 1623 ? err.message |
| 1624 : '' + err; |
| 1625 |
| 1626 if ((message != null) && errMsg && errMsg instanceof RegExp) { |
| 1627 this.assert( |
| 1628 errMsg.exec(message) |
| 1629 , 'expected #{this} to throw error matching #{exp} but got #{act}' |
| 1630 , 'expected #{this} to throw error not matching #{exp}' |
| 1631 , errMsg |
| 1632 , message |
| 1633 ); |
| 1634 |
| 1635 flag(this, 'object', err); |
| 1636 return this; |
| 1637 } else if ((message != null) && errMsg && 'string' === typeof errMsg) { |
| 1638 this.assert( |
| 1639 ~message.indexOf(errMsg) |
| 1640 , 'expected #{this} to throw error including #{exp} but got #{act}' |
| 1641 , 'expected #{this} to throw error not including #{act}' |
| 1642 , errMsg |
| 1643 , message |
| 1644 ); |
| 1645 |
| 1646 flag(this, 'object', err); |
| 1647 return this; |
| 1648 } else { |
| 1649 thrown = true; |
| 1650 thrownError = err; |
| 1651 } |
| 1652 } |
| 1653 |
| 1654 var actuallyGot = '' |
| 1655 , expectedThrown = name !== null |
| 1656 ? name |
| 1657 : desiredError |
| 1658 ? '#{exp}' //_.inspect(desiredError) |
| 1659 : 'an error'; |
| 1660 |
| 1661 if (thrown) { |
| 1662 actuallyGot = ' but #{act} was thrown' |
| 1663 } |
| 1664 |
| 1665 this.assert( |
| 1666 thrown === true |
| 1667 , 'expected #{this} to throw ' + expectedThrown + actuallyGot |
| 1668 , 'expected #{this} to not throw ' + expectedThrown + actuallyGot |
| 1669 , (desiredError instanceof Error ? desiredError.toString() : desiredError) |
| 1670 , (thrownError instanceof Error ? thrownError.toString() : thrownError) |
| 1671 ); |
| 1672 |
| 1673 flag(this, 'object', thrownError); |
| 1674 }; |
| 1675 |
| 1676 Assertion.addMethod('throw', assertThrows); |
| 1677 Assertion.addMethod('throws', assertThrows); |
| 1678 Assertion.addMethod('Throw', assertThrows); |
| 1679 |
| 1680 /** |
| 1681 * ### .respondTo(method) |
| 1682 * |
| 1683 * Asserts that the object or class target will respond to a method. |
| 1684 * |
| 1685 * Klass.prototype.bar = function(){}; |
| 1686 * expect(Klass).to.respondTo('bar'); |
| 1687 * expect(obj).to.respondTo('bar'); |
| 1688 * |
| 1689 * To check if a constructor will respond to a static function, |
| 1690 * set the `itself` flag. |
| 1691 * |
| 1692 * Klass.baz = function(){}; |
| 1693 * expect(Klass).itself.to.respondTo('baz'); |
| 1694 * |
| 1695 * @name respondTo |
| 1696 * @alias respondsTo |
| 1697 * @param {String} method |
| 1698 * @param {String} message _optional_ |
| 1699 * @namespace BDD |
| 1700 * @api public |
| 1701 */ |
| 1702 |
| 1703 function respondTo (method, msg) { |
| 1704 if (msg) flag(this, 'message', msg); |
| 1705 var obj = flag(this, 'object') |
| 1706 , itself = flag(this, 'itself') |
| 1707 , context = ('function' === _.type(obj) && !itself) |
| 1708 ? obj.prototype[method] |
| 1709 : obj[method]; |
| 1710 |
| 1711 this.assert( |
| 1712 'function' === typeof context |
| 1713 , 'expected #{this} to respond to ' + _.inspect(method) |
| 1714 , 'expected #{this} to not respond to ' + _.inspect(method) |
| 1715 ); |
| 1716 } |
| 1717 |
| 1718 Assertion.addMethod('respondTo', respondTo); |
| 1719 Assertion.addMethod('respondsTo', respondTo); |
| 1720 |
| 1721 /** |
| 1722 * ### .itself |
| 1723 * |
| 1724 * Sets the `itself` flag, later used by the `respondTo` assertion. |
| 1725 * |
| 1726 * function Foo() {} |
| 1727 * Foo.bar = function() {} |
| 1728 * Foo.prototype.baz = function() {} |
| 1729 * |
| 1730 * expect(Foo).itself.to.respondTo('bar'); |
| 1731 * expect(Foo).itself.not.to.respondTo('baz'); |
| 1732 * |
| 1733 * @name itself |
| 1734 * @namespace BDD |
| 1735 * @api public |
| 1736 */ |
| 1737 |
| 1738 Assertion.addProperty('itself', function () { |
| 1739 flag(this, 'itself', true); |
| 1740 }); |
| 1741 |
| 1742 /** |
| 1743 * ### .satisfy(method) |
| 1744 * |
| 1745 * Asserts that the target passes a given truth test. |
| 1746 * |
| 1747 * expect(1).to.satisfy(function(num) { return num > 0; }); |
| 1748 * |
| 1749 * @name satisfy |
| 1750 * @alias satisfies |
| 1751 * @param {Function} matcher |
| 1752 * @param {String} message _optional_ |
| 1753 * @namespace BDD |
| 1754 * @api public |
| 1755 */ |
| 1756 |
| 1757 function satisfy (matcher, msg) { |
| 1758 if (msg) flag(this, 'message', msg); |
| 1759 var obj = flag(this, 'object'); |
| 1760 var result = matcher(obj); |
| 1761 this.assert( |
| 1762 result |
| 1763 , 'expected #{this} to satisfy ' + _.objDisplay(matcher) |
| 1764 , 'expected #{this} to not satisfy' + _.objDisplay(matcher) |
| 1765 , this.negate ? false : true |
| 1766 , result |
| 1767 ); |
| 1768 } |
| 1769 |
| 1770 Assertion.addMethod('satisfy', satisfy); |
| 1771 Assertion.addMethod('satisfies', satisfy); |
| 1772 |
| 1773 /** |
| 1774 * ### .closeTo(expected, delta) |
| 1775 * |
| 1776 * Asserts that the target is equal `expected`, to within a +/- `delta` range. |
| 1777 * |
| 1778 * expect(1.5).to.be.closeTo(1, 0.5); |
| 1779 * |
| 1780 * @name closeTo |
| 1781 * @alias approximately |
| 1782 * @param {Number} expected |
| 1783 * @param {Number} delta |
| 1784 * @param {String} message _optional_ |
| 1785 * @namespace BDD |
| 1786 * @api public |
| 1787 */ |
| 1788 |
| 1789 function closeTo(expected, delta, msg) { |
| 1790 if (msg) flag(this, 'message', msg); |
| 1791 var obj = flag(this, 'object'); |
| 1792 |
| 1793 new Assertion(obj, msg).is.a('number'); |
| 1794 if (_.type(expected) !== 'number' || _.type(delta) !== 'number') { |
| 1795 throw new Error('the arguments to closeTo or approximately must be numbers
'); |
| 1796 } |
| 1797 |
| 1798 this.assert( |
| 1799 Math.abs(obj - expected) <= delta |
| 1800 , 'expected #{this} to be close to ' + expected + ' +/- ' + delta |
| 1801 , 'expected #{this} not to be close to ' + expected + ' +/- ' + delta |
| 1802 ); |
| 1803 } |
| 1804 |
| 1805 Assertion.addMethod('closeTo', closeTo); |
| 1806 Assertion.addMethod('approximately', closeTo); |
| 1807 |
| 1808 function isSubsetOf(subset, superset, cmp) { |
| 1809 return subset.every(function(elem) { |
| 1810 if (!cmp) return superset.indexOf(elem) !== -1; |
| 1811 |
| 1812 return superset.some(function(elem2) { |
| 1813 return cmp(elem, elem2); |
| 1814 }); |
| 1815 }) |
| 1816 } |
| 1817 |
| 1818 /** |
| 1819 * ### .members(set) |
| 1820 * |
| 1821 * Asserts that the target is a superset of `set`, |
| 1822 * or that the target and `set` have the same strictly-equal (===) members. |
| 1823 * Alternately, if the `deep` flag is set, set members are compared for deep |
| 1824 * equality. |
| 1825 * |
| 1826 * expect([1, 2, 3]).to.include.members([3, 2]); |
| 1827 * expect([1, 2, 3]).to.not.include.members([3, 2, 8]); |
| 1828 * |
| 1829 * expect([4, 2]).to.have.members([2, 4]); |
| 1830 * expect([5, 2]).to.not.have.members([5, 2, 1]); |
| 1831 * |
| 1832 * expect([{ id: 1 }]).to.deep.include.members([{ id: 1 }]); |
| 1833 * |
| 1834 * @name members |
| 1835 * @param {Array} set |
| 1836 * @param {String} message _optional_ |
| 1837 * @namespace BDD |
| 1838 * @api public |
| 1839 */ |
| 1840 |
| 1841 Assertion.addMethod('members', function (subset, msg) { |
| 1842 if (msg) flag(this, 'message', msg); |
| 1843 var obj = flag(this, 'object'); |
| 1844 |
| 1845 new Assertion(obj).to.be.an('array'); |
| 1846 new Assertion(subset).to.be.an('array'); |
| 1847 |
| 1848 var cmp = flag(this, 'deep') ? _.eql : undefined; |
| 1849 |
| 1850 if (flag(this, 'contains')) { |
| 1851 return this.assert( |
| 1852 isSubsetOf(subset, obj, cmp) |
| 1853 , 'expected #{this} to be a superset of #{act}' |
| 1854 , 'expected #{this} to not be a superset of #{act}' |
| 1855 , obj |
| 1856 , subset |
| 1857 ); |
| 1858 } |
| 1859 |
| 1860 this.assert( |
| 1861 isSubsetOf(obj, subset, cmp) && isSubsetOf(subset, obj, cmp) |
| 1862 , 'expected #{this} to have the same members as #{act}' |
| 1863 , 'expected #{this} to not have the same members as #{act}' |
| 1864 , obj |
| 1865 , subset |
| 1866 ); |
| 1867 }); |
| 1868 |
| 1869 /** |
| 1870 * ### .oneOf(list) |
| 1871 * |
| 1872 * Assert that a value appears somewhere in the top level of array `list`. |
| 1873 * |
| 1874 * expect('a').to.be.oneOf(['a', 'b', 'c']); |
| 1875 * expect(9).to.not.be.oneOf(['z']); |
| 1876 * expect([3]).to.not.be.oneOf([1, 2, [3]]); |
| 1877 * |
| 1878 * var three = [3]; |
| 1879 * // for object-types, contents are not compared |
| 1880 * expect(three).to.not.be.oneOf([1, 2, [3]]); |
| 1881 * // comparing references works |
| 1882 * expect(three).to.be.oneOf([1, 2, three]); |
| 1883 * |
| 1884 * @name oneOf |
| 1885 * @param {Array<*>} list |
| 1886 * @param {String} message _optional_ |
| 1887 * @namespace BDD |
| 1888 * @api public |
| 1889 */ |
| 1890 |
| 1891 function oneOf (list, msg) { |
| 1892 if (msg) flag(this, 'message', msg); |
| 1893 var expected = flag(this, 'object'); |
| 1894 new Assertion(list).to.be.an('array'); |
| 1895 |
| 1896 this.assert( |
| 1897 list.indexOf(expected) > -1 |
| 1898 , 'expected #{this} to be one of #{exp}' |
| 1899 , 'expected #{this} to not be one of #{exp}' |
| 1900 , list |
| 1901 , expected |
| 1902 ); |
| 1903 } |
| 1904 |
| 1905 Assertion.addMethod('oneOf', oneOf); |
| 1906 |
| 1907 |
| 1908 /** |
| 1909 * ### .change(function) |
| 1910 * |
| 1911 * Asserts that a function changes an object property |
| 1912 * |
| 1913 * var obj = { val: 10 }; |
| 1914 * var fn = function() { obj.val += 3 }; |
| 1915 * var noChangeFn = function() { return 'foo' + 'bar'; } |
| 1916 * expect(fn).to.change(obj, 'val'); |
| 1917 * expect(noChangeFn).to.not.change(obj, 'val') |
| 1918 * |
| 1919 * @name change |
| 1920 * @alias changes |
| 1921 * @alias Change |
| 1922 * @param {String} object |
| 1923 * @param {String} property name |
| 1924 * @param {String} message _optional_ |
| 1925 * @namespace BDD |
| 1926 * @api public |
| 1927 */ |
| 1928 |
| 1929 function assertChanges (object, prop, msg) { |
| 1930 if (msg) flag(this, 'message', msg); |
| 1931 var fn = flag(this, 'object'); |
| 1932 new Assertion(object, msg).to.have.property(prop); |
| 1933 new Assertion(fn).is.a('function'); |
| 1934 |
| 1935 var initial = object[prop]; |
| 1936 fn(); |
| 1937 |
| 1938 this.assert( |
| 1939 initial !== object[prop] |
| 1940 , 'expected .' + prop + ' to change' |
| 1941 , 'expected .' + prop + ' to not change' |
| 1942 ); |
| 1943 } |
| 1944 |
| 1945 Assertion.addChainableMethod('change', assertChanges); |
| 1946 Assertion.addChainableMethod('changes', assertChanges); |
| 1947 |
| 1948 /** |
| 1949 * ### .increase(function) |
| 1950 * |
| 1951 * Asserts that a function increases an object property |
| 1952 * |
| 1953 * var obj = { val: 10 }; |
| 1954 * var fn = function() { obj.val = 15 }; |
| 1955 * expect(fn).to.increase(obj, 'val'); |
| 1956 * |
| 1957 * @name increase |
| 1958 * @alias increases |
| 1959 * @alias Increase |
| 1960 * @param {String} object |
| 1961 * @param {String} property name |
| 1962 * @param {String} message _optional_ |
| 1963 * @namespace BDD |
| 1964 * @api public |
| 1965 */ |
| 1966 |
| 1967 function assertIncreases (object, prop, msg) { |
| 1968 if (msg) flag(this, 'message', msg); |
| 1969 var fn = flag(this, 'object'); |
| 1970 new Assertion(object, msg).to.have.property(prop); |
| 1971 new Assertion(fn).is.a('function'); |
| 1972 |
| 1973 var initial = object[prop]; |
| 1974 fn(); |
| 1975 |
| 1976 this.assert( |
| 1977 object[prop] - initial > 0 |
| 1978 , 'expected .' + prop + ' to increase' |
| 1979 , 'expected .' + prop + ' to not increase' |
| 1980 ); |
| 1981 } |
| 1982 |
| 1983 Assertion.addChainableMethod('increase', assertIncreases); |
| 1984 Assertion.addChainableMethod('increases', assertIncreases); |
| 1985 |
| 1986 /** |
| 1987 * ### .decrease(function) |
| 1988 * |
| 1989 * Asserts that a function decreases an object property |
| 1990 * |
| 1991 * var obj = { val: 10 }; |
| 1992 * var fn = function() { obj.val = 5 }; |
| 1993 * expect(fn).to.decrease(obj, 'val'); |
| 1994 * |
| 1995 * @name decrease |
| 1996 * @alias decreases |
| 1997 * @alias Decrease |
| 1998 * @param {String} object |
| 1999 * @param {String} property name |
| 2000 * @param {String} message _optional_ |
| 2001 * @namespace BDD |
| 2002 * @api public |
| 2003 */ |
| 2004 |
| 2005 function assertDecreases (object, prop, msg) { |
| 2006 if (msg) flag(this, 'message', msg); |
| 2007 var fn = flag(this, 'object'); |
| 2008 new Assertion(object, msg).to.have.property(prop); |
| 2009 new Assertion(fn).is.a('function'); |
| 2010 |
| 2011 var initial = object[prop]; |
| 2012 fn(); |
| 2013 |
| 2014 this.assert( |
| 2015 object[prop] - initial < 0 |
| 2016 , 'expected .' + prop + ' to decrease' |
| 2017 , 'expected .' + prop + ' to not decrease' |
| 2018 ); |
| 2019 } |
| 2020 |
| 2021 Assertion.addChainableMethod('decrease', assertDecreases); |
| 2022 Assertion.addChainableMethod('decreases', assertDecreases); |
| 2023 |
| 2024 /** |
| 2025 * ### .extensible |
| 2026 * |
| 2027 * Asserts that the target is extensible (can have new properties added to |
| 2028 * it). |
| 2029 * |
| 2030 * var nonExtensibleObject = Object.preventExtensions({}); |
| 2031 * var sealedObject = Object.seal({}); |
| 2032 * var frozenObject = Object.freeze({}); |
| 2033 * |
| 2034 * expect({}).to.be.extensible; |
| 2035 * expect(nonExtensibleObject).to.not.be.extensible; |
| 2036 * expect(sealedObject).to.not.be.extensible; |
| 2037 * expect(frozenObject).to.not.be.extensible; |
| 2038 * |
| 2039 * @name extensible |
| 2040 * @namespace BDD |
| 2041 * @api public |
| 2042 */ |
| 2043 |
| 2044 Assertion.addProperty('extensible', function() { |
| 2045 var obj = flag(this, 'object'); |
| 2046 |
| 2047 // In ES5, if the argument to this method is not an object (a primitive), th
en it will cause a TypeError. |
| 2048 // In ES6, a non-object argument will be treated as if it was a non-extensib
le ordinary object, simply return false. |
| 2049 // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_
Objects/Object/isExtensible |
| 2050 // The following provides ES6 behavior when a TypeError is thrown under ES5. |
| 2051 |
| 2052 var isExtensible; |
| 2053 |
| 2054 try { |
| 2055 isExtensible = Object.isExtensible(obj); |
| 2056 } catch (err) { |
| 2057 if (err instanceof TypeError) isExtensible = false; |
| 2058 else throw err; |
| 2059 } |
| 2060 |
| 2061 this.assert( |
| 2062 isExtensible |
| 2063 , 'expected #{this} to be extensible' |
| 2064 , 'expected #{this} to not be extensible' |
| 2065 ); |
| 2066 }); |
| 2067 |
| 2068 /** |
| 2069 * ### .sealed |
| 2070 * |
| 2071 * Asserts that the target is sealed (cannot have new properties added to it |
| 2072 * and its existing properties cannot be removed). |
| 2073 * |
| 2074 * var sealedObject = Object.seal({}); |
| 2075 * var frozenObject = Object.freeze({}); |
| 2076 * |
| 2077 * expect(sealedObject).to.be.sealed; |
| 2078 * expect(frozenObject).to.be.sealed; |
| 2079 * expect({}).to.not.be.sealed; |
| 2080 * |
| 2081 * @name sealed |
| 2082 * @namespace BDD |
| 2083 * @api public |
| 2084 */ |
| 2085 |
| 2086 Assertion.addProperty('sealed', function() { |
| 2087 var obj = flag(this, 'object'); |
| 2088 |
| 2089 // In ES5, if the argument to this method is not an object (a primitive), th
en it will cause a TypeError. |
| 2090 // In ES6, a non-object argument will be treated as if it was a sealed ordin
ary object, simply return true. |
| 2091 // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Glo
bal_Objects/Object/isSealed |
| 2092 // The following provides ES6 behavior when a TypeError is thrown under ES5. |
| 2093 |
| 2094 var isSealed; |
| 2095 |
| 2096 try { |
| 2097 isSealed = Object.isSealed(obj); |
| 2098 } catch (err) { |
| 2099 if (err instanceof TypeError) isSealed = true; |
| 2100 else throw err; |
| 2101 } |
| 2102 |
| 2103 this.assert( |
| 2104 isSealed |
| 2105 , 'expected #{this} to be sealed' |
| 2106 , 'expected #{this} to not be sealed' |
| 2107 ); |
| 2108 }); |
| 2109 |
| 2110 /** |
| 2111 * ### .frozen |
| 2112 * |
| 2113 * Asserts that the target is frozen (cannot have new properties added to it |
| 2114 * and its existing properties cannot be modified). |
| 2115 * |
| 2116 * var frozenObject = Object.freeze({}); |
| 2117 * |
| 2118 * expect(frozenObject).to.be.frozen; |
| 2119 * expect({}).to.not.be.frozen; |
| 2120 * |
| 2121 * @name frozen |
| 2122 * @namespace BDD |
| 2123 * @api public |
| 2124 */ |
| 2125 |
| 2126 Assertion.addProperty('frozen', function() { |
| 2127 var obj = flag(this, 'object'); |
| 2128 |
| 2129 // In ES5, if the argument to this method is not an object (a primitive), th
en it will cause a TypeError. |
| 2130 // In ES6, a non-object argument will be treated as if it was a frozen ordin
ary object, simply return true. |
| 2131 // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Glo
bal_Objects/Object/isFrozen |
| 2132 // The following provides ES6 behavior when a TypeError is thrown under ES5. |
| 2133 |
| 2134 var isFrozen; |
| 2135 |
| 2136 try { |
| 2137 isFrozen = Object.isFrozen(obj); |
| 2138 } catch (err) { |
| 2139 if (err instanceof TypeError) isFrozen = true; |
| 2140 else throw err; |
| 2141 } |
| 2142 |
| 2143 this.assert( |
| 2144 isFrozen |
| 2145 , 'expected #{this} to be frozen' |
| 2146 , 'expected #{this} to not be frozen' |
| 2147 ); |
| 2148 }); |
| 2149 }; |
| 2150 |
| 2151 },{}],6:[function(require,module,exports){ |
| 2152 /*! |
| 2153 * chai |
| 2154 * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com> |
| 2155 * MIT Licensed |
| 2156 */ |
| 2157 |
| 2158 |
| 2159 module.exports = function (chai, util) { |
| 2160 |
| 2161 /*! |
| 2162 * Chai dependencies. |
| 2163 */ |
| 2164 |
| 2165 var Assertion = chai.Assertion |
| 2166 , flag = util.flag; |
| 2167 |
| 2168 /*! |
| 2169 * Module export. |
| 2170 */ |
| 2171 |
| 2172 /** |
| 2173 * ### assert(expression, message) |
| 2174 * |
| 2175 * Write your own test expressions. |
| 2176 * |
| 2177 * assert('foo' !== 'bar', 'foo is not bar'); |
| 2178 * assert(Array.isArray([]), 'empty arrays are arrays'); |
| 2179 * |
| 2180 * @param {Mixed} expression to test for truthiness |
| 2181 * @param {String} message to display on error |
| 2182 * @name assert |
| 2183 * @namespace Assert |
| 2184 * @api public |
| 2185 */ |
| 2186 |
| 2187 var assert = chai.assert = function (express, errmsg) { |
| 2188 var test = new Assertion(null, null, chai.assert); |
| 2189 test.assert( |
| 2190 express |
| 2191 , errmsg |
| 2192 , '[ negation message unavailable ]' |
| 2193 ); |
| 2194 }; |
| 2195 |
| 2196 /** |
| 2197 * ### .fail(actual, expected, [message], [operator]) |
| 2198 * |
| 2199 * Throw a failure. Node.js `assert` module-compatible. |
| 2200 * |
| 2201 * @name fail |
| 2202 * @param {Mixed} actual |
| 2203 * @param {Mixed} expected |
| 2204 * @param {String} message |
| 2205 * @param {String} operator |
| 2206 * @namespace Assert |
| 2207 * @api public |
| 2208 */ |
| 2209 |
| 2210 assert.fail = function (actual, expected, message, operator) { |
| 2211 message = message || 'assert.fail()'; |
| 2212 throw new chai.AssertionError(message, { |
| 2213 actual: actual |
| 2214 , expected: expected |
| 2215 , operator: operator |
| 2216 }, assert.fail); |
| 2217 }; |
| 2218 |
| 2219 /** |
| 2220 * ### .isOk(object, [message]) |
| 2221 * |
| 2222 * Asserts that `object` is truthy. |
| 2223 * |
| 2224 * assert.isOk('everything', 'everything is ok'); |
| 2225 * assert.isOk(false, 'this will fail'); |
| 2226 * |
| 2227 * @name isOk |
| 2228 * @alias ok |
| 2229 * @param {Mixed} object to test |
| 2230 * @param {String} message |
| 2231 * @namespace Assert |
| 2232 * @api public |
| 2233 */ |
| 2234 |
| 2235 assert.isOk = function (val, msg) { |
| 2236 new Assertion(val, msg).is.ok; |
| 2237 }; |
| 2238 |
| 2239 /** |
| 2240 * ### .isNotOk(object, [message]) |
| 2241 * |
| 2242 * Asserts that `object` is falsy. |
| 2243 * |
| 2244 * assert.isNotOk('everything', 'this will fail'); |
| 2245 * assert.isNotOk(false, 'this will pass'); |
| 2246 * |
| 2247 * @name isNotOk |
| 2248 * @alias notOk |
| 2249 * @param {Mixed} object to test |
| 2250 * @param {String} message |
| 2251 * @namespace Assert |
| 2252 * @api public |
| 2253 */ |
| 2254 |
| 2255 assert.isNotOk = function (val, msg) { |
| 2256 new Assertion(val, msg).is.not.ok; |
| 2257 }; |
| 2258 |
| 2259 /** |
| 2260 * ### .equal(actual, expected, [message]) |
| 2261 * |
| 2262 * Asserts non-strict equality (`==`) of `actual` and `expected`. |
| 2263 * |
| 2264 * assert.equal(3, '3', '== coerces values to strings'); |
| 2265 * |
| 2266 * @name equal |
| 2267 * @param {Mixed} actual |
| 2268 * @param {Mixed} expected |
| 2269 * @param {String} message |
| 2270 * @namespace Assert |
| 2271 * @api public |
| 2272 */ |
| 2273 |
| 2274 assert.equal = function (act, exp, msg) { |
| 2275 var test = new Assertion(act, msg, assert.equal); |
| 2276 |
| 2277 test.assert( |
| 2278 exp == flag(test, 'object') |
| 2279 , 'expected #{this} to equal #{exp}' |
| 2280 , 'expected #{this} to not equal #{act}' |
| 2281 , exp |
| 2282 , act |
| 2283 ); |
| 2284 }; |
| 2285 |
| 2286 /** |
| 2287 * ### .notEqual(actual, expected, [message]) |
| 2288 * |
| 2289 * Asserts non-strict inequality (`!=`) of `actual` and `expected`. |
| 2290 * |
| 2291 * assert.notEqual(3, 4, 'these numbers are not equal'); |
| 2292 * |
| 2293 * @name notEqual |
| 2294 * @param {Mixed} actual |
| 2295 * @param {Mixed} expected |
| 2296 * @param {String} message |
| 2297 * @namespace Assert |
| 2298 * @api public |
| 2299 */ |
| 2300 |
| 2301 assert.notEqual = function (act, exp, msg) { |
| 2302 var test = new Assertion(act, msg, assert.notEqual); |
| 2303 |
| 2304 test.assert( |
| 2305 exp != flag(test, 'object') |
| 2306 , 'expected #{this} to not equal #{exp}' |
| 2307 , 'expected #{this} to equal #{act}' |
| 2308 , exp |
| 2309 , act |
| 2310 ); |
| 2311 }; |
| 2312 |
| 2313 /** |
| 2314 * ### .strictEqual(actual, expected, [message]) |
| 2315 * |
| 2316 * Asserts strict equality (`===`) of `actual` and `expected`. |
| 2317 * |
| 2318 * assert.strictEqual(true, true, 'these booleans are strictly equal'); |
| 2319 * |
| 2320 * @name strictEqual |
| 2321 * @param {Mixed} actual |
| 2322 * @param {Mixed} expected |
| 2323 * @param {String} message |
| 2324 * @namespace Assert |
| 2325 * @api public |
| 2326 */ |
| 2327 |
| 2328 assert.strictEqual = function (act, exp, msg) { |
| 2329 new Assertion(act, msg).to.equal(exp); |
| 2330 }; |
| 2331 |
| 2332 /** |
| 2333 * ### .notStrictEqual(actual, expected, [message]) |
| 2334 * |
| 2335 * Asserts strict inequality (`!==`) of `actual` and `expected`. |
| 2336 * |
| 2337 * assert.notStrictEqual(3, '3', 'no coercion for strict equality'); |
| 2338 * |
| 2339 * @name notStrictEqual |
| 2340 * @param {Mixed} actual |
| 2341 * @param {Mixed} expected |
| 2342 * @param {String} message |
| 2343 * @namespace Assert |
| 2344 * @api public |
| 2345 */ |
| 2346 |
| 2347 assert.notStrictEqual = function (act, exp, msg) { |
| 2348 new Assertion(act, msg).to.not.equal(exp); |
| 2349 }; |
| 2350 |
| 2351 /** |
| 2352 * ### .deepEqual(actual, expected, [message]) |
| 2353 * |
| 2354 * Asserts that `actual` is deeply equal to `expected`. |
| 2355 * |
| 2356 * assert.deepEqual({ tea: 'green' }, { tea: 'green' }); |
| 2357 * |
| 2358 * @name deepEqual |
| 2359 * @param {Mixed} actual |
| 2360 * @param {Mixed} expected |
| 2361 * @param {String} message |
| 2362 * @namespace Assert |
| 2363 * @api public |
| 2364 */ |
| 2365 |
| 2366 assert.deepEqual = function (act, exp, msg) { |
| 2367 new Assertion(act, msg).to.eql(exp); |
| 2368 }; |
| 2369 |
| 2370 /** |
| 2371 * ### .notDeepEqual(actual, expected, [message]) |
| 2372 * |
| 2373 * Assert that `actual` is not deeply equal to `expected`. |
| 2374 * |
| 2375 * assert.notDeepEqual({ tea: 'green' }, { tea: 'jasmine' }); |
| 2376 * |
| 2377 * @name notDeepEqual |
| 2378 * @param {Mixed} actual |
| 2379 * @param {Mixed} expected |
| 2380 * @param {String} message |
| 2381 * @namespace Assert |
| 2382 * @api public |
| 2383 */ |
| 2384 |
| 2385 assert.notDeepEqual = function (act, exp, msg) { |
| 2386 new Assertion(act, msg).to.not.eql(exp); |
| 2387 }; |
| 2388 |
| 2389 /** |
| 2390 * ### .isAbove(valueToCheck, valueToBeAbove, [message]) |
| 2391 * |
| 2392 * Asserts `valueToCheck` is strictly greater than (>) `valueToBeAbove` |
| 2393 * |
| 2394 * assert.isAbove(5, 2, '5 is strictly greater than 2'); |
| 2395 * |
| 2396 * @name isAbove |
| 2397 * @param {Mixed} valueToCheck |
| 2398 * @param {Mixed} valueToBeAbove |
| 2399 * @param {String} message |
| 2400 * @namespace Assert |
| 2401 * @api public |
| 2402 */ |
| 2403 |
| 2404 assert.isAbove = function (val, abv, msg) { |
| 2405 new Assertion(val, msg).to.be.above(abv); |
| 2406 }; |
| 2407 |
| 2408 /** |
| 2409 * ### .isAtLeast(valueToCheck, valueToBeAtLeast, [message]) |
| 2410 * |
| 2411 * Asserts `valueToCheck` is greater than or equal to (>=) `valueToBeAtLeast` |
| 2412 * |
| 2413 * assert.isAtLeast(5, 2, '5 is greater or equal to 2'); |
| 2414 * assert.isAtLeast(3, 3, '3 is greater or equal to 3'); |
| 2415 * |
| 2416 * @name isAtLeast |
| 2417 * @param {Mixed} valueToCheck |
| 2418 * @param {Mixed} valueToBeAtLeast |
| 2419 * @param {String} message |
| 2420 * @namespace Assert |
| 2421 * @api public |
| 2422 */ |
| 2423 |
| 2424 assert.isAtLeast = function (val, atlst, msg) { |
| 2425 new Assertion(val, msg).to.be.least(atlst); |
| 2426 }; |
| 2427 |
| 2428 /** |
| 2429 * ### .isBelow(valueToCheck, valueToBeBelow, [message]) |
| 2430 * |
| 2431 * Asserts `valueToCheck` is strictly less than (<) `valueToBeBelow` |
| 2432 * |
| 2433 * assert.isBelow(3, 6, '3 is strictly less than 6'); |
| 2434 * |
| 2435 * @name isBelow |
| 2436 * @param {Mixed} valueToCheck |
| 2437 * @param {Mixed} valueToBeBelow |
| 2438 * @param {String} message |
| 2439 * @namespace Assert |
| 2440 * @api public |
| 2441 */ |
| 2442 |
| 2443 assert.isBelow = function (val, blw, msg) { |
| 2444 new Assertion(val, msg).to.be.below(blw); |
| 2445 }; |
| 2446 |
| 2447 /** |
| 2448 * ### .isAtMost(valueToCheck, valueToBeAtMost, [message]) |
| 2449 * |
| 2450 * Asserts `valueToCheck` is less than or equal to (<=) `valueToBeAtMost` |
| 2451 * |
| 2452 * assert.isAtMost(3, 6, '3 is less than or equal to 6'); |
| 2453 * assert.isAtMost(4, 4, '4 is less than or equal to 4'); |
| 2454 * |
| 2455 * @name isAtMost |
| 2456 * @param {Mixed} valueToCheck |
| 2457 * @param {Mixed} valueToBeAtMost |
| 2458 * @param {String} message |
| 2459 * @namespace Assert |
| 2460 * @api public |
| 2461 */ |
| 2462 |
| 2463 assert.isAtMost = function (val, atmst, msg) { |
| 2464 new Assertion(val, msg).to.be.most(atmst); |
| 2465 }; |
| 2466 |
| 2467 /** |
| 2468 * ### .isTrue(value, [message]) |
| 2469 * |
| 2470 * Asserts that `value` is true. |
| 2471 * |
| 2472 * var teaServed = true; |
| 2473 * assert.isTrue(teaServed, 'the tea has been served'); |
| 2474 * |
| 2475 * @name isTrue |
| 2476 * @param {Mixed} value |
| 2477 * @param {String} message |
| 2478 * @namespace Assert |
| 2479 * @api public |
| 2480 */ |
| 2481 |
| 2482 assert.isTrue = function (val, msg) { |
| 2483 new Assertion(val, msg).is['true']; |
| 2484 }; |
| 2485 |
| 2486 /** |
| 2487 * ### .isNotTrue(value, [message]) |
| 2488 * |
| 2489 * Asserts that `value` is not true. |
| 2490 * |
| 2491 * var tea = 'tasty chai'; |
| 2492 * assert.isNotTrue(tea, 'great, time for tea!'); |
| 2493 * |
| 2494 * @name isNotTrue |
| 2495 * @param {Mixed} value |
| 2496 * @param {String} message |
| 2497 * @namespace Assert |
| 2498 * @api public |
| 2499 */ |
| 2500 |
| 2501 assert.isNotTrue = function (val, msg) { |
| 2502 new Assertion(val, msg).to.not.equal(true); |
| 2503 }; |
| 2504 |
| 2505 /** |
| 2506 * ### .isFalse(value, [message]) |
| 2507 * |
| 2508 * Asserts that `value` is false. |
| 2509 * |
| 2510 * var teaServed = false; |
| 2511 * assert.isFalse(teaServed, 'no tea yet? hmm...'); |
| 2512 * |
| 2513 * @name isFalse |
| 2514 * @param {Mixed} value |
| 2515 * @param {String} message |
| 2516 * @namespace Assert |
| 2517 * @api public |
| 2518 */ |
| 2519 |
| 2520 assert.isFalse = function (val, msg) { |
| 2521 new Assertion(val, msg).is['false']; |
| 2522 }; |
| 2523 |
| 2524 /** |
| 2525 * ### .isNotFalse(value, [message]) |
| 2526 * |
| 2527 * Asserts that `value` is not false. |
| 2528 * |
| 2529 * var tea = 'tasty chai'; |
| 2530 * assert.isNotFalse(tea, 'great, time for tea!'); |
| 2531 * |
| 2532 * @name isNotFalse |
| 2533 * @param {Mixed} value |
| 2534 * @param {String} message |
| 2535 * @namespace Assert |
| 2536 * @api public |
| 2537 */ |
| 2538 |
| 2539 assert.isNotFalse = function (val, msg) { |
| 2540 new Assertion(val, msg).to.not.equal(false); |
| 2541 }; |
| 2542 |
| 2543 /** |
| 2544 * ### .isNull(value, [message]) |
| 2545 * |
| 2546 * Asserts that `value` is null. |
| 2547 * |
| 2548 * assert.isNull(err, 'there was no error'); |
| 2549 * |
| 2550 * @name isNull |
| 2551 * @param {Mixed} value |
| 2552 * @param {String} message |
| 2553 * @namespace Assert |
| 2554 * @api public |
| 2555 */ |
| 2556 |
| 2557 assert.isNull = function (val, msg) { |
| 2558 new Assertion(val, msg).to.equal(null); |
| 2559 }; |
| 2560 |
| 2561 /** |
| 2562 * ### .isNotNull(value, [message]) |
| 2563 * |
| 2564 * Asserts that `value` is not null. |
| 2565 * |
| 2566 * var tea = 'tasty chai'; |
| 2567 * assert.isNotNull(tea, 'great, time for tea!'); |
| 2568 * |
| 2569 * @name isNotNull |
| 2570 * @param {Mixed} value |
| 2571 * @param {String} message |
| 2572 * @namespace Assert |
| 2573 * @api public |
| 2574 */ |
| 2575 |
| 2576 assert.isNotNull = function (val, msg) { |
| 2577 new Assertion(val, msg).to.not.equal(null); |
| 2578 }; |
| 2579 |
| 2580 /** |
| 2581 * ### .isNaN |
| 2582 * Asserts that value is NaN |
| 2583 * |
| 2584 * assert.isNaN('foo', 'foo is NaN'); |
| 2585 * |
| 2586 * @name isNaN |
| 2587 * @param {Mixed} value |
| 2588 * @param {String} message |
| 2589 * @namespace Assert |
| 2590 * @api public |
| 2591 */ |
| 2592 |
| 2593 assert.isNaN = function (val, msg) { |
| 2594 new Assertion(val, msg).to.be.NaN; |
| 2595 }; |
| 2596 |
| 2597 /** |
| 2598 * ### .isNotNaN |
| 2599 * Asserts that value is not NaN |
| 2600 * |
| 2601 * assert.isNotNaN(4, '4 is not NaN'); |
| 2602 * |
| 2603 * @name isNotNaN |
| 2604 * @param {Mixed} value |
| 2605 * @param {String} message |
| 2606 * @namespace Assert |
| 2607 * @api public |
| 2608 */ |
| 2609 assert.isNotNaN = function (val, msg) { |
| 2610 new Assertion(val, msg).not.to.be.NaN; |
| 2611 }; |
| 2612 |
| 2613 /** |
| 2614 * ### .isUndefined(value, [message]) |
| 2615 * |
| 2616 * Asserts that `value` is `undefined`. |
| 2617 * |
| 2618 * var tea; |
| 2619 * assert.isUndefined(tea, 'no tea defined'); |
| 2620 * |
| 2621 * @name isUndefined |
| 2622 * @param {Mixed} value |
| 2623 * @param {String} message |
| 2624 * @namespace Assert |
| 2625 * @api public |
| 2626 */ |
| 2627 |
| 2628 assert.isUndefined = function (val, msg) { |
| 2629 new Assertion(val, msg).to.equal(undefined); |
| 2630 }; |
| 2631 |
| 2632 /** |
| 2633 * ### .isDefined(value, [message]) |
| 2634 * |
| 2635 * Asserts that `value` is not `undefined`. |
| 2636 * |
| 2637 * var tea = 'cup of chai'; |
| 2638 * assert.isDefined(tea, 'tea has been defined'); |
| 2639 * |
| 2640 * @name isDefined |
| 2641 * @param {Mixed} value |
| 2642 * @param {String} message |
| 2643 * @namespace Assert |
| 2644 * @api public |
| 2645 */ |
| 2646 |
| 2647 assert.isDefined = function (val, msg) { |
| 2648 new Assertion(val, msg).to.not.equal(undefined); |
| 2649 }; |
| 2650 |
| 2651 /** |
| 2652 * ### .isFunction(value, [message]) |
| 2653 * |
| 2654 * Asserts that `value` is a function. |
| 2655 * |
| 2656 * function serveTea() { return 'cup of tea'; }; |
| 2657 * assert.isFunction(serveTea, 'great, we can have tea now'); |
| 2658 * |
| 2659 * @name isFunction |
| 2660 * @param {Mixed} value |
| 2661 * @param {String} message |
| 2662 * @namespace Assert |
| 2663 * @api public |
| 2664 */ |
| 2665 |
| 2666 assert.isFunction = function (val, msg) { |
| 2667 new Assertion(val, msg).to.be.a('function'); |
| 2668 }; |
| 2669 |
| 2670 /** |
| 2671 * ### .isNotFunction(value, [message]) |
| 2672 * |
| 2673 * Asserts that `value` is _not_ a function. |
| 2674 * |
| 2675 * var serveTea = [ 'heat', 'pour', 'sip' ]; |
| 2676 * assert.isNotFunction(serveTea, 'great, we have listed the steps'); |
| 2677 * |
| 2678 * @name isNotFunction |
| 2679 * @param {Mixed} value |
| 2680 * @param {String} message |
| 2681 * @namespace Assert |
| 2682 * @api public |
| 2683 */ |
| 2684 |
| 2685 assert.isNotFunction = function (val, msg) { |
| 2686 new Assertion(val, msg).to.not.be.a('function'); |
| 2687 }; |
| 2688 |
| 2689 /** |
| 2690 * ### .isObject(value, [message]) |
| 2691 * |
| 2692 * Asserts that `value` is an object of type 'Object' (as revealed by `Object.
prototype.toString`). |
| 2693 * _The assertion does not match subclassed objects._ |
| 2694 * |
| 2695 * var selection = { name: 'Chai', serve: 'with spices' }; |
| 2696 * assert.isObject(selection, 'tea selection is an object'); |
| 2697 * |
| 2698 * @name isObject |
| 2699 * @param {Mixed} value |
| 2700 * @param {String} message |
| 2701 * @namespace Assert |
| 2702 * @api public |
| 2703 */ |
| 2704 |
| 2705 assert.isObject = function (val, msg) { |
| 2706 new Assertion(val, msg).to.be.a('object'); |
| 2707 }; |
| 2708 |
| 2709 /** |
| 2710 * ### .isNotObject(value, [message]) |
| 2711 * |
| 2712 * Asserts that `value` is _not_ an object of type 'Object' (as revealed by `O
bject.prototype.toString`). |
| 2713 * |
| 2714 * var selection = 'chai' |
| 2715 * assert.isNotObject(selection, 'tea selection is not an object'); |
| 2716 * assert.isNotObject(null, 'null is not an object'); |
| 2717 * |
| 2718 * @name isNotObject |
| 2719 * @param {Mixed} value |
| 2720 * @param {String} message |
| 2721 * @namespace Assert |
| 2722 * @api public |
| 2723 */ |
| 2724 |
| 2725 assert.isNotObject = function (val, msg) { |
| 2726 new Assertion(val, msg).to.not.be.a('object'); |
| 2727 }; |
| 2728 |
| 2729 /** |
| 2730 * ### .isArray(value, [message]) |
| 2731 * |
| 2732 * Asserts that `value` is an array. |
| 2733 * |
| 2734 * var menu = [ 'green', 'chai', 'oolong' ]; |
| 2735 * assert.isArray(menu, 'what kind of tea do we want?'); |
| 2736 * |
| 2737 * @name isArray |
| 2738 * @param {Mixed} value |
| 2739 * @param {String} message |
| 2740 * @namespace Assert |
| 2741 * @api public |
| 2742 */ |
| 2743 |
| 2744 assert.isArray = function (val, msg) { |
| 2745 new Assertion(val, msg).to.be.an('array'); |
| 2746 }; |
| 2747 |
| 2748 /** |
| 2749 * ### .isNotArray(value, [message]) |
| 2750 * |
| 2751 * Asserts that `value` is _not_ an array. |
| 2752 * |
| 2753 * var menu = 'green|chai|oolong'; |
| 2754 * assert.isNotArray(menu, 'what kind of tea do we want?'); |
| 2755 * |
| 2756 * @name isNotArray |
| 2757 * @param {Mixed} value |
| 2758 * @param {String} message |
| 2759 * @namespace Assert |
| 2760 * @api public |
| 2761 */ |
| 2762 |
| 2763 assert.isNotArray = function (val, msg) { |
| 2764 new Assertion(val, msg).to.not.be.an('array'); |
| 2765 }; |
| 2766 |
| 2767 /** |
| 2768 * ### .isString(value, [message]) |
| 2769 * |
| 2770 * Asserts that `value` is a string. |
| 2771 * |
| 2772 * var teaOrder = 'chai'; |
| 2773 * assert.isString(teaOrder, 'order placed'); |
| 2774 * |
| 2775 * @name isString |
| 2776 * @param {Mixed} value |
| 2777 * @param {String} message |
| 2778 * @namespace Assert |
| 2779 * @api public |
| 2780 */ |
| 2781 |
| 2782 assert.isString = function (val, msg) { |
| 2783 new Assertion(val, msg).to.be.a('string'); |
| 2784 }; |
| 2785 |
| 2786 /** |
| 2787 * ### .isNotString(value, [message]) |
| 2788 * |
| 2789 * Asserts that `value` is _not_ a string. |
| 2790 * |
| 2791 * var teaOrder = 4; |
| 2792 * assert.isNotString(teaOrder, 'order placed'); |
| 2793 * |
| 2794 * @name isNotString |
| 2795 * @param {Mixed} value |
| 2796 * @param {String} message |
| 2797 * @namespace Assert |
| 2798 * @api public |
| 2799 */ |
| 2800 |
| 2801 assert.isNotString = function (val, msg) { |
| 2802 new Assertion(val, msg).to.not.be.a('string'); |
| 2803 }; |
| 2804 |
| 2805 /** |
| 2806 * ### .isNumber(value, [message]) |
| 2807 * |
| 2808 * Asserts that `value` is a number. |
| 2809 * |
| 2810 * var cups = 2; |
| 2811 * assert.isNumber(cups, 'how many cups'); |
| 2812 * |
| 2813 * @name isNumber |
| 2814 * @param {Number} value |
| 2815 * @param {String} message |
| 2816 * @namespace Assert |
| 2817 * @api public |
| 2818 */ |
| 2819 |
| 2820 assert.isNumber = function (val, msg) { |
| 2821 new Assertion(val, msg).to.be.a('number'); |
| 2822 }; |
| 2823 |
| 2824 /** |
| 2825 * ### .isNotNumber(value, [message]) |
| 2826 * |
| 2827 * Asserts that `value` is _not_ a number. |
| 2828 * |
| 2829 * var cups = '2 cups please'; |
| 2830 * assert.isNotNumber(cups, 'how many cups'); |
| 2831 * |
| 2832 * @name isNotNumber |
| 2833 * @param {Mixed} value |
| 2834 * @param {String} message |
| 2835 * @namespace Assert |
| 2836 * @api public |
| 2837 */ |
| 2838 |
| 2839 assert.isNotNumber = function (val, msg) { |
| 2840 new Assertion(val, msg).to.not.be.a('number'); |
| 2841 }; |
| 2842 |
| 2843 /** |
| 2844 * ### .isBoolean(value, [message]) |
| 2845 * |
| 2846 * Asserts that `value` is a boolean. |
| 2847 * |
| 2848 * var teaReady = true |
| 2849 * , teaServed = false; |
| 2850 * |
| 2851 * assert.isBoolean(teaReady, 'is the tea ready'); |
| 2852 * assert.isBoolean(teaServed, 'has tea been served'); |
| 2853 * |
| 2854 * @name isBoolean |
| 2855 * @param {Mixed} value |
| 2856 * @param {String} message |
| 2857 * @namespace Assert |
| 2858 * @api public |
| 2859 */ |
| 2860 |
| 2861 assert.isBoolean = function (val, msg) { |
| 2862 new Assertion(val, msg).to.be.a('boolean'); |
| 2863 }; |
| 2864 |
| 2865 /** |
| 2866 * ### .isNotBoolean(value, [message]) |
| 2867 * |
| 2868 * Asserts that `value` is _not_ a boolean. |
| 2869 * |
| 2870 * var teaReady = 'yep' |
| 2871 * , teaServed = 'nope'; |
| 2872 * |
| 2873 * assert.isNotBoolean(teaReady, 'is the tea ready'); |
| 2874 * assert.isNotBoolean(teaServed, 'has tea been served'); |
| 2875 * |
| 2876 * @name isNotBoolean |
| 2877 * @param {Mixed} value |
| 2878 * @param {String} message |
| 2879 * @namespace Assert |
| 2880 * @api public |
| 2881 */ |
| 2882 |
| 2883 assert.isNotBoolean = function (val, msg) { |
| 2884 new Assertion(val, msg).to.not.be.a('boolean'); |
| 2885 }; |
| 2886 |
| 2887 /** |
| 2888 * ### .typeOf(value, name, [message]) |
| 2889 * |
| 2890 * Asserts that `value`'s type is `name`, as determined by |
| 2891 * `Object.prototype.toString`. |
| 2892 * |
| 2893 * assert.typeOf({ tea: 'chai' }, 'object', 'we have an object'); |
| 2894 * assert.typeOf(['chai', 'jasmine'], 'array', 'we have an array'); |
| 2895 * assert.typeOf('tea', 'string', 'we have a string'); |
| 2896 * assert.typeOf(/tea/, 'regexp', 'we have a regular expression'); |
| 2897 * assert.typeOf(null, 'null', 'we have a null'); |
| 2898 * assert.typeOf(undefined, 'undefined', 'we have an undefined'); |
| 2899 * |
| 2900 * @name typeOf |
| 2901 * @param {Mixed} value |
| 2902 * @param {String} name |
| 2903 * @param {String} message |
| 2904 * @namespace Assert |
| 2905 * @api public |
| 2906 */ |
| 2907 |
| 2908 assert.typeOf = function (val, type, msg) { |
| 2909 new Assertion(val, msg).to.be.a(type); |
| 2910 }; |
| 2911 |
| 2912 /** |
| 2913 * ### .notTypeOf(value, name, [message]) |
| 2914 * |
| 2915 * Asserts that `value`'s type is _not_ `name`, as determined by |
| 2916 * `Object.prototype.toString`. |
| 2917 * |
| 2918 * assert.notTypeOf('tea', 'number', 'strings are not numbers'); |
| 2919 * |
| 2920 * @name notTypeOf |
| 2921 * @param {Mixed} value |
| 2922 * @param {String} typeof name |
| 2923 * @param {String} message |
| 2924 * @namespace Assert |
| 2925 * @api public |
| 2926 */ |
| 2927 |
| 2928 assert.notTypeOf = function (val, type, msg) { |
| 2929 new Assertion(val, msg).to.not.be.a(type); |
| 2930 }; |
| 2931 |
| 2932 /** |
| 2933 * ### .instanceOf(object, constructor, [message]) |
| 2934 * |
| 2935 * Asserts that `value` is an instance of `constructor`. |
| 2936 * |
| 2937 * var Tea = function (name) { this.name = name; } |
| 2938 * , chai = new Tea('chai'); |
| 2939 * |
| 2940 * assert.instanceOf(chai, Tea, 'chai is an instance of tea'); |
| 2941 * |
| 2942 * @name instanceOf |
| 2943 * @param {Object} object |
| 2944 * @param {Constructor} constructor |
| 2945 * @param {String} message |
| 2946 * @namespace Assert |
| 2947 * @api public |
| 2948 */ |
| 2949 |
| 2950 assert.instanceOf = function (val, type, msg) { |
| 2951 new Assertion(val, msg).to.be.instanceOf(type); |
| 2952 }; |
| 2953 |
| 2954 /** |
| 2955 * ### .notInstanceOf(object, constructor, [message]) |
| 2956 * |
| 2957 * Asserts `value` is not an instance of `constructor`. |
| 2958 * |
| 2959 * var Tea = function (name) { this.name = name; } |
| 2960 * , chai = new String('chai'); |
| 2961 * |
| 2962 * assert.notInstanceOf(chai, Tea, 'chai is not an instance of tea'); |
| 2963 * |
| 2964 * @name notInstanceOf |
| 2965 * @param {Object} object |
| 2966 * @param {Constructor} constructor |
| 2967 * @param {String} message |
| 2968 * @namespace Assert |
| 2969 * @api public |
| 2970 */ |
| 2971 |
| 2972 assert.notInstanceOf = function (val, type, msg) { |
| 2973 new Assertion(val, msg).to.not.be.instanceOf(type); |
| 2974 }; |
| 2975 |
| 2976 /** |
| 2977 * ### .include(haystack, needle, [message]) |
| 2978 * |
| 2979 * Asserts that `haystack` includes `needle`. Works |
| 2980 * for strings and arrays. |
| 2981 * |
| 2982 * assert.include('foobar', 'bar', 'foobar contains string "bar"'); |
| 2983 * assert.include([ 1, 2, 3 ], 3, 'array contains value'); |
| 2984 * |
| 2985 * @name include |
| 2986 * @param {Array|String} haystack |
| 2987 * @param {Mixed} needle |
| 2988 * @param {String} message |
| 2989 * @namespace Assert |
| 2990 * @api public |
| 2991 */ |
| 2992 |
| 2993 assert.include = function (exp, inc, msg) { |
| 2994 new Assertion(exp, msg, assert.include).include(inc); |
| 2995 }; |
| 2996 |
| 2997 /** |
| 2998 * ### .notInclude(haystack, needle, [message]) |
| 2999 * |
| 3000 * Asserts that `haystack` does not include `needle`. Works |
| 3001 * for strings and arrays. |
| 3002 * |
| 3003 * assert.notInclude('foobar', 'baz', 'string not include substring'); |
| 3004 * assert.notInclude([ 1, 2, 3 ], 4, 'array not include contain value'); |
| 3005 * |
| 3006 * @name notInclude |
| 3007 * @param {Array|String} haystack |
| 3008 * @param {Mixed} needle |
| 3009 * @param {String} message |
| 3010 * @namespace Assert |
| 3011 * @api public |
| 3012 */ |
| 3013 |
| 3014 assert.notInclude = function (exp, inc, msg) { |
| 3015 new Assertion(exp, msg, assert.notInclude).not.include(inc); |
| 3016 }; |
| 3017 |
| 3018 /** |
| 3019 * ### .match(value, regexp, [message]) |
| 3020 * |
| 3021 * Asserts that `value` matches the regular expression `regexp`. |
| 3022 * |
| 3023 * assert.match('foobar', /^foo/, 'regexp matches'); |
| 3024 * |
| 3025 * @name match |
| 3026 * @param {Mixed} value |
| 3027 * @param {RegExp} regexp |
| 3028 * @param {String} message |
| 3029 * @namespace Assert |
| 3030 * @api public |
| 3031 */ |
| 3032 |
| 3033 assert.match = function (exp, re, msg) { |
| 3034 new Assertion(exp, msg).to.match(re); |
| 3035 }; |
| 3036 |
| 3037 /** |
| 3038 * ### .notMatch(value, regexp, [message]) |
| 3039 * |
| 3040 * Asserts that `value` does not match the regular expression `regexp`. |
| 3041 * |
| 3042 * assert.notMatch('foobar', /^foo/, 'regexp does not match'); |
| 3043 * |
| 3044 * @name notMatch |
| 3045 * @param {Mixed} value |
| 3046 * @param {RegExp} regexp |
| 3047 * @param {String} message |
| 3048 * @namespace Assert |
| 3049 * @api public |
| 3050 */ |
| 3051 |
| 3052 assert.notMatch = function (exp, re, msg) { |
| 3053 new Assertion(exp, msg).to.not.match(re); |
| 3054 }; |
| 3055 |
| 3056 /** |
| 3057 * ### .property(object, property, [message]) |
| 3058 * |
| 3059 * Asserts that `object` has a property named by `property`. |
| 3060 * |
| 3061 * assert.property({ tea: { green: 'matcha' }}, 'tea'); |
| 3062 * |
| 3063 * @name property |
| 3064 * @param {Object} object |
| 3065 * @param {String} property |
| 3066 * @param {String} message |
| 3067 * @namespace Assert |
| 3068 * @api public |
| 3069 */ |
| 3070 |
| 3071 assert.property = function (obj, prop, msg) { |
| 3072 new Assertion(obj, msg).to.have.property(prop); |
| 3073 }; |
| 3074 |
| 3075 /** |
| 3076 * ### .notProperty(object, property, [message]) |
| 3077 * |
| 3078 * Asserts that `object` does _not_ have a property named by `property`. |
| 3079 * |
| 3080 * assert.notProperty({ tea: { green: 'matcha' }}, 'coffee'); |
| 3081 * |
| 3082 * @name notProperty |
| 3083 * @param {Object} object |
| 3084 * @param {String} property |
| 3085 * @param {String} message |
| 3086 * @namespace Assert |
| 3087 * @api public |
| 3088 */ |
| 3089 |
| 3090 assert.notProperty = function (obj, prop, msg) { |
| 3091 new Assertion(obj, msg).to.not.have.property(prop); |
| 3092 }; |
| 3093 |
| 3094 /** |
| 3095 * ### .deepProperty(object, property, [message]) |
| 3096 * |
| 3097 * Asserts that `object` has a property named by `property`, which can be a |
| 3098 * string using dot- and bracket-notation for deep reference. |
| 3099 * |
| 3100 * assert.deepProperty({ tea: { green: 'matcha' }}, 'tea.green'); |
| 3101 * |
| 3102 * @name deepProperty |
| 3103 * @param {Object} object |
| 3104 * @param {String} property |
| 3105 * @param {String} message |
| 3106 * @namespace Assert |
| 3107 * @api public |
| 3108 */ |
| 3109 |
| 3110 assert.deepProperty = function (obj, prop, msg) { |
| 3111 new Assertion(obj, msg).to.have.deep.property(prop); |
| 3112 }; |
| 3113 |
| 3114 /** |
| 3115 * ### .notDeepProperty(object, property, [message]) |
| 3116 * |
| 3117 * Asserts that `object` does _not_ have a property named by `property`, which |
| 3118 * can be a string using dot- and bracket-notation for deep reference. |
| 3119 * |
| 3120 * assert.notDeepProperty({ tea: { green: 'matcha' }}, 'tea.oolong'); |
| 3121 * |
| 3122 * @name notDeepProperty |
| 3123 * @param {Object} object |
| 3124 * @param {String} property |
| 3125 * @param {String} message |
| 3126 * @namespace Assert |
| 3127 * @api public |
| 3128 */ |
| 3129 |
| 3130 assert.notDeepProperty = function (obj, prop, msg) { |
| 3131 new Assertion(obj, msg).to.not.have.deep.property(prop); |
| 3132 }; |
| 3133 |
| 3134 /** |
| 3135 * ### .propertyVal(object, property, value, [message]) |
| 3136 * |
| 3137 * Asserts that `object` has a property named by `property` with value given |
| 3138 * by `value`. |
| 3139 * |
| 3140 * assert.propertyVal({ tea: 'is good' }, 'tea', 'is good'); |
| 3141 * |
| 3142 * @name propertyVal |
| 3143 * @param {Object} object |
| 3144 * @param {String} property |
| 3145 * @param {Mixed} value |
| 3146 * @param {String} message |
| 3147 * @namespace Assert |
| 3148 * @api public |
| 3149 */ |
| 3150 |
| 3151 assert.propertyVal = function (obj, prop, val, msg) { |
| 3152 new Assertion(obj, msg).to.have.property(prop, val); |
| 3153 }; |
| 3154 |
| 3155 /** |
| 3156 * ### .propertyNotVal(object, property, value, [message]) |
| 3157 * |
| 3158 * Asserts that `object` has a property named by `property`, but with a value |
| 3159 * different from that given by `value`. |
| 3160 * |
| 3161 * assert.propertyNotVal({ tea: 'is good' }, 'tea', 'is bad'); |
| 3162 * |
| 3163 * @name propertyNotVal |
| 3164 * @param {Object} object |
| 3165 * @param {String} property |
| 3166 * @param {Mixed} value |
| 3167 * @param {String} message |
| 3168 * @namespace Assert |
| 3169 * @api public |
| 3170 */ |
| 3171 |
| 3172 assert.propertyNotVal = function (obj, prop, val, msg) { |
| 3173 new Assertion(obj, msg).to.not.have.property(prop, val); |
| 3174 }; |
| 3175 |
| 3176 /** |
| 3177 * ### .deepPropertyVal(object, property, value, [message]) |
| 3178 * |
| 3179 * Asserts that `object` has a property named by `property` with value given |
| 3180 * by `value`. `property` can use dot- and bracket-notation for deep |
| 3181 * reference. |
| 3182 * |
| 3183 * assert.deepPropertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'match
a'); |
| 3184 * |
| 3185 * @name deepPropertyVal |
| 3186 * @param {Object} object |
| 3187 * @param {String} property |
| 3188 * @param {Mixed} value |
| 3189 * @param {String} message |
| 3190 * @namespace Assert |
| 3191 * @api public |
| 3192 */ |
| 3193 |
| 3194 assert.deepPropertyVal = function (obj, prop, val, msg) { |
| 3195 new Assertion(obj, msg).to.have.deep.property(prop, val); |
| 3196 }; |
| 3197 |
| 3198 /** |
| 3199 * ### .deepPropertyNotVal(object, property, value, [message]) |
| 3200 * |
| 3201 * Asserts that `object` has a property named by `property`, but with a value |
| 3202 * different from that given by `value`. `property` can use dot- and |
| 3203 * bracket-notation for deep reference. |
| 3204 * |
| 3205 * assert.deepPropertyNotVal({ tea: { green: 'matcha' }}, 'tea.green', 'ko
nacha'); |
| 3206 * |
| 3207 * @name deepPropertyNotVal |
| 3208 * @param {Object} object |
| 3209 * @param {String} property |
| 3210 * @param {Mixed} value |
| 3211 * @param {String} message |
| 3212 * @namespace Assert |
| 3213 * @api public |
| 3214 */ |
| 3215 |
| 3216 assert.deepPropertyNotVal = function (obj, prop, val, msg) { |
| 3217 new Assertion(obj, msg).to.not.have.deep.property(prop, val); |
| 3218 }; |
| 3219 |
| 3220 /** |
| 3221 * ### .lengthOf(object, length, [message]) |
| 3222 * |
| 3223 * Asserts that `object` has a `length` property with the expected value. |
| 3224 * |
| 3225 * assert.lengthOf([1,2,3], 3, 'array has length of 3'); |
| 3226 * assert.lengthOf('foobar', 6, 'string has length of 6'); |
| 3227 * |
| 3228 * @name lengthOf |
| 3229 * @param {Mixed} object |
| 3230 * @param {Number} length |
| 3231 * @param {String} message |
| 3232 * @namespace Assert |
| 3233 * @api public |
| 3234 */ |
| 3235 |
| 3236 assert.lengthOf = function (exp, len, msg) { |
| 3237 new Assertion(exp, msg).to.have.length(len); |
| 3238 }; |
| 3239 |
| 3240 /** |
| 3241 * ### .throws(function, [constructor/string/regexp], [string/regexp], [messag
e]) |
| 3242 * |
| 3243 * Asserts that `function` will throw an error that is an instance of |
| 3244 * `constructor`, or alternately that it will throw an error with message |
| 3245 * matching `regexp`. |
| 3246 * |
| 3247 * assert.throws(fn, 'function throws a reference error'); |
| 3248 * assert.throws(fn, /function throws a reference error/); |
| 3249 * assert.throws(fn, ReferenceError); |
| 3250 * assert.throws(fn, ReferenceError, 'function throws a reference error'); |
| 3251 * assert.throws(fn, ReferenceError, /function throws a reference error/); |
| 3252 * |
| 3253 * @name throws |
| 3254 * @alias throw |
| 3255 * @alias Throw |
| 3256 * @param {Function} function |
| 3257 * @param {ErrorConstructor} constructor |
| 3258 * @param {RegExp} regexp |
| 3259 * @param {String} message |
| 3260 * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/E
rror#Error_types |
| 3261 * @namespace Assert |
| 3262 * @api public |
| 3263 */ |
| 3264 |
| 3265 assert.throws = function (fn, errt, errs, msg) { |
| 3266 if ('string' === typeof errt || errt instanceof RegExp) { |
| 3267 errs = errt; |
| 3268 errt = null; |
| 3269 } |
| 3270 |
| 3271 var assertErr = new Assertion(fn, msg).to.throw(errt, errs); |
| 3272 return flag(assertErr, 'object'); |
| 3273 }; |
| 3274 |
| 3275 /** |
| 3276 * ### .doesNotThrow(function, [constructor/regexp], [message]) |
| 3277 * |
| 3278 * Asserts that `function` will _not_ throw an error that is an instance of |
| 3279 * `constructor`, or alternately that it will not throw an error with message |
| 3280 * matching `regexp`. |
| 3281 * |
| 3282 * assert.doesNotThrow(fn, Error, 'function does not throw'); |
| 3283 * |
| 3284 * @name doesNotThrow |
| 3285 * @param {Function} function |
| 3286 * @param {ErrorConstructor} constructor |
| 3287 * @param {RegExp} regexp |
| 3288 * @param {String} message |
| 3289 * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/E
rror#Error_types |
| 3290 * @namespace Assert |
| 3291 * @api public |
| 3292 */ |
| 3293 |
| 3294 assert.doesNotThrow = function (fn, type, msg) { |
| 3295 if ('string' === typeof type) { |
| 3296 msg = type; |
| 3297 type = null; |
| 3298 } |
| 3299 |
| 3300 new Assertion(fn, msg).to.not.Throw(type); |
| 3301 }; |
| 3302 |
| 3303 /** |
| 3304 * ### .operator(val1, operator, val2, [message]) |
| 3305 * |
| 3306 * Compares two values using `operator`. |
| 3307 * |
| 3308 * assert.operator(1, '<', 2, 'everything is ok'); |
| 3309 * assert.operator(1, '>', 2, 'this will fail'); |
| 3310 * |
| 3311 * @name operator |
| 3312 * @param {Mixed} val1 |
| 3313 * @param {String} operator |
| 3314 * @param {Mixed} val2 |
| 3315 * @param {String} message |
| 3316 * @namespace Assert |
| 3317 * @api public |
| 3318 */ |
| 3319 |
| 3320 assert.operator = function (val, operator, val2, msg) { |
| 3321 var ok; |
| 3322 switch(operator) { |
| 3323 case '==': |
| 3324 ok = val == val2; |
| 3325 break; |
| 3326 case '===': |
| 3327 ok = val === val2; |
| 3328 break; |
| 3329 case '>': |
| 3330 ok = val > val2; |
| 3331 break; |
| 3332 case '>=': |
| 3333 ok = val >= val2; |
| 3334 break; |
| 3335 case '<': |
| 3336 ok = val < val2; |
| 3337 break; |
| 3338 case '<=': |
| 3339 ok = val <= val2; |
| 3340 break; |
| 3341 case '!=': |
| 3342 ok = val != val2; |
| 3343 break; |
| 3344 case '!==': |
| 3345 ok = val !== val2; |
| 3346 break; |
| 3347 default: |
| 3348 throw new Error('Invalid operator "' + operator + '"'); |
| 3349 } |
| 3350 var test = new Assertion(ok, msg); |
| 3351 test.assert( |
| 3352 true === flag(test, 'object') |
| 3353 , 'expected ' + util.inspect(val) + ' to be ' + operator + ' ' + util.insp
ect(val2) |
| 3354 , 'expected ' + util.inspect(val) + ' to not be ' + operator + ' ' + util.
inspect(val2) ); |
| 3355 }; |
| 3356 |
| 3357 /** |
| 3358 * ### .closeTo(actual, expected, delta, [message]) |
| 3359 * |
| 3360 * Asserts that the target is equal `expected`, to within a +/- `delta` range. |
| 3361 * |
| 3362 * assert.closeTo(1.5, 1, 0.5, 'numbers are close'); |
| 3363 * |
| 3364 * @name closeTo |
| 3365 * @param {Number} actual |
| 3366 * @param {Number} expected |
| 3367 * @param {Number} delta |
| 3368 * @param {String} message |
| 3369 * @namespace Assert |
| 3370 * @api public |
| 3371 */ |
| 3372 |
| 3373 assert.closeTo = function (act, exp, delta, msg) { |
| 3374 new Assertion(act, msg).to.be.closeTo(exp, delta); |
| 3375 }; |
| 3376 |
| 3377 /** |
| 3378 * ### .approximately(actual, expected, delta, [message]) |
| 3379 * |
| 3380 * Asserts that the target is equal `expected`, to within a +/- `delta` range. |
| 3381 * |
| 3382 * assert.approximately(1.5, 1, 0.5, 'numbers are close'); |
| 3383 * |
| 3384 * @name approximately |
| 3385 * @param {Number} actual |
| 3386 * @param {Number} expected |
| 3387 * @param {Number} delta |
| 3388 * @param {String} message |
| 3389 * @namespace Assert |
| 3390 * @api public |
| 3391 */ |
| 3392 |
| 3393 assert.approximately = function (act, exp, delta, msg) { |
| 3394 new Assertion(act, msg).to.be.approximately(exp, delta); |
| 3395 }; |
| 3396 |
| 3397 /** |
| 3398 * ### .sameMembers(set1, set2, [message]) |
| 3399 * |
| 3400 * Asserts that `set1` and `set2` have the same members. |
| 3401 * Order is not taken into account. |
| 3402 * |
| 3403 * assert.sameMembers([ 1, 2, 3 ], [ 2, 1, 3 ], 'same members'); |
| 3404 * |
| 3405 * @name sameMembers |
| 3406 * @param {Array} set1 |
| 3407 * @param {Array} set2 |
| 3408 * @param {String} message |
| 3409 * @namespace Assert |
| 3410 * @api public |
| 3411 */ |
| 3412 |
| 3413 assert.sameMembers = function (set1, set2, msg) { |
| 3414 new Assertion(set1, msg).to.have.same.members(set2); |
| 3415 } |
| 3416 |
| 3417 /** |
| 3418 * ### .sameDeepMembers(set1, set2, [message]) |
| 3419 * |
| 3420 * Asserts that `set1` and `set2` have the same members - using a deep equalit
y checking. |
| 3421 * Order is not taken into account. |
| 3422 * |
| 3423 * assert.sameDeepMembers([ {b: 3}, {a: 2}, {c: 5} ], [ {c: 5}, {b: 3}, {a
: 2} ], 'same deep members'); |
| 3424 * |
| 3425 * @name sameDeepMembers |
| 3426 * @param {Array} set1 |
| 3427 * @param {Array} set2 |
| 3428 * @param {String} message |
| 3429 * @namespace Assert |
| 3430 * @api public |
| 3431 */ |
| 3432 |
| 3433 assert.sameDeepMembers = function (set1, set2, msg) { |
| 3434 new Assertion(set1, msg).to.have.same.deep.members(set2); |
| 3435 } |
| 3436 |
| 3437 /** |
| 3438 * ### .includeMembers(superset, subset, [message]) |
| 3439 * |
| 3440 * Asserts that `subset` is included in `superset`. |
| 3441 * Order is not taken into account. |
| 3442 * |
| 3443 * assert.includeMembers([ 1, 2, 3 ], [ 2, 1 ], 'include members'); |
| 3444 * |
| 3445 * @name includeMembers |
| 3446 * @param {Array} superset |
| 3447 * @param {Array} subset |
| 3448 * @param {String} message |
| 3449 * @namespace Assert |
| 3450 * @api public |
| 3451 */ |
| 3452 |
| 3453 assert.includeMembers = function (superset, subset, msg) { |
| 3454 new Assertion(superset, msg).to.include.members(subset); |
| 3455 } |
| 3456 |
| 3457 /** |
| 3458 * ### .includeDeepMembers(superset, subset, [message]) |
| 3459 * |
| 3460 * Asserts that `subset` is included in `superset` - using deep equality check
ing. |
| 3461 * Order is not taken into account. |
| 3462 * Duplicates are ignored. |
| 3463 * |
| 3464 * assert.includeDeepMembers([ {a: 1}, {b: 2}, {c: 3} ], [ {b: 2}, {a: 1},
{b: 2} ], 'include deep members'); |
| 3465 * |
| 3466 * @name includeDeepMembers |
| 3467 * @param {Array} superset |
| 3468 * @param {Array} subset |
| 3469 * @param {String} message |
| 3470 * @namespace Assert |
| 3471 * @api public |
| 3472 */ |
| 3473 |
| 3474 assert.includeDeepMembers = function (superset, subset, msg) { |
| 3475 new Assertion(superset, msg).to.include.deep.members(subset); |
| 3476 } |
| 3477 |
| 3478 /** |
| 3479 * ### .oneOf(inList, list, [message]) |
| 3480 * |
| 3481 * Asserts that non-object, non-array value `inList` appears in the flat array
`list`. |
| 3482 * |
| 3483 * assert.oneOf(1, [ 2, 1 ], 'Not found in list'); |
| 3484 * |
| 3485 * @name oneOf |
| 3486 * @param {*} inList |
| 3487 * @param {Array<*>} list |
| 3488 * @param {String} message |
| 3489 * @namespace Assert |
| 3490 * @api public |
| 3491 */ |
| 3492 |
| 3493 assert.oneOf = function (inList, list, msg) { |
| 3494 new Assertion(inList, msg).to.be.oneOf(list); |
| 3495 } |
| 3496 |
| 3497 /** |
| 3498 * ### .changes(function, object, property) |
| 3499 * |
| 3500 * Asserts that a function changes the value of a property |
| 3501 * |
| 3502 * var obj = { val: 10 }; |
| 3503 * var fn = function() { obj.val = 22 }; |
| 3504 * assert.changes(fn, obj, 'val'); |
| 3505 * |
| 3506 * @name changes |
| 3507 * @param {Function} modifier function |
| 3508 * @param {Object} object |
| 3509 * @param {String} property name |
| 3510 * @param {String} message _optional_ |
| 3511 * @namespace Assert |
| 3512 * @api public |
| 3513 */ |
| 3514 |
| 3515 assert.changes = function (fn, obj, prop) { |
| 3516 new Assertion(fn).to.change(obj, prop); |
| 3517 } |
| 3518 |
| 3519 /** |
| 3520 * ### .doesNotChange(function, object, property) |
| 3521 * |
| 3522 * Asserts that a function does not changes the value of a property |
| 3523 * |
| 3524 * var obj = { val: 10 }; |
| 3525 * var fn = function() { console.log('foo'); }; |
| 3526 * assert.doesNotChange(fn, obj, 'val'); |
| 3527 * |
| 3528 * @name doesNotChange |
| 3529 * @param {Function} modifier function |
| 3530 * @param {Object} object |
| 3531 * @param {String} property name |
| 3532 * @param {String} message _optional_ |
| 3533 * @namespace Assert |
| 3534 * @api public |
| 3535 */ |
| 3536 |
| 3537 assert.doesNotChange = function (fn, obj, prop) { |
| 3538 new Assertion(fn).to.not.change(obj, prop); |
| 3539 } |
| 3540 |
| 3541 /** |
| 3542 * ### .increases(function, object, property) |
| 3543 * |
| 3544 * Asserts that a function increases an object property |
| 3545 * |
| 3546 * var obj = { val: 10 }; |
| 3547 * var fn = function() { obj.val = 13 }; |
| 3548 * assert.increases(fn, obj, 'val'); |
| 3549 * |
| 3550 * @name increases |
| 3551 * @param {Function} modifier function |
| 3552 * @param {Object} object |
| 3553 * @param {String} property name |
| 3554 * @param {String} message _optional_ |
| 3555 * @namespace Assert |
| 3556 * @api public |
| 3557 */ |
| 3558 |
| 3559 assert.increases = function (fn, obj, prop) { |
| 3560 new Assertion(fn).to.increase(obj, prop); |
| 3561 } |
| 3562 |
| 3563 /** |
| 3564 * ### .doesNotIncrease(function, object, property) |
| 3565 * |
| 3566 * Asserts that a function does not increase object property |
| 3567 * |
| 3568 * var obj = { val: 10 }; |
| 3569 * var fn = function() { obj.val = 8 }; |
| 3570 * assert.doesNotIncrease(fn, obj, 'val'); |
| 3571 * |
| 3572 * @name doesNotIncrease |
| 3573 * @param {Function} modifier function |
| 3574 * @param {Object} object |
| 3575 * @param {String} property name |
| 3576 * @param {String} message _optional_ |
| 3577 * @namespace Assert |
| 3578 * @api public |
| 3579 */ |
| 3580 |
| 3581 assert.doesNotIncrease = function (fn, obj, prop) { |
| 3582 new Assertion(fn).to.not.increase(obj, prop); |
| 3583 } |
| 3584 |
| 3585 /** |
| 3586 * ### .decreases(function, object, property) |
| 3587 * |
| 3588 * Asserts that a function decreases an object property |
| 3589 * |
| 3590 * var obj = { val: 10 }; |
| 3591 * var fn = function() { obj.val = 5 }; |
| 3592 * assert.decreases(fn, obj, 'val'); |
| 3593 * |
| 3594 * @name decreases |
| 3595 * @param {Function} modifier function |
| 3596 * @param {Object} object |
| 3597 * @param {String} property name |
| 3598 * @param {String} message _optional_ |
| 3599 * @namespace Assert |
| 3600 * @api public |
| 3601 */ |
| 3602 |
| 3603 assert.decreases = function (fn, obj, prop) { |
| 3604 new Assertion(fn).to.decrease(obj, prop); |
| 3605 } |
| 3606 |
| 3607 /** |
| 3608 * ### .doesNotDecrease(function, object, property) |
| 3609 * |
| 3610 * Asserts that a function does not decreases an object property |
| 3611 * |
| 3612 * var obj = { val: 10 }; |
| 3613 * var fn = function() { obj.val = 15 }; |
| 3614 * assert.doesNotDecrease(fn, obj, 'val'); |
| 3615 * |
| 3616 * @name doesNotDecrease |
| 3617 * @param {Function} modifier function |
| 3618 * @param {Object} object |
| 3619 * @param {String} property name |
| 3620 * @param {String} message _optional_ |
| 3621 * @namespace Assert |
| 3622 * @api public |
| 3623 */ |
| 3624 |
| 3625 assert.doesNotDecrease = function (fn, obj, prop) { |
| 3626 new Assertion(fn).to.not.decrease(obj, prop); |
| 3627 } |
| 3628 |
| 3629 /*! |
| 3630 * ### .ifError(object) |
| 3631 * |
| 3632 * Asserts if value is not a false value, and throws if it is a true value. |
| 3633 * This is added to allow for chai to be a drop-in replacement for Node's |
| 3634 * assert class. |
| 3635 * |
| 3636 * var err = new Error('I am a custom error'); |
| 3637 * assert.ifError(err); // Rethrows err! |
| 3638 * |
| 3639 * @name ifError |
| 3640 * @param {Object} object |
| 3641 * @namespace Assert |
| 3642 * @api public |
| 3643 */ |
| 3644 |
| 3645 assert.ifError = function (val) { |
| 3646 if (val) { |
| 3647 throw(val); |
| 3648 } |
| 3649 }; |
| 3650 |
| 3651 /** |
| 3652 * ### .isExtensible(object) |
| 3653 * |
| 3654 * Asserts that `object` is extensible (can have new properties added to it). |
| 3655 * |
| 3656 * assert.isExtensible({}); |
| 3657 * |
| 3658 * @name isExtensible |
| 3659 * @alias extensible |
| 3660 * @param {Object} object |
| 3661 * @param {String} message _optional_ |
| 3662 * @namespace Assert |
| 3663 * @api public |
| 3664 */ |
| 3665 |
| 3666 assert.isExtensible = function (obj, msg) { |
| 3667 new Assertion(obj, msg).to.be.extensible; |
| 3668 }; |
| 3669 |
| 3670 /** |
| 3671 * ### .isNotExtensible(object) |
| 3672 * |
| 3673 * Asserts that `object` is _not_ extensible. |
| 3674 * |
| 3675 * var nonExtensibleObject = Object.preventExtensions({}); |
| 3676 * var sealedObject = Object.seal({}); |
| 3677 * var frozenObject = Object.freese({}); |
| 3678 * |
| 3679 * assert.isNotExtensible(nonExtensibleObject); |
| 3680 * assert.isNotExtensible(sealedObject); |
| 3681 * assert.isNotExtensible(frozenObject); |
| 3682 * |
| 3683 * @name isNotExtensible |
| 3684 * @alias notExtensible |
| 3685 * @param {Object} object |
| 3686 * @param {String} message _optional_ |
| 3687 * @namespace Assert |
| 3688 * @api public |
| 3689 */ |
| 3690 |
| 3691 assert.isNotExtensible = function (obj, msg) { |
| 3692 new Assertion(obj, msg).to.not.be.extensible; |
| 3693 }; |
| 3694 |
| 3695 /** |
| 3696 * ### .isSealed(object) |
| 3697 * |
| 3698 * Asserts that `object` is sealed (cannot have new properties added to it |
| 3699 * and its existing properties cannot be removed). |
| 3700 * |
| 3701 * var sealedObject = Object.seal({}); |
| 3702 * var frozenObject = Object.seal({}); |
| 3703 * |
| 3704 * assert.isSealed(sealedObject); |
| 3705 * assert.isSealed(frozenObject); |
| 3706 * |
| 3707 * @name isSealed |
| 3708 * @alias sealed |
| 3709 * @param {Object} object |
| 3710 * @param {String} message _optional_ |
| 3711 * @namespace Assert |
| 3712 * @api public |
| 3713 */ |
| 3714 |
| 3715 assert.isSealed = function (obj, msg) { |
| 3716 new Assertion(obj, msg).to.be.sealed; |
| 3717 }; |
| 3718 |
| 3719 /** |
| 3720 * ### .isNotSealed(object) |
| 3721 * |
| 3722 * Asserts that `object` is _not_ sealed. |
| 3723 * |
| 3724 * assert.isNotSealed({}); |
| 3725 * |
| 3726 * @name isNotSealed |
| 3727 * @alias notSealed |
| 3728 * @param {Object} object |
| 3729 * @param {String} message _optional_ |
| 3730 * @namespace Assert |
| 3731 * @api public |
| 3732 */ |
| 3733 |
| 3734 assert.isNotSealed = function (obj, msg) { |
| 3735 new Assertion(obj, msg).to.not.be.sealed; |
| 3736 }; |
| 3737 |
| 3738 /** |
| 3739 * ### .isFrozen(object) |
| 3740 * |
| 3741 * Asserts that `object` is frozen (cannot have new properties added to it |
| 3742 * and its existing properties cannot be modified). |
| 3743 * |
| 3744 * var frozenObject = Object.freeze({}); |
| 3745 * assert.frozen(frozenObject); |
| 3746 * |
| 3747 * @name isFrozen |
| 3748 * @alias frozen |
| 3749 * @param {Object} object |
| 3750 * @param {String} message _optional_ |
| 3751 * @namespace Assert |
| 3752 * @api public |
| 3753 */ |
| 3754 |
| 3755 assert.isFrozen = function (obj, msg) { |
| 3756 new Assertion(obj, msg).to.be.frozen; |
| 3757 }; |
| 3758 |
| 3759 /** |
| 3760 * ### .isNotFrozen(object) |
| 3761 * |
| 3762 * Asserts that `object` is _not_ frozen. |
| 3763 * |
| 3764 * assert.isNotFrozen({}); |
| 3765 * |
| 3766 * @name isNotFrozen |
| 3767 * @alias notFrozen |
| 3768 * @param {Object} object |
| 3769 * @param {String} message _optional_ |
| 3770 * @namespace Assert |
| 3771 * @api public |
| 3772 */ |
| 3773 |
| 3774 assert.isNotFrozen = function (obj, msg) { |
| 3775 new Assertion(obj, msg).to.not.be.frozen; |
| 3776 }; |
| 3777 |
| 3778 /*! |
| 3779 * Aliases. |
| 3780 */ |
| 3781 |
| 3782 (function alias(name, as){ |
| 3783 assert[as] = assert[name]; |
| 3784 return alias; |
| 3785 }) |
| 3786 ('isOk', 'ok') |
| 3787 ('isNotOk', 'notOk') |
| 3788 ('throws', 'throw') |
| 3789 ('throws', 'Throw') |
| 3790 ('isExtensible', 'extensible') |
| 3791 ('isNotExtensible', 'notExtensible') |
| 3792 ('isSealed', 'sealed') |
| 3793 ('isNotSealed', 'notSealed') |
| 3794 ('isFrozen', 'frozen') |
| 3795 ('isNotFrozen', 'notFrozen'); |
| 3796 }; |
| 3797 |
| 3798 },{}],7:[function(require,module,exports){ |
| 3799 /*! |
| 3800 * chai |
| 3801 * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com> |
| 3802 * MIT Licensed |
| 3803 */ |
| 3804 |
| 3805 module.exports = function (chai, util) { |
| 3806 chai.expect = function (val, message) { |
| 3807 return new chai.Assertion(val, message); |
| 3808 }; |
| 3809 |
| 3810 /** |
| 3811 * ### .fail(actual, expected, [message], [operator]) |
| 3812 * |
| 3813 * Throw a failure. |
| 3814 * |
| 3815 * @name fail |
| 3816 * @param {Mixed} actual |
| 3817 * @param {Mixed} expected |
| 3818 * @param {String} message |
| 3819 * @param {String} operator |
| 3820 * @namespace Expect |
| 3821 * @api public |
| 3822 */ |
| 3823 |
| 3824 chai.expect.fail = function (actual, expected, message, operator) { |
| 3825 message = message || 'expect.fail()'; |
| 3826 throw new chai.AssertionError(message, { |
| 3827 actual: actual |
| 3828 , expected: expected |
| 3829 , operator: operator |
| 3830 }, chai.expect.fail); |
| 3831 }; |
| 3832 }; |
| 3833 |
| 3834 },{}],8:[function(require,module,exports){ |
| 3835 /*! |
| 3836 * chai |
| 3837 * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com> |
| 3838 * MIT Licensed |
| 3839 */ |
| 3840 |
| 3841 module.exports = function (chai, util) { |
| 3842 var Assertion = chai.Assertion; |
| 3843 |
| 3844 function loadShould () { |
| 3845 // explicitly define this method as function as to have it's name to include
as `ssfi` |
| 3846 function shouldGetter() { |
| 3847 if (this instanceof String || this instanceof Number || this instanceof Bo
olean ) { |
| 3848 return new Assertion(this.valueOf(), null, shouldGetter); |
| 3849 } |
| 3850 return new Assertion(this, null, shouldGetter); |
| 3851 } |
| 3852 function shouldSetter(value) { |
| 3853 // See https://github.com/chaijs/chai/issues/86: this makes |
| 3854 // `whatever.should = someValue` actually set `someValue`, which is |
| 3855 // especially useful for `global.should = require('chai').should()`. |
| 3856 // |
| 3857 // Note that we have to use [[DefineProperty]] instead of [[Put]] |
| 3858 // since otherwise we would trigger this very setter! |
| 3859 Object.defineProperty(this, 'should', { |
| 3860 value: value, |
| 3861 enumerable: true, |
| 3862 configurable: true, |
| 3863 writable: true |
| 3864 }); |
| 3865 } |
| 3866 // modify Object.prototype to have `should` |
| 3867 Object.defineProperty(Object.prototype, 'should', { |
| 3868 set: shouldSetter |
| 3869 , get: shouldGetter |
| 3870 , configurable: true |
| 3871 }); |
| 3872 |
| 3873 var should = {}; |
| 3874 |
| 3875 /** |
| 3876 * ### .fail(actual, expected, [message], [operator]) |
| 3877 * |
| 3878 * Throw a failure. |
| 3879 * |
| 3880 * @name fail |
| 3881 * @param {Mixed} actual |
| 3882 * @param {Mixed} expected |
| 3883 * @param {String} message |
| 3884 * @param {String} operator |
| 3885 * @namespace Should |
| 3886 * @api public |
| 3887 */ |
| 3888 |
| 3889 should.fail = function (actual, expected, message, operator) { |
| 3890 message = message || 'should.fail()'; |
| 3891 throw new chai.AssertionError(message, { |
| 3892 actual: actual |
| 3893 , expected: expected |
| 3894 , operator: operator |
| 3895 }, should.fail); |
| 3896 }; |
| 3897 |
| 3898 /** |
| 3899 * ### .equal(actual, expected, [message]) |
| 3900 * |
| 3901 * Asserts non-strict equality (`==`) of `actual` and `expected`. |
| 3902 * |
| 3903 * should.equal(3, '3', '== coerces values to strings'); |
| 3904 * |
| 3905 * @name equal |
| 3906 * @param {Mixed} actual |
| 3907 * @param {Mixed} expected |
| 3908 * @param {String} message |
| 3909 * @namespace Should |
| 3910 * @api public |
| 3911 */ |
| 3912 |
| 3913 should.equal = function (val1, val2, msg) { |
| 3914 new Assertion(val1, msg).to.equal(val2); |
| 3915 }; |
| 3916 |
| 3917 /** |
| 3918 * ### .throw(function, [constructor/string/regexp], [string/regexp], [messa
ge]) |
| 3919 * |
| 3920 * Asserts that `function` will throw an error that is an instance of |
| 3921 * `constructor`, or alternately that it will throw an error with message |
| 3922 * matching `regexp`. |
| 3923 * |
| 3924 * should.throw(fn, 'function throws a reference error'); |
| 3925 * should.throw(fn, /function throws a reference error/); |
| 3926 * should.throw(fn, ReferenceError); |
| 3927 * should.throw(fn, ReferenceError, 'function throws a reference error')
; |
| 3928 * should.throw(fn, ReferenceError, /function throws a reference error/)
; |
| 3929 * |
| 3930 * @name throw |
| 3931 * @alias Throw |
| 3932 * @param {Function} function |
| 3933 * @param {ErrorConstructor} constructor |
| 3934 * @param {RegExp} regexp |
| 3935 * @param {String} message |
| 3936 * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects
/Error#Error_types |
| 3937 * @namespace Should |
| 3938 * @api public |
| 3939 */ |
| 3940 |
| 3941 should.Throw = function (fn, errt, errs, msg) { |
| 3942 new Assertion(fn, msg).to.Throw(errt, errs); |
| 3943 }; |
| 3944 |
| 3945 /** |
| 3946 * ### .exist |
| 3947 * |
| 3948 * Asserts that the target is neither `null` nor `undefined`. |
| 3949 * |
| 3950 * var foo = 'hi'; |
| 3951 * |
| 3952 * should.exist(foo, 'foo exists'); |
| 3953 * |
| 3954 * @name exist |
| 3955 * @namespace Should |
| 3956 * @api public |
| 3957 */ |
| 3958 |
| 3959 should.exist = function (val, msg) { |
| 3960 new Assertion(val, msg).to.exist; |
| 3961 } |
| 3962 |
| 3963 // negation |
| 3964 should.not = {} |
| 3965 |
| 3966 /** |
| 3967 * ### .not.equal(actual, expected, [message]) |
| 3968 * |
| 3969 * Asserts non-strict inequality (`!=`) of `actual` and `expected`. |
| 3970 * |
| 3971 * should.not.equal(3, 4, 'these numbers are not equal'); |
| 3972 * |
| 3973 * @name not.equal |
| 3974 * @param {Mixed} actual |
| 3975 * @param {Mixed} expected |
| 3976 * @param {String} message |
| 3977 * @namespace Should |
| 3978 * @api public |
| 3979 */ |
| 3980 |
| 3981 should.not.equal = function (val1, val2, msg) { |
| 3982 new Assertion(val1, msg).to.not.equal(val2); |
| 3983 }; |
| 3984 |
| 3985 /** |
| 3986 * ### .throw(function, [constructor/regexp], [message]) |
| 3987 * |
| 3988 * Asserts that `function` will _not_ throw an error that is an instance of |
| 3989 * `constructor`, or alternately that it will not throw an error with messag
e |
| 3990 * matching `regexp`. |
| 3991 * |
| 3992 * should.not.throw(fn, Error, 'function does not throw'); |
| 3993 * |
| 3994 * @name not.throw |
| 3995 * @alias not.Throw |
| 3996 * @param {Function} function |
| 3997 * @param {ErrorConstructor} constructor |
| 3998 * @param {RegExp} regexp |
| 3999 * @param {String} message |
| 4000 * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects
/Error#Error_types |
| 4001 * @namespace Should |
| 4002 * @api public |
| 4003 */ |
| 4004 |
| 4005 should.not.Throw = function (fn, errt, errs, msg) { |
| 4006 new Assertion(fn, msg).to.not.Throw(errt, errs); |
| 4007 }; |
| 4008 |
| 4009 /** |
| 4010 * ### .not.exist |
| 4011 * |
| 4012 * Asserts that the target is neither `null` nor `undefined`. |
| 4013 * |
| 4014 * var bar = null; |
| 4015 * |
| 4016 * should.not.exist(bar, 'bar does not exist'); |
| 4017 * |
| 4018 * @name not.exist |
| 4019 * @namespace Should |
| 4020 * @api public |
| 4021 */ |
| 4022 |
| 4023 should.not.exist = function (val, msg) { |
| 4024 new Assertion(val, msg).to.not.exist; |
| 4025 } |
| 4026 |
| 4027 should['throw'] = should['Throw']; |
| 4028 should.not['throw'] = should.not['Throw']; |
| 4029 |
| 4030 return should; |
| 4031 }; |
| 4032 |
| 4033 chai.should = loadShould; |
| 4034 chai.Should = loadShould; |
| 4035 }; |
| 4036 |
| 4037 },{}],9:[function(require,module,exports){ |
| 4038 /*! |
| 4039 * Chai - addChainingMethod utility |
| 4040 * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> |
| 4041 * MIT Licensed |
| 4042 */ |
| 4043 |
| 4044 /*! |
| 4045 * Module dependencies |
| 4046 */ |
| 4047 |
| 4048 var transferFlags = require('./transferFlags'); |
| 4049 var flag = require('./flag'); |
| 4050 var config = require('../config'); |
| 4051 |
| 4052 /*! |
| 4053 * Module variables |
| 4054 */ |
| 4055 |
| 4056 // Check whether `__proto__` is supported |
| 4057 var hasProtoSupport = '__proto__' in Object; |
| 4058 |
| 4059 // Without `__proto__` support, this module will need to add properties to a fun
ction. |
| 4060 // However, some Function.prototype methods cannot be overwritten, |
| 4061 // and there seems no easy cross-platform way to detect them (@see chaijs/chai/i
ssues/69). |
| 4062 var excludeNames = /^(?:length|name|arguments|caller)$/; |
| 4063 |
| 4064 // Cache `Function` properties |
| 4065 var call = Function.prototype.call, |
| 4066 apply = Function.prototype.apply; |
| 4067 |
| 4068 /** |
| 4069 * ### addChainableMethod (ctx, name, method, chainingBehavior) |
| 4070 * |
| 4071 * Adds a method to an object, such that the method can also be chained. |
| 4072 * |
| 4073 * utils.addChainableMethod(chai.Assertion.prototype, 'foo', function (str)
{ |
| 4074 * var obj = utils.flag(this, 'object'); |
| 4075 * new chai.Assertion(obj).to.be.equal(str); |
| 4076 * }); |
| 4077 * |
| 4078 * Can also be accessed directly from `chai.Assertion`. |
| 4079 * |
| 4080 * chai.Assertion.addChainableMethod('foo', fn, chainingBehavior); |
| 4081 * |
| 4082 * The result can then be used as both a method assertion, executing both `metho
d` and |
| 4083 * `chainingBehavior`, or as a language chain, which only executes `chainingBeha
vior`. |
| 4084 * |
| 4085 * expect(fooStr).to.be.foo('bar'); |
| 4086 * expect(fooStr).to.be.foo.equal('foo'); |
| 4087 * |
| 4088 * @param {Object} ctx object to which the method is added |
| 4089 * @param {String} name of method to add |
| 4090 * @param {Function} method function to be used for `name`, when called |
| 4091 * @param {Function} chainingBehavior function to be called every time the prope
rty is accessed |
| 4092 * @namespace Utils |
| 4093 * @name addChainableMethod |
| 4094 * @api public |
| 4095 */ |
| 4096 |
| 4097 module.exports = function (ctx, name, method, chainingBehavior) { |
| 4098 if (typeof chainingBehavior !== 'function') { |
| 4099 chainingBehavior = function () { }; |
| 4100 } |
| 4101 |
| 4102 var chainableBehavior = { |
| 4103 method: method |
| 4104 , chainingBehavior: chainingBehavior |
| 4105 }; |
| 4106 |
| 4107 // save the methods so we can overwrite them later, if we need to. |
| 4108 if (!ctx.__methods) { |
| 4109 ctx.__methods = {}; |
| 4110 } |
| 4111 ctx.__methods[name] = chainableBehavior; |
| 4112 |
| 4113 Object.defineProperty(ctx, name, |
| 4114 { get: function () { |
| 4115 chainableBehavior.chainingBehavior.call(this); |
| 4116 |
| 4117 var assert = function assert() { |
| 4118 var old_ssfi = flag(this, 'ssfi'); |
| 4119 if (old_ssfi && config.includeStack === false) |
| 4120 flag(this, 'ssfi', assert); |
| 4121 var result = chainableBehavior.method.apply(this, arguments); |
| 4122 return result === undefined ? this : result; |
| 4123 }; |
| 4124 |
| 4125 // Use `__proto__` if available |
| 4126 if (hasProtoSupport) { |
| 4127 // Inherit all properties from the object by replacing the `Function`
prototype |
| 4128 var prototype = assert.__proto__ = Object.create(this); |
| 4129 // Restore the `call` and `apply` methods from `Function` |
| 4130 prototype.call = call; |
| 4131 prototype.apply = apply; |
| 4132 } |
| 4133 // Otherwise, redefine all properties (slow!) |
| 4134 else { |
| 4135 var asserterNames = Object.getOwnPropertyNames(ctx); |
| 4136 asserterNames.forEach(function (asserterName) { |
| 4137 if (!excludeNames.test(asserterName)) { |
| 4138 var pd = Object.getOwnPropertyDescriptor(ctx, asserterName); |
| 4139 Object.defineProperty(assert, asserterName, pd); |
| 4140 } |
| 4141 }); |
| 4142 } |
| 4143 |
| 4144 transferFlags(this, assert); |
| 4145 return assert; |
| 4146 } |
| 4147 , configurable: true |
| 4148 }); |
| 4149 }; |
| 4150 |
| 4151 },{"../config":4,"./flag":13,"./transferFlags":29}],10:[function(require,module,
exports){ |
| 4152 /*! |
| 4153 * Chai - addMethod utility |
| 4154 * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> |
| 4155 * MIT Licensed |
| 4156 */ |
| 4157 |
| 4158 var config = require('../config'); |
| 4159 |
| 4160 /** |
| 4161 * ### .addMethod (ctx, name, method) |
| 4162 * |
| 4163 * Adds a method to the prototype of an object. |
| 4164 * |
| 4165 * utils.addMethod(chai.Assertion.prototype, 'foo', function (str) { |
| 4166 * var obj = utils.flag(this, 'object'); |
| 4167 * new chai.Assertion(obj).to.be.equal(str); |
| 4168 * }); |
| 4169 * |
| 4170 * Can also be accessed directly from `chai.Assertion`. |
| 4171 * |
| 4172 * chai.Assertion.addMethod('foo', fn); |
| 4173 * |
| 4174 * Then can be used as any other assertion. |
| 4175 * |
| 4176 * expect(fooStr).to.be.foo('bar'); |
| 4177 * |
| 4178 * @param {Object} ctx object to which the method is added |
| 4179 * @param {String} name of method to add |
| 4180 * @param {Function} method function to be used for name |
| 4181 * @namespace Utils |
| 4182 * @name addMethod |
| 4183 * @api public |
| 4184 */ |
| 4185 var flag = require('./flag'); |
| 4186 |
| 4187 module.exports = function (ctx, name, method) { |
| 4188 ctx[name] = function () { |
| 4189 var old_ssfi = flag(this, 'ssfi'); |
| 4190 if (old_ssfi && config.includeStack === false) |
| 4191 flag(this, 'ssfi', ctx[name]); |
| 4192 var result = method.apply(this, arguments); |
| 4193 return result === undefined ? this : result; |
| 4194 }; |
| 4195 }; |
| 4196 |
| 4197 },{"../config":4,"./flag":13}],11:[function(require,module,exports){ |
| 4198 /*! |
| 4199 * Chai - addProperty utility |
| 4200 * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> |
| 4201 * MIT Licensed |
| 4202 */ |
| 4203 |
| 4204 var config = require('../config'); |
| 4205 var flag = require('./flag'); |
| 4206 |
| 4207 /** |
| 4208 * ### addProperty (ctx, name, getter) |
| 4209 * |
| 4210 * Adds a property to the prototype of an object. |
| 4211 * |
| 4212 * utils.addProperty(chai.Assertion.prototype, 'foo', function () { |
| 4213 * var obj = utils.flag(this, 'object'); |
| 4214 * new chai.Assertion(obj).to.be.instanceof(Foo); |
| 4215 * }); |
| 4216 * |
| 4217 * Can also be accessed directly from `chai.Assertion`. |
| 4218 * |
| 4219 * chai.Assertion.addProperty('foo', fn); |
| 4220 * |
| 4221 * Then can be used as any other assertion. |
| 4222 * |
| 4223 * expect(myFoo).to.be.foo; |
| 4224 * |
| 4225 * @param {Object} ctx object to which the property is added |
| 4226 * @param {String} name of property to add |
| 4227 * @param {Function} getter function to be used for name |
| 4228 * @namespace Utils |
| 4229 * @name addProperty |
| 4230 * @api public |
| 4231 */ |
| 4232 |
| 4233 module.exports = function (ctx, name, getter) { |
| 4234 Object.defineProperty(ctx, name, |
| 4235 { get: function addProperty() { |
| 4236 var old_ssfi = flag(this, 'ssfi'); |
| 4237 if (old_ssfi && config.includeStack === false) |
| 4238 flag(this, 'ssfi', addProperty); |
| 4239 |
| 4240 var result = getter.call(this); |
| 4241 return result === undefined ? this : result; |
| 4242 } |
| 4243 , configurable: true |
| 4244 }); |
| 4245 }; |
| 4246 |
| 4247 },{"../config":4,"./flag":13}],12:[function(require,module,exports){ |
| 4248 /*! |
| 4249 * Chai - expectTypes utility |
| 4250 * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> |
| 4251 * MIT Licensed |
| 4252 */ |
| 4253 |
| 4254 /** |
| 4255 * ### expectTypes(obj, types) |
| 4256 * |
| 4257 * Ensures that the object being tested against is of a valid type. |
| 4258 * |
| 4259 * utils.expectTypes(this, ['array', 'object', 'string']); |
| 4260 * |
| 4261 * @param {Mixed} obj constructed Assertion |
| 4262 * @param {Array} type A list of allowed types for this assertion |
| 4263 * @namespace Utils |
| 4264 * @name expectTypes |
| 4265 * @api public |
| 4266 */ |
| 4267 |
| 4268 var AssertionError = require('assertion-error'); |
| 4269 var flag = require('./flag'); |
| 4270 var type = require('type-detect'); |
| 4271 |
| 4272 module.exports = function (obj, types) { |
| 4273 var obj = flag(obj, 'object'); |
| 4274 types = types.map(function (t) { return t.toLowerCase(); }); |
| 4275 types.sort(); |
| 4276 |
| 4277 // Transforms ['lorem', 'ipsum'] into 'a lirum, or an ipsum' |
| 4278 var str = types.map(function (t, index) { |
| 4279 var art = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(t.charAt(0)) ? 'an' : 'a'; |
| 4280 var or = types.length > 1 && index === types.length - 1 ? 'or ' : ''; |
| 4281 return or + art + ' ' + t; |
| 4282 }).join(', '); |
| 4283 |
| 4284 if (!types.some(function (expected) { return type(obj) === expected; })) { |
| 4285 throw new AssertionError( |
| 4286 'object tested must be ' + str + ', but ' + type(obj) + ' given' |
| 4287 ); |
| 4288 } |
| 4289 }; |
| 4290 |
| 4291 },{"./flag":13,"assertion-error":30,"type-detect":35}],13:[function(require,modu
le,exports){ |
| 4292 /*! |
| 4293 * Chai - flag utility |
| 4294 * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> |
| 4295 * MIT Licensed |
| 4296 */ |
| 4297 |
| 4298 /** |
| 4299 * ### flag(object, key, [value]) |
| 4300 * |
| 4301 * Get or set a flag value on an object. If a |
| 4302 * value is provided it will be set, else it will |
| 4303 * return the currently set value or `undefined` if |
| 4304 * the value is not set. |
| 4305 * |
| 4306 * utils.flag(this, 'foo', 'bar'); // setter |
| 4307 * utils.flag(this, 'foo'); // getter, returns `bar` |
| 4308 * |
| 4309 * @param {Object} object constructed Assertion |
| 4310 * @param {String} key |
| 4311 * @param {Mixed} value (optional) |
| 4312 * @namespace Utils |
| 4313 * @name flag |
| 4314 * @api private |
| 4315 */ |
| 4316 |
| 4317 module.exports = function (obj, key, value) { |
| 4318 var flags = obj.__flags || (obj.__flags = Object.create(null)); |
| 4319 if (arguments.length === 3) { |
| 4320 flags[key] = value; |
| 4321 } else { |
| 4322 return flags[key]; |
| 4323 } |
| 4324 }; |
| 4325 |
| 4326 },{}],14:[function(require,module,exports){ |
| 4327 /*! |
| 4328 * Chai - getActual utility |
| 4329 * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> |
| 4330 * MIT Licensed |
| 4331 */ |
| 4332 |
| 4333 /** |
| 4334 * # getActual(object, [actual]) |
| 4335 * |
| 4336 * Returns the `actual` value for an Assertion |
| 4337 * |
| 4338 * @param {Object} object (constructed Assertion) |
| 4339 * @param {Arguments} chai.Assertion.prototype.assert arguments |
| 4340 * @namespace Utils |
| 4341 * @name getActual |
| 4342 */ |
| 4343 |
| 4344 module.exports = function (obj, args) { |
| 4345 return args.length > 4 ? args[4] : obj._obj; |
| 4346 }; |
| 4347 |
| 4348 },{}],15:[function(require,module,exports){ |
| 4349 /*! |
| 4350 * Chai - getEnumerableProperties utility |
| 4351 * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> |
| 4352 * MIT Licensed |
| 4353 */ |
| 4354 |
| 4355 /** |
| 4356 * ### .getEnumerableProperties(object) |
| 4357 * |
| 4358 * This allows the retrieval of enumerable property names of an object, |
| 4359 * inherited or not. |
| 4360 * |
| 4361 * @param {Object} object |
| 4362 * @returns {Array} |
| 4363 * @namespace Utils |
| 4364 * @name getEnumerableProperties |
| 4365 * @api public |
| 4366 */ |
| 4367 |
| 4368 module.exports = function getEnumerableProperties(object) { |
| 4369 var result = []; |
| 4370 for (var name in object) { |
| 4371 result.push(name); |
| 4372 } |
| 4373 return result; |
| 4374 }; |
| 4375 |
| 4376 },{}],16:[function(require,module,exports){ |
| 4377 /*! |
| 4378 * Chai - message composition utility |
| 4379 * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> |
| 4380 * MIT Licensed |
| 4381 */ |
| 4382 |
| 4383 /*! |
| 4384 * Module dependancies |
| 4385 */ |
| 4386 |
| 4387 var flag = require('./flag') |
| 4388 , getActual = require('./getActual') |
| 4389 , inspect = require('./inspect') |
| 4390 , objDisplay = require('./objDisplay'); |
| 4391 |
| 4392 /** |
| 4393 * ### .getMessage(object, message, negateMessage) |
| 4394 * |
| 4395 * Construct the error message based on flags |
| 4396 * and template tags. Template tags will return |
| 4397 * a stringified inspection of the object referenced. |
| 4398 * |
| 4399 * Message template tags: |
| 4400 * - `#{this}` current asserted object |
| 4401 * - `#{act}` actual value |
| 4402 * - `#{exp}` expected value |
| 4403 * |
| 4404 * @param {Object} object (constructed Assertion) |
| 4405 * @param {Arguments} chai.Assertion.prototype.assert arguments |
| 4406 * @namespace Utils |
| 4407 * @name getMessage |
| 4408 * @api public |
| 4409 */ |
| 4410 |
| 4411 module.exports = function (obj, args) { |
| 4412 var negate = flag(obj, 'negate') |
| 4413 , val = flag(obj, 'object') |
| 4414 , expected = args[3] |
| 4415 , actual = getActual(obj, args) |
| 4416 , msg = negate ? args[2] : args[1] |
| 4417 , flagMsg = flag(obj, 'message'); |
| 4418 |
| 4419 if(typeof msg === "function") msg = msg(); |
| 4420 msg = msg || ''; |
| 4421 msg = msg |
| 4422 .replace(/#\{this\}/g, function () { return objDisplay(val); }) |
| 4423 .replace(/#\{act\}/g, function () { return objDisplay(actual); }) |
| 4424 .replace(/#\{exp\}/g, function () { return objDisplay(expected); }); |
| 4425 |
| 4426 return flagMsg ? flagMsg + ': ' + msg : msg; |
| 4427 }; |
| 4428 |
| 4429 },{"./flag":13,"./getActual":14,"./inspect":23,"./objDisplay":24}],17:[function(
require,module,exports){ |
| 4430 /*! |
| 4431 * Chai - getName utility |
| 4432 * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> |
| 4433 * MIT Licensed |
| 4434 */ |
| 4435 |
| 4436 /** |
| 4437 * # getName(func) |
| 4438 * |
| 4439 * Gets the name of a function, in a cross-browser way. |
| 4440 * |
| 4441 * @param {Function} a function (usually a constructor) |
| 4442 * @namespace Utils |
| 4443 * @name getName |
| 4444 */ |
| 4445 |
| 4446 module.exports = function (func) { |
| 4447 if (func.name) return func.name; |
| 4448 |
| 4449 var match = /^\s?function ([^(]*)\(/.exec(func); |
| 4450 return match && match[1] ? match[1] : ""; |
| 4451 }; |
| 4452 |
| 4453 },{}],18:[function(require,module,exports){ |
| 4454 /*! |
| 4455 * Chai - getPathInfo utility |
| 4456 * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> |
| 4457 * MIT Licensed |
| 4458 */ |
| 4459 |
| 4460 var hasProperty = require('./hasProperty'); |
| 4461 |
| 4462 /** |
| 4463 * ### .getPathInfo(path, object) |
| 4464 * |
| 4465 * This allows the retrieval of property info in an |
| 4466 * object given a string path. |
| 4467 * |
| 4468 * The path info consists of an object with the |
| 4469 * following properties: |
| 4470 * |
| 4471 * * parent - The parent object of the property referenced by `path` |
| 4472 * * name - The name of the final property, a number if it was an array indexer |
| 4473 * * value - The value of the property, if it exists, otherwise `undefined` |
| 4474 * * exists - Whether the property exists or not |
| 4475 * |
| 4476 * @param {String} path |
| 4477 * @param {Object} object |
| 4478 * @returns {Object} info |
| 4479 * @namespace Utils |
| 4480 * @name getPathInfo |
| 4481 * @api public |
| 4482 */ |
| 4483 |
| 4484 module.exports = function getPathInfo(path, obj) { |
| 4485 var parsed = parsePath(path), |
| 4486 last = parsed[parsed.length - 1]; |
| 4487 |
| 4488 var info = { |
| 4489 parent: parsed.length > 1 ? _getPathValue(parsed, obj, parsed.length - 1) :
obj, |
| 4490 name: last.p || last.i, |
| 4491 value: _getPathValue(parsed, obj) |
| 4492 }; |
| 4493 info.exists = hasProperty(info.name, info.parent); |
| 4494 |
| 4495 return info; |
| 4496 }; |
| 4497 |
| 4498 |
| 4499 /*! |
| 4500 * ## parsePath(path) |
| 4501 * |
| 4502 * Helper function used to parse string object |
| 4503 * paths. Use in conjunction with `_getPathValue`. |
| 4504 * |
| 4505 * var parsed = parsePath('myobject.property.subprop'); |
| 4506 * |
| 4507 * ### Paths: |
| 4508 * |
| 4509 * * Can be as near infinitely deep and nested |
| 4510 * * Arrays are also valid using the formal `myobject.document[3].property`. |
| 4511 * * Literal dots and brackets (not delimiter) must be backslash-escaped. |
| 4512 * |
| 4513 * @param {String} path |
| 4514 * @returns {Object} parsed |
| 4515 * @api private |
| 4516 */ |
| 4517 |
| 4518 function parsePath (path) { |
| 4519 var str = path.replace(/([^\\])\[/g, '$1.[') |
| 4520 , parts = str.match(/(\\\.|[^.]+?)+/g); |
| 4521 return parts.map(function (value) { |
| 4522 var re = /^\[(\d+)\]$/ |
| 4523 , mArr = re.exec(value); |
| 4524 if (mArr) return { i: parseFloat(mArr[1]) }; |
| 4525 else return { p: value.replace(/\\([.\[\]])/g, '$1') }; |
| 4526 }); |
| 4527 } |
| 4528 |
| 4529 |
| 4530 /*! |
| 4531 * ## _getPathValue(parsed, obj) |
| 4532 * |
| 4533 * Helper companion function for `.parsePath` that returns |
| 4534 * the value located at the parsed address. |
| 4535 * |
| 4536 * var value = getPathValue(parsed, obj); |
| 4537 * |
| 4538 * @param {Object} parsed definition from `parsePath`. |
| 4539 * @param {Object} object to search against |
| 4540 * @param {Number} object to search against |
| 4541 * @returns {Object|Undefined} value |
| 4542 * @api private |
| 4543 */ |
| 4544 |
| 4545 function _getPathValue (parsed, obj, index) { |
| 4546 var tmp = obj |
| 4547 , res; |
| 4548 |
| 4549 index = (index === undefined ? parsed.length : index); |
| 4550 |
| 4551 for (var i = 0, l = index; i < l; i++) { |
| 4552 var part = parsed[i]; |
| 4553 if (tmp) { |
| 4554 if ('undefined' !== typeof part.p) |
| 4555 tmp = tmp[part.p]; |
| 4556 else if ('undefined' !== typeof part.i) |
| 4557 tmp = tmp[part.i]; |
| 4558 if (i == (l - 1)) res = tmp; |
| 4559 } else { |
| 4560 res = undefined; |
| 4561 } |
| 4562 } |
| 4563 return res; |
| 4564 } |
| 4565 |
| 4566 },{"./hasProperty":21}],19:[function(require,module,exports){ |
| 4567 /*! |
| 4568 * Chai - getPathValue utility |
| 4569 * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> |
| 4570 * @see https://github.com/logicalparadox/filtr |
| 4571 * MIT Licensed |
| 4572 */ |
| 4573 |
| 4574 var getPathInfo = require('./getPathInfo'); |
| 4575 |
| 4576 /** |
| 4577 * ### .getPathValue(path, object) |
| 4578 * |
| 4579 * This allows the retrieval of values in an |
| 4580 * object given a string path. |
| 4581 * |
| 4582 * var obj = { |
| 4583 * prop1: { |
| 4584 * arr: ['a', 'b', 'c'] |
| 4585 * , str: 'Hello' |
| 4586 * } |
| 4587 * , prop2: { |
| 4588 * arr: [ { nested: 'Universe' } ] |
| 4589 * , str: 'Hello again!' |
| 4590 * } |
| 4591 * } |
| 4592 * |
| 4593 * The following would be the results. |
| 4594 * |
| 4595 * getPathValue('prop1.str', obj); // Hello |
| 4596 * getPathValue('prop1.att[2]', obj); // b |
| 4597 * getPathValue('prop2.arr[0].nested', obj); // Universe |
| 4598 * |
| 4599 * @param {String} path |
| 4600 * @param {Object} object |
| 4601 * @returns {Object} value or `undefined` |
| 4602 * @namespace Utils |
| 4603 * @name getPathValue |
| 4604 * @api public |
| 4605 */ |
| 4606 module.exports = function(path, obj) { |
| 4607 var info = getPathInfo(path, obj); |
| 4608 return info.value; |
| 4609 }; |
| 4610 |
| 4611 },{"./getPathInfo":18}],20:[function(require,module,exports){ |
| 4612 /*! |
| 4613 * Chai - getProperties utility |
| 4614 * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> |
| 4615 * MIT Licensed |
| 4616 */ |
| 4617 |
| 4618 /** |
| 4619 * ### .getProperties(object) |
| 4620 * |
| 4621 * This allows the retrieval of property names of an object, enumerable or not, |
| 4622 * inherited or not. |
| 4623 * |
| 4624 * @param {Object} object |
| 4625 * @returns {Array} |
| 4626 * @namespace Utils |
| 4627 * @name getProperties |
| 4628 * @api public |
| 4629 */ |
| 4630 |
| 4631 module.exports = function getProperties(object) { |
| 4632 var result = Object.getOwnPropertyNames(object); |
| 4633 |
| 4634 function addProperty(property) { |
| 4635 if (result.indexOf(property) === -1) { |
| 4636 result.push(property); |
| 4637 } |
| 4638 } |
| 4639 |
| 4640 var proto = Object.getPrototypeOf(object); |
| 4641 while (proto !== null) { |
| 4642 Object.getOwnPropertyNames(proto).forEach(addProperty); |
| 4643 proto = Object.getPrototypeOf(proto); |
| 4644 } |
| 4645 |
| 4646 return result; |
| 4647 }; |
| 4648 |
| 4649 },{}],21:[function(require,module,exports){ |
| 4650 /*! |
| 4651 * Chai - hasProperty utility |
| 4652 * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> |
| 4653 * MIT Licensed |
| 4654 */ |
| 4655 |
| 4656 var type = require('type-detect'); |
| 4657 |
| 4658 /** |
| 4659 * ### .hasProperty(object, name) |
| 4660 * |
| 4661 * This allows checking whether an object has |
| 4662 * named property or numeric array index. |
| 4663 * |
| 4664 * Basically does the same thing as the `in` |
| 4665 * operator but works properly with natives |
| 4666 * and null/undefined values. |
| 4667 * |
| 4668 * var obj = { |
| 4669 * arr: ['a', 'b', 'c'] |
| 4670 * , str: 'Hello' |
| 4671 * } |
| 4672 * |
| 4673 * The following would be the results. |
| 4674 * |
| 4675 * hasProperty('str', obj); // true |
| 4676 * hasProperty('constructor', obj); // true |
| 4677 * hasProperty('bar', obj); // false |
| 4678 * |
| 4679 * hasProperty('length', obj.str); // true |
| 4680 * hasProperty(1, obj.str); // true |
| 4681 * hasProperty(5, obj.str); // false |
| 4682 * |
| 4683 * hasProperty('length', obj.arr); // true |
| 4684 * hasProperty(2, obj.arr); // true |
| 4685 * hasProperty(3, obj.arr); // false |
| 4686 * |
| 4687 * @param {Objuect} object |
| 4688 * @param {String|Number} name |
| 4689 * @returns {Boolean} whether it exists |
| 4690 * @namespace Utils |
| 4691 * @name getPathInfo |
| 4692 * @api public |
| 4693 */ |
| 4694 |
| 4695 var literals = { |
| 4696 'number': Number |
| 4697 , 'string': String |
| 4698 }; |
| 4699 |
| 4700 module.exports = function hasProperty(name, obj) { |
| 4701 var ot = type(obj); |
| 4702 |
| 4703 // Bad Object, obviously no props at all |
| 4704 if(ot === 'null' || ot === 'undefined') |
| 4705 return false; |
| 4706 |
| 4707 // The `in` operator does not work with certain literals |
| 4708 // box these before the check |
| 4709 if(literals[ot] && typeof obj !== 'object') |
| 4710 obj = new literals[ot](obj); |
| 4711 |
| 4712 return name in obj; |
| 4713 }; |
| 4714 |
| 4715 },{"type-detect":35}],22:[function(require,module,exports){ |
| 4716 /*! |
| 4717 * chai |
| 4718 * Copyright(c) 2011 Jake Luer <jake@alogicalparadox.com> |
| 4719 * MIT Licensed |
| 4720 */ |
| 4721 |
| 4722 /*! |
| 4723 * Main exports |
| 4724 */ |
| 4725 |
| 4726 var exports = module.exports = {}; |
| 4727 |
| 4728 /*! |
| 4729 * test utility |
| 4730 */ |
| 4731 |
| 4732 exports.test = require('./test'); |
| 4733 |
| 4734 /*! |
| 4735 * type utility |
| 4736 */ |
| 4737 |
| 4738 exports.type = require('type-detect'); |
| 4739 |
| 4740 /*! |
| 4741 * expectTypes utility |
| 4742 */ |
| 4743 exports.expectTypes = require('./expectTypes'); |
| 4744 |
| 4745 /*! |
| 4746 * message utility |
| 4747 */ |
| 4748 |
| 4749 exports.getMessage = require('./getMessage'); |
| 4750 |
| 4751 /*! |
| 4752 * actual utility |
| 4753 */ |
| 4754 |
| 4755 exports.getActual = require('./getActual'); |
| 4756 |
| 4757 /*! |
| 4758 * Inspect util |
| 4759 */ |
| 4760 |
| 4761 exports.inspect = require('./inspect'); |
| 4762 |
| 4763 /*! |
| 4764 * Object Display util |
| 4765 */ |
| 4766 |
| 4767 exports.objDisplay = require('./objDisplay'); |
| 4768 |
| 4769 /*! |
| 4770 * Flag utility |
| 4771 */ |
| 4772 |
| 4773 exports.flag = require('./flag'); |
| 4774 |
| 4775 /*! |
| 4776 * Flag transferring utility |
| 4777 */ |
| 4778 |
| 4779 exports.transferFlags = require('./transferFlags'); |
| 4780 |
| 4781 /*! |
| 4782 * Deep equal utility |
| 4783 */ |
| 4784 |
| 4785 exports.eql = require('deep-eql'); |
| 4786 |
| 4787 /*! |
| 4788 * Deep path value |
| 4789 */ |
| 4790 |
| 4791 exports.getPathValue = require('./getPathValue'); |
| 4792 |
| 4793 /*! |
| 4794 * Deep path info |
| 4795 */ |
| 4796 |
| 4797 exports.getPathInfo = require('./getPathInfo'); |
| 4798 |
| 4799 /*! |
| 4800 * Check if a property exists |
| 4801 */ |
| 4802 |
| 4803 exports.hasProperty = require('./hasProperty'); |
| 4804 |
| 4805 /*! |
| 4806 * Function name |
| 4807 */ |
| 4808 |
| 4809 exports.getName = require('./getName'); |
| 4810 |
| 4811 /*! |
| 4812 * add Property |
| 4813 */ |
| 4814 |
| 4815 exports.addProperty = require('./addProperty'); |
| 4816 |
| 4817 /*! |
| 4818 * add Method |
| 4819 */ |
| 4820 |
| 4821 exports.addMethod = require('./addMethod'); |
| 4822 |
| 4823 /*! |
| 4824 * overwrite Property |
| 4825 */ |
| 4826 |
| 4827 exports.overwriteProperty = require('./overwriteProperty'); |
| 4828 |
| 4829 /*! |
| 4830 * overwrite Method |
| 4831 */ |
| 4832 |
| 4833 exports.overwriteMethod = require('./overwriteMethod'); |
| 4834 |
| 4835 /*! |
| 4836 * Add a chainable method |
| 4837 */ |
| 4838 |
| 4839 exports.addChainableMethod = require('./addChainableMethod'); |
| 4840 |
| 4841 /*! |
| 4842 * Overwrite chainable method |
| 4843 */ |
| 4844 |
| 4845 exports.overwriteChainableMethod = require('./overwriteChainableMethod'); |
| 4846 |
| 4847 },{"./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,"./o
verwriteChainableMethod":25,"./overwriteMethod":26,"./overwriteProperty":27,"./t
est":28,"./transferFlags":29,"deep-eql":31,"type-detect":35}],23:[function(requi
re,module,exports){ |
| 4848 // This is (almost) directly from Node.js utils |
| 4849 // https://github.com/joyent/node/blob/f8c335d0caf47f16d31413f89aa28eda3878e3aa/
lib/util.js |
| 4850 |
| 4851 var getName = require('./getName'); |
| 4852 var getProperties = require('./getProperties'); |
| 4853 var getEnumerableProperties = require('./getEnumerableProperties'); |
| 4854 |
| 4855 module.exports = inspect; |
| 4856 |
| 4857 /** |
| 4858 * Echos the value of a value. Trys to print the value out |
| 4859 * in the best way possible given the different types. |
| 4860 * |
| 4861 * @param {Object} obj The object to print out. |
| 4862 * @param {Boolean} showHidden Flag that shows hidden (not enumerable) |
| 4863 * properties of objects. |
| 4864 * @param {Number} depth Depth in which to descend in object. Default is 2. |
| 4865 * @param {Boolean} colors Flag to turn on ANSI escape codes to color the |
| 4866 * output. Default is false (no coloring). |
| 4867 * @namespace Utils |
| 4868 * @name inspect |
| 4869 */ |
| 4870 function inspect(obj, showHidden, depth, colors) { |
| 4871 var ctx = { |
| 4872 showHidden: showHidden, |
| 4873 seen: [], |
| 4874 stylize: function (str) { return str; } |
| 4875 }; |
| 4876 return formatValue(ctx, obj, (typeof depth === 'undefined' ? 2 : depth)); |
| 4877 } |
| 4878 |
| 4879 // Returns true if object is a DOM element. |
| 4880 var isDOMElement = function (object) { |
| 4881 if (typeof HTMLElement === 'object') { |
| 4882 return object instanceof HTMLElement; |
| 4883 } else { |
| 4884 return object && |
| 4885 typeof object === 'object' && |
| 4886 object.nodeType === 1 && |
| 4887 typeof object.nodeName === 'string'; |
| 4888 } |
| 4889 }; |
| 4890 |
| 4891 function formatValue(ctx, value, recurseTimes) { |
| 4892 // Provide a hook for user-specified inspect functions. |
| 4893 // Check that value is an object with an inspect function on it |
| 4894 if (value && typeof value.inspect === 'function' && |
| 4895 // Filter out the util module, it's inspect function is special |
| 4896 value.inspect !== exports.inspect && |
| 4897 // Also filter out any prototype objects using the circular check. |
| 4898 !(value.constructor && value.constructor.prototype === value)) { |
| 4899 var ret = value.inspect(recurseTimes); |
| 4900 if (typeof ret !== 'string') { |
| 4901 ret = formatValue(ctx, ret, recurseTimes); |
| 4902 } |
| 4903 return ret; |
| 4904 } |
| 4905 |
| 4906 // Primitive types cannot have properties |
| 4907 var primitive = formatPrimitive(ctx, value); |
| 4908 if (primitive) { |
| 4909 return primitive; |
| 4910 } |
| 4911 |
| 4912 // If this is a DOM element, try to get the outer HTML. |
| 4913 if (isDOMElement(value)) { |
| 4914 if ('outerHTML' in value) { |
| 4915 return value.outerHTML; |
| 4916 // This value does not have an outerHTML attribute, |
| 4917 // it could still be an XML element |
| 4918 } else { |
| 4919 // Attempt to serialize it |
| 4920 try { |
| 4921 if (document.xmlVersion) { |
| 4922 var xmlSerializer = new XMLSerializer(); |
| 4923 return xmlSerializer.serializeToString(value); |
| 4924 } else { |
| 4925 // Firefox 11- do not support outerHTML |
| 4926 // It does, however, support innerHTML |
| 4927 // Use the following to render the element |
| 4928 var ns = "http://www.w3.org/1999/xhtml"; |
| 4929 var container = document.createElementNS(ns, '_'); |
| 4930 |
| 4931 container.appendChild(value.cloneNode(false)); |
| 4932 html = container.innerHTML |
| 4933 .replace('><', '>' + value.innerHTML + '<'); |
| 4934 container.innerHTML = ''; |
| 4935 return html; |
| 4936 } |
| 4937 } catch (err) { |
| 4938 // This could be a non-native DOM implementation, |
| 4939 // continue with the normal flow: |
| 4940 // printing the element as if it is an object. |
| 4941 } |
| 4942 } |
| 4943 } |
| 4944 |
| 4945 // Look up the keys of the object. |
| 4946 var visibleKeys = getEnumerableProperties(value); |
| 4947 var keys = ctx.showHidden ? getProperties(value) : visibleKeys; |
| 4948 |
| 4949 // Some type of object without properties can be shortcutted. |
| 4950 // In IE, errors have a single `stack` property, or if they are vanilla `Error
`, |
| 4951 // a `stack` plus `description` property; ignore those for consistency. |
| 4952 if (keys.length === 0 || (isError(value) && ( |
| 4953 (keys.length === 1 && keys[0] === 'stack') || |
| 4954 (keys.length === 2 && keys[0] === 'description' && keys[1] === 'stack') |
| 4955 ))) { |
| 4956 if (typeof value === 'function') { |
| 4957 var name = getName(value); |
| 4958 var nameSuffix = name ? ': ' + name : ''; |
| 4959 return ctx.stylize('[Function' + nameSuffix + ']', 'special'); |
| 4960 } |
| 4961 if (isRegExp(value)) { |
| 4962 return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); |
| 4963 } |
| 4964 if (isDate(value)) { |
| 4965 return ctx.stylize(Date.prototype.toUTCString.call(value), 'date'); |
| 4966 } |
| 4967 if (isError(value)) { |
| 4968 return formatError(value); |
| 4969 } |
| 4970 } |
| 4971 |
| 4972 var base = '', array = false, braces = ['{', '}']; |
| 4973 |
| 4974 // Make Array say that they are Array |
| 4975 if (isArray(value)) { |
| 4976 array = true; |
| 4977 braces = ['[', ']']; |
| 4978 } |
| 4979 |
| 4980 // Make functions say that they are functions |
| 4981 if (typeof value === 'function') { |
| 4982 var name = getName(value); |
| 4983 var nameSuffix = name ? ': ' + name : ''; |
| 4984 base = ' [Function' + nameSuffix + ']'; |
| 4985 } |
| 4986 |
| 4987 // Make RegExps say that they are RegExps |
| 4988 if (isRegExp(value)) { |
| 4989 base = ' ' + RegExp.prototype.toString.call(value); |
| 4990 } |
| 4991 |
| 4992 // Make dates with properties first say the date |
| 4993 if (isDate(value)) { |
| 4994 base = ' ' + Date.prototype.toUTCString.call(value); |
| 4995 } |
| 4996 |
| 4997 // Make error with message first say the error |
| 4998 if (isError(value)) { |
| 4999 return formatError(value); |
| 5000 } |
| 5001 |
| 5002 if (keys.length === 0 && (!array || value.length == 0)) { |
| 5003 return braces[0] + base + braces[1]; |
| 5004 } |
| 5005 |
| 5006 if (recurseTimes < 0) { |
| 5007 if (isRegExp(value)) { |
| 5008 return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); |
| 5009 } else { |
| 5010 return ctx.stylize('[Object]', 'special'); |
| 5011 } |
| 5012 } |
| 5013 |
| 5014 ctx.seen.push(value); |
| 5015 |
| 5016 var output; |
| 5017 if (array) { |
| 5018 output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); |
| 5019 } else { |
| 5020 output = keys.map(function(key) { |
| 5021 return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); |
| 5022 }); |
| 5023 } |
| 5024 |
| 5025 ctx.seen.pop(); |
| 5026 |
| 5027 return reduceToSingleString(output, base, braces); |
| 5028 } |
| 5029 |
| 5030 |
| 5031 function formatPrimitive(ctx, value) { |
| 5032 switch (typeof value) { |
| 5033 case 'undefined': |
| 5034 return ctx.stylize('undefined', 'undefined'); |
| 5035 |
| 5036 case 'string': |
| 5037 var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') |
| 5038 .replace(/'/g, "\\'") |
| 5039 .replace(/\\"/g, '"') + '\''; |
| 5040 return ctx.stylize(simple, 'string'); |
| 5041 |
| 5042 case 'number': |
| 5043 if (value === 0 && (1/value) === -Infinity) { |
| 5044 return ctx.stylize('-0', 'number'); |
| 5045 } |
| 5046 return ctx.stylize('' + value, 'number'); |
| 5047 |
| 5048 case 'boolean': |
| 5049 return ctx.stylize('' + value, 'boolean'); |
| 5050 } |
| 5051 // For some reason typeof null is "object", so special case here. |
| 5052 if (value === null) { |
| 5053 return ctx.stylize('null', 'null'); |
| 5054 } |
| 5055 } |
| 5056 |
| 5057 |
| 5058 function formatError(value) { |
| 5059 return '[' + Error.prototype.toString.call(value) + ']'; |
| 5060 } |
| 5061 |
| 5062 |
| 5063 function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { |
| 5064 var output = []; |
| 5065 for (var i = 0, l = value.length; i < l; ++i) { |
| 5066 if (Object.prototype.hasOwnProperty.call(value, String(i))) { |
| 5067 output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, |
| 5068 String(i), true)); |
| 5069 } else { |
| 5070 output.push(''); |
| 5071 } |
| 5072 } |
| 5073 keys.forEach(function(key) { |
| 5074 if (!key.match(/^\d+$/)) { |
| 5075 output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, |
| 5076 key, true)); |
| 5077 } |
| 5078 }); |
| 5079 return output; |
| 5080 } |
| 5081 |
| 5082 |
| 5083 function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { |
| 5084 var name, str; |
| 5085 if (value.__lookupGetter__) { |
| 5086 if (value.__lookupGetter__(key)) { |
| 5087 if (value.__lookupSetter__(key)) { |
| 5088 str = ctx.stylize('[Getter/Setter]', 'special'); |
| 5089 } else { |
| 5090 str = ctx.stylize('[Getter]', 'special'); |
| 5091 } |
| 5092 } else { |
| 5093 if (value.__lookupSetter__(key)) { |
| 5094 str = ctx.stylize('[Setter]', 'special'); |
| 5095 } |
| 5096 } |
| 5097 } |
| 5098 if (visibleKeys.indexOf(key) < 0) { |
| 5099 name = '[' + key + ']'; |
| 5100 } |
| 5101 if (!str) { |
| 5102 if (ctx.seen.indexOf(value[key]) < 0) { |
| 5103 if (recurseTimes === null) { |
| 5104 str = formatValue(ctx, value[key], null); |
| 5105 } else { |
| 5106 str = formatValue(ctx, value[key], recurseTimes - 1); |
| 5107 } |
| 5108 if (str.indexOf('\n') > -1) { |
| 5109 if (array) { |
| 5110 str = str.split('\n').map(function(line) { |
| 5111 return ' ' + line; |
| 5112 }).join('\n').substr(2); |
| 5113 } else { |
| 5114 str = '\n' + str.split('\n').map(function(line) { |
| 5115 return ' ' + line; |
| 5116 }).join('\n'); |
| 5117 } |
| 5118 } |
| 5119 } else { |
| 5120 str = ctx.stylize('[Circular]', 'special'); |
| 5121 } |
| 5122 } |
| 5123 if (typeof name === 'undefined') { |
| 5124 if (array && key.match(/^\d+$/)) { |
| 5125 return str; |
| 5126 } |
| 5127 name = JSON.stringify('' + key); |
| 5128 if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { |
| 5129 name = name.substr(1, name.length - 2); |
| 5130 name = ctx.stylize(name, 'name'); |
| 5131 } else { |
| 5132 name = name.replace(/'/g, "\\'") |
| 5133 .replace(/\\"/g, '"') |
| 5134 .replace(/(^"|"$)/g, "'"); |
| 5135 name = ctx.stylize(name, 'string'); |
| 5136 } |
| 5137 } |
| 5138 |
| 5139 return name + ': ' + str; |
| 5140 } |
| 5141 |
| 5142 |
| 5143 function reduceToSingleString(output, base, braces) { |
| 5144 var numLinesEst = 0; |
| 5145 var length = output.reduce(function(prev, cur) { |
| 5146 numLinesEst++; |
| 5147 if (cur.indexOf('\n') >= 0) numLinesEst++; |
| 5148 return prev + cur.length + 1; |
| 5149 }, 0); |
| 5150 |
| 5151 if (length > 60) { |
| 5152 return braces[0] + |
| 5153 (base === '' ? '' : base + '\n ') + |
| 5154 ' ' + |
| 5155 output.join(',\n ') + |
| 5156 ' ' + |
| 5157 braces[1]; |
| 5158 } |
| 5159 |
| 5160 return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; |
| 5161 } |
| 5162 |
| 5163 function isArray(ar) { |
| 5164 return Array.isArray(ar) || |
| 5165 (typeof ar === 'object' && objectToString(ar) === '[object Array]'); |
| 5166 } |
| 5167 |
| 5168 function isRegExp(re) { |
| 5169 return typeof re === 'object' && objectToString(re) === '[object RegExp]'; |
| 5170 } |
| 5171 |
| 5172 function isDate(d) { |
| 5173 return typeof d === 'object' && objectToString(d) === '[object Date]'; |
| 5174 } |
| 5175 |
| 5176 function isError(e) { |
| 5177 return typeof e === 'object' && objectToString(e) === '[object Error]'; |
| 5178 } |
| 5179 |
| 5180 function objectToString(o) { |
| 5181 return Object.prototype.toString.call(o); |
| 5182 } |
| 5183 |
| 5184 },{"./getEnumerableProperties":15,"./getName":17,"./getProperties":20}],24:[func
tion(require,module,exports){ |
| 5185 /*! |
| 5186 * Chai - flag utility |
| 5187 * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> |
| 5188 * MIT Licensed |
| 5189 */ |
| 5190 |
| 5191 /*! |
| 5192 * Module dependancies |
| 5193 */ |
| 5194 |
| 5195 var inspect = require('./inspect'); |
| 5196 var config = require('../config'); |
| 5197 |
| 5198 /** |
| 5199 * ### .objDisplay (object) |
| 5200 * |
| 5201 * Determines if an object or an array matches |
| 5202 * criteria to be inspected in-line for error |
| 5203 * messages or should be truncated. |
| 5204 * |
| 5205 * @param {Mixed} javascript object to inspect |
| 5206 * @name objDisplay |
| 5207 * @namespace Utils |
| 5208 * @api public |
| 5209 */ |
| 5210 |
| 5211 module.exports = function (obj) { |
| 5212 var str = inspect(obj) |
| 5213 , type = Object.prototype.toString.call(obj); |
| 5214 |
| 5215 if (config.truncateThreshold && str.length >= config.truncateThreshold) { |
| 5216 if (type === '[object Function]') { |
| 5217 return !obj.name || obj.name === '' |
| 5218 ? '[Function]' |
| 5219 : '[Function: ' + obj.name + ']'; |
| 5220 } else if (type === '[object Array]') { |
| 5221 return '[ Array(' + obj.length + ') ]'; |
| 5222 } else if (type === '[object Object]') { |
| 5223 var keys = Object.keys(obj) |
| 5224 , kstr = keys.length > 2 |
| 5225 ? keys.splice(0, 2).join(', ') + ', ...' |
| 5226 : keys.join(', '); |
| 5227 return '{ Object (' + kstr + ') }'; |
| 5228 } else { |
| 5229 return str; |
| 5230 } |
| 5231 } else { |
| 5232 return str; |
| 5233 } |
| 5234 }; |
| 5235 |
| 5236 },{"../config":4,"./inspect":23}],25:[function(require,module,exports){ |
| 5237 /*! |
| 5238 * Chai - overwriteChainableMethod utility |
| 5239 * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> |
| 5240 * MIT Licensed |
| 5241 */ |
| 5242 |
| 5243 /** |
| 5244 * ### overwriteChainableMethod (ctx, name, method, chainingBehavior) |
| 5245 * |
| 5246 * Overwites an already existing chainable method |
| 5247 * and provides access to the previous function or |
| 5248 * property. Must return functions to be used for |
| 5249 * name. |
| 5250 * |
| 5251 * utils.overwriteChainableMethod(chai.Assertion.prototype, 'length', |
| 5252 * function (_super) { |
| 5253 * } |
| 5254 * , function (_super) { |
| 5255 * } |
| 5256 * ); |
| 5257 * |
| 5258 * Can also be accessed directly from `chai.Assertion`. |
| 5259 * |
| 5260 * chai.Assertion.overwriteChainableMethod('foo', fn, fn); |
| 5261 * |
| 5262 * Then can be used as any other assertion. |
| 5263 * |
| 5264 * expect(myFoo).to.have.length(3); |
| 5265 * expect(myFoo).to.have.length.above(3); |
| 5266 * |
| 5267 * @param {Object} ctx object whose method / property is to be overwritten |
| 5268 * @param {String} name of method / property to overwrite |
| 5269 * @param {Function} method function that returns a function to be used for name |
| 5270 * @param {Function} chainingBehavior function that returns a function to be use
d for property |
| 5271 * @namespace Utils |
| 5272 * @name overwriteChainableMethod |
| 5273 * @api public |
| 5274 */ |
| 5275 |
| 5276 module.exports = function (ctx, name, method, chainingBehavior) { |
| 5277 var chainableBehavior = ctx.__methods[name]; |
| 5278 |
| 5279 var _chainingBehavior = chainableBehavior.chainingBehavior; |
| 5280 chainableBehavior.chainingBehavior = function () { |
| 5281 var result = chainingBehavior(_chainingBehavior).call(this); |
| 5282 return result === undefined ? this : result; |
| 5283 }; |
| 5284 |
| 5285 var _method = chainableBehavior.method; |
| 5286 chainableBehavior.method = function () { |
| 5287 var result = method(_method).apply(this, arguments); |
| 5288 return result === undefined ? this : result; |
| 5289 }; |
| 5290 }; |
| 5291 |
| 5292 },{}],26:[function(require,module,exports){ |
| 5293 /*! |
| 5294 * Chai - overwriteMethod utility |
| 5295 * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> |
| 5296 * MIT Licensed |
| 5297 */ |
| 5298 |
| 5299 /** |
| 5300 * ### overwriteMethod (ctx, name, fn) |
| 5301 * |
| 5302 * Overwites an already existing method and provides |
| 5303 * access to previous function. Must return function |
| 5304 * to be used for name. |
| 5305 * |
| 5306 * utils.overwriteMethod(chai.Assertion.prototype, 'equal', function (_super
) { |
| 5307 * return function (str) { |
| 5308 * var obj = utils.flag(this, 'object'); |
| 5309 * if (obj instanceof Foo) { |
| 5310 * new chai.Assertion(obj.value).to.equal(str); |
| 5311 * } else { |
| 5312 * _super.apply(this, arguments); |
| 5313 * } |
| 5314 * } |
| 5315 * }); |
| 5316 * |
| 5317 * Can also be accessed directly from `chai.Assertion`. |
| 5318 * |
| 5319 * chai.Assertion.overwriteMethod('foo', fn); |
| 5320 * |
| 5321 * Then can be used as any other assertion. |
| 5322 * |
| 5323 * expect(myFoo).to.equal('bar'); |
| 5324 * |
| 5325 * @param {Object} ctx object whose method is to be overwritten |
| 5326 * @param {String} name of method to overwrite |
| 5327 * @param {Function} method function that returns a function to be used for name |
| 5328 * @namespace Utils |
| 5329 * @name overwriteMethod |
| 5330 * @api public |
| 5331 */ |
| 5332 |
| 5333 module.exports = function (ctx, name, method) { |
| 5334 var _method = ctx[name] |
| 5335 , _super = function () { return this; }; |
| 5336 |
| 5337 if (_method && 'function' === typeof _method) |
| 5338 _super = _method; |
| 5339 |
| 5340 ctx[name] = function () { |
| 5341 var result = method(_super).apply(this, arguments); |
| 5342 return result === undefined ? this : result; |
| 5343 } |
| 5344 }; |
| 5345 |
| 5346 },{}],27:[function(require,module,exports){ |
| 5347 /*! |
| 5348 * Chai - overwriteProperty utility |
| 5349 * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> |
| 5350 * MIT Licensed |
| 5351 */ |
| 5352 |
| 5353 /** |
| 5354 * ### overwriteProperty (ctx, name, fn) |
| 5355 * |
| 5356 * Overwites an already existing property getter and provides |
| 5357 * access to previous value. Must return function to use as getter. |
| 5358 * |
| 5359 * utils.overwriteProperty(chai.Assertion.prototype, 'ok', function (_super)
{ |
| 5360 * return function () { |
| 5361 * var obj = utils.flag(this, 'object'); |
| 5362 * if (obj instanceof Foo) { |
| 5363 * new chai.Assertion(obj.name).to.equal('bar'); |
| 5364 * } else { |
| 5365 * _super.call(this); |
| 5366 * } |
| 5367 * } |
| 5368 * }); |
| 5369 * |
| 5370 * |
| 5371 * Can also be accessed directly from `chai.Assertion`. |
| 5372 * |
| 5373 * chai.Assertion.overwriteProperty('foo', fn); |
| 5374 * |
| 5375 * Then can be used as any other assertion. |
| 5376 * |
| 5377 * expect(myFoo).to.be.ok; |
| 5378 * |
| 5379 * @param {Object} ctx object whose property is to be overwritten |
| 5380 * @param {String} name of property to overwrite |
| 5381 * @param {Function} getter function that returns a getter function to be used f
or name |
| 5382 * @namespace Utils |
| 5383 * @name overwriteProperty |
| 5384 * @api public |
| 5385 */ |
| 5386 |
| 5387 module.exports = function (ctx, name, getter) { |
| 5388 var _get = Object.getOwnPropertyDescriptor(ctx, name) |
| 5389 , _super = function () {}; |
| 5390 |
| 5391 if (_get && 'function' === typeof _get.get) |
| 5392 _super = _get.get |
| 5393 |
| 5394 Object.defineProperty(ctx, name, |
| 5395 { get: function () { |
| 5396 var result = getter(_super).call(this); |
| 5397 return result === undefined ? this : result; |
| 5398 } |
| 5399 , configurable: true |
| 5400 }); |
| 5401 }; |
| 5402 |
| 5403 },{}],28:[function(require,module,exports){ |
| 5404 /*! |
| 5405 * Chai - test utility |
| 5406 * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> |
| 5407 * MIT Licensed |
| 5408 */ |
| 5409 |
| 5410 /*! |
| 5411 * Module dependancies |
| 5412 */ |
| 5413 |
| 5414 var flag = require('./flag'); |
| 5415 |
| 5416 /** |
| 5417 * # test(object, expression) |
| 5418 * |
| 5419 * Test and object for expression. |
| 5420 * |
| 5421 * @param {Object} object (constructed Assertion) |
| 5422 * @param {Arguments} chai.Assertion.prototype.assert arguments |
| 5423 * @namespace Utils |
| 5424 * @name test |
| 5425 */ |
| 5426 |
| 5427 module.exports = function (obj, args) { |
| 5428 var negate = flag(obj, 'negate') |
| 5429 , expr = args[0]; |
| 5430 return negate ? !expr : expr; |
| 5431 }; |
| 5432 |
| 5433 },{"./flag":13}],29:[function(require,module,exports){ |
| 5434 /*! |
| 5435 * Chai - transferFlags utility |
| 5436 * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com> |
| 5437 * MIT Licensed |
| 5438 */ |
| 5439 |
| 5440 /** |
| 5441 * ### transferFlags(assertion, object, includeAll = true) |
| 5442 * |
| 5443 * Transfer all the flags for `assertion` to `object`. If |
| 5444 * `includeAll` is set to `false`, then the base Chai |
| 5445 * assertion flags (namely `object`, `ssfi`, and `message`) |
| 5446 * will not be transferred. |
| 5447 * |
| 5448 * |
| 5449 * var newAssertion = new Assertion(); |
| 5450 * utils.transferFlags(assertion, newAssertion); |
| 5451 * |
| 5452 * var anotherAsseriton = new Assertion(myObj); |
| 5453 * utils.transferFlags(assertion, anotherAssertion, false); |
| 5454 * |
| 5455 * @param {Assertion} assertion the assertion to transfer the flags from |
| 5456 * @param {Object} object the object to transfer the flags to; usually a new ass
ertion |
| 5457 * @param {Boolean} includeAll |
| 5458 * @namespace Utils |
| 5459 * @name transferFlags |
| 5460 * @api private |
| 5461 */ |
| 5462 |
| 5463 module.exports = function (assertion, object, includeAll) { |
| 5464 var flags = assertion.__flags || (assertion.__flags = Object.create(null)); |
| 5465 |
| 5466 if (!object.__flags) { |
| 5467 object.__flags = Object.create(null); |
| 5468 } |
| 5469 |
| 5470 includeAll = arguments.length === 3 ? includeAll : true; |
| 5471 |
| 5472 for (var flag in flags) { |
| 5473 if (includeAll || |
| 5474 (flag !== 'object' && flag !== 'ssfi' && flag != 'message')) { |
| 5475 object.__flags[flag] = flags[flag]; |
| 5476 } |
| 5477 } |
| 5478 }; |
| 5479 |
| 5480 },{}],30:[function(require,module,exports){ |
| 5481 /*! |
| 5482 * assertion-error |
| 5483 * Copyright(c) 2013 Jake Luer <jake@qualiancy.com> |
| 5484 * MIT Licensed |
| 5485 */ |
| 5486 |
| 5487 /*! |
| 5488 * Return a function that will copy properties from |
| 5489 * one object to another excluding any originally |
| 5490 * listed. Returned function will create a new `{}`. |
| 5491 * |
| 5492 * @param {String} excluded properties ... |
| 5493 * @return {Function} |
| 5494 */ |
| 5495 |
| 5496 function exclude () { |
| 5497 var excludes = [].slice.call(arguments); |
| 5498 |
| 5499 function excludeProps (res, obj) { |
| 5500 Object.keys(obj).forEach(function (key) { |
| 5501 if (!~excludes.indexOf(key)) res[key] = obj[key]; |
| 5502 }); |
| 5503 } |
| 5504 |
| 5505 return function extendExclude () { |
| 5506 var args = [].slice.call(arguments) |
| 5507 , i = 0 |
| 5508 , res = {}; |
| 5509 |
| 5510 for (; i < args.length; i++) { |
| 5511 excludeProps(res, args[i]); |
| 5512 } |
| 5513 |
| 5514 return res; |
| 5515 }; |
| 5516 }; |
| 5517 |
| 5518 /*! |
| 5519 * Primary Exports |
| 5520 */ |
| 5521 |
| 5522 module.exports = AssertionError; |
| 5523 |
| 5524 /** |
| 5525 * ### AssertionError |
| 5526 * |
| 5527 * An extension of the JavaScript `Error` constructor for |
| 5528 * assertion and validation scenarios. |
| 5529 * |
| 5530 * @param {String} message |
| 5531 * @param {Object} properties to include (optional) |
| 5532 * @param {callee} start stack function (optional) |
| 5533 */ |
| 5534 |
| 5535 function AssertionError (message, _props, ssf) { |
| 5536 var extend = exclude('name', 'message', 'stack', 'constructor', 'toJSON') |
| 5537 , props = extend(_props || {}); |
| 5538 |
| 5539 // default values |
| 5540 this.message = message || 'Unspecified AssertionError'; |
| 5541 this.showDiff = false; |
| 5542 |
| 5543 // copy from properties |
| 5544 for (var key in props) { |
| 5545 this[key] = props[key]; |
| 5546 } |
| 5547 |
| 5548 // capture stack trace |
| 5549 ssf = ssf || arguments.callee; |
| 5550 if (ssf && Error.captureStackTrace) { |
| 5551 Error.captureStackTrace(this, ssf); |
| 5552 } else { |
| 5553 this.stack = new Error().stack; |
| 5554 } |
| 5555 } |
| 5556 |
| 5557 /*! |
| 5558 * Inherit from Error.prototype |
| 5559 */ |
| 5560 |
| 5561 AssertionError.prototype = Object.create(Error.prototype); |
| 5562 |
| 5563 /*! |
| 5564 * Statically set name |
| 5565 */ |
| 5566 |
| 5567 AssertionError.prototype.name = 'AssertionError'; |
| 5568 |
| 5569 /*! |
| 5570 * Ensure correct constructor |
| 5571 */ |
| 5572 |
| 5573 AssertionError.prototype.constructor = AssertionError; |
| 5574 |
| 5575 /** |
| 5576 * Allow errors to be converted to JSON for static transfer. |
| 5577 * |
| 5578 * @param {Boolean} include stack (default: `true`) |
| 5579 * @return {Object} object that can be `JSON.stringify` |
| 5580 */ |
| 5581 |
| 5582 AssertionError.prototype.toJSON = function (stack) { |
| 5583 var extend = exclude('constructor', 'toJSON', 'stack') |
| 5584 , props = extend({ name: this.name }, this); |
| 5585 |
| 5586 // include stack if exists and not turned off |
| 5587 if (false !== stack && this.stack) { |
| 5588 props.stack = this.stack; |
| 5589 } |
| 5590 |
| 5591 return props; |
| 5592 }; |
| 5593 |
| 5594 },{}],31:[function(require,module,exports){ |
| 5595 module.exports = require('./lib/eql'); |
| 5596 |
| 5597 },{"./lib/eql":32}],32:[function(require,module,exports){ |
| 5598 /*! |
| 5599 * deep-eql |
| 5600 * Copyright(c) 2013 Jake Luer <jake@alogicalparadox.com> |
| 5601 * MIT Licensed |
| 5602 */ |
| 5603 |
| 5604 /*! |
| 5605 * Module dependencies |
| 5606 */ |
| 5607 |
| 5608 var type = require('type-detect'); |
| 5609 |
| 5610 /*! |
| 5611 * Buffer.isBuffer browser shim |
| 5612 */ |
| 5613 |
| 5614 var Buffer; |
| 5615 try { Buffer = require('buffer').Buffer; } |
| 5616 catch(ex) { |
| 5617 Buffer = {}; |
| 5618 Buffer.isBuffer = function() { return false; } |
| 5619 } |
| 5620 |
| 5621 /*! |
| 5622 * Primary Export |
| 5623 */ |
| 5624 |
| 5625 module.exports = deepEqual; |
| 5626 |
| 5627 /** |
| 5628 * Assert super-strict (egal) equality between |
| 5629 * two objects of any type. |
| 5630 * |
| 5631 * @param {Mixed} a |
| 5632 * @param {Mixed} b |
| 5633 * @param {Array} memoised (optional) |
| 5634 * @return {Boolean} equal match |
| 5635 */ |
| 5636 |
| 5637 function deepEqual(a, b, m) { |
| 5638 if (sameValue(a, b)) { |
| 5639 return true; |
| 5640 } else if ('date' === type(a)) { |
| 5641 return dateEqual(a, b); |
| 5642 } else if ('regexp' === type(a)) { |
| 5643 return regexpEqual(a, b); |
| 5644 } else if (Buffer.isBuffer(a)) { |
| 5645 return bufferEqual(a, b); |
| 5646 } else if ('arguments' === type(a)) { |
| 5647 return argumentsEqual(a, b, m); |
| 5648 } else if (!typeEqual(a, b)) { |
| 5649 return false; |
| 5650 } else if (('object' !== type(a) && 'object' !== type(b)) |
| 5651 && ('array' !== type(a) && 'array' !== type(b))) { |
| 5652 return sameValue(a, b); |
| 5653 } else { |
| 5654 return objectEqual(a, b, m); |
| 5655 } |
| 5656 } |
| 5657 |
| 5658 /*! |
| 5659 * Strict (egal) equality test. Ensures that NaN always |
| 5660 * equals NaN and `-0` does not equal `+0`. |
| 5661 * |
| 5662 * @param {Mixed} a |
| 5663 * @param {Mixed} b |
| 5664 * @return {Boolean} equal match |
| 5665 */ |
| 5666 |
| 5667 function sameValue(a, b) { |
| 5668 if (a === b) return a !== 0 || 1 / a === 1 / b; |
| 5669 return a !== a && b !== b; |
| 5670 } |
| 5671 |
| 5672 /*! |
| 5673 * Compare the types of two given objects and |
| 5674 * return if they are equal. Note that an Array |
| 5675 * has a type of `array` (not `object`) and arguments |
| 5676 * have a type of `arguments` (not `array`/`object`). |
| 5677 * |
| 5678 * @param {Mixed} a |
| 5679 * @param {Mixed} b |
| 5680 * @return {Boolean} result |
| 5681 */ |
| 5682 |
| 5683 function typeEqual(a, b) { |
| 5684 return type(a) === type(b); |
| 5685 } |
| 5686 |
| 5687 /*! |
| 5688 * Compare two Date objects by asserting that |
| 5689 * the time values are equal using `saveValue`. |
| 5690 * |
| 5691 * @param {Date} a |
| 5692 * @param {Date} b |
| 5693 * @return {Boolean} result |
| 5694 */ |
| 5695 |
| 5696 function dateEqual(a, b) { |
| 5697 if ('date' !== type(b)) return false; |
| 5698 return sameValue(a.getTime(), b.getTime()); |
| 5699 } |
| 5700 |
| 5701 /*! |
| 5702 * Compare two regular expressions by converting them |
| 5703 * to string and checking for `sameValue`. |
| 5704 * |
| 5705 * @param {RegExp} a |
| 5706 * @param {RegExp} b |
| 5707 * @return {Boolean} result |
| 5708 */ |
| 5709 |
| 5710 function regexpEqual(a, b) { |
| 5711 if ('regexp' !== type(b)) return false; |
| 5712 return sameValue(a.toString(), b.toString()); |
| 5713 } |
| 5714 |
| 5715 /*! |
| 5716 * Assert deep equality of two `arguments` objects. |
| 5717 * Unfortunately, these must be sliced to arrays |
| 5718 * prior to test to ensure no bad behavior. |
| 5719 * |
| 5720 * @param {Arguments} a |
| 5721 * @param {Arguments} b |
| 5722 * @param {Array} memoize (optional) |
| 5723 * @return {Boolean} result |
| 5724 */ |
| 5725 |
| 5726 function argumentsEqual(a, b, m) { |
| 5727 if ('arguments' !== type(b)) return false; |
| 5728 a = [].slice.call(a); |
| 5729 b = [].slice.call(b); |
| 5730 return deepEqual(a, b, m); |
| 5731 } |
| 5732 |
| 5733 /*! |
| 5734 * Get enumerable properties of a given object. |
| 5735 * |
| 5736 * @param {Object} a |
| 5737 * @return {Array} property names |
| 5738 */ |
| 5739 |
| 5740 function enumerable(a) { |
| 5741 var res = []; |
| 5742 for (var key in a) res.push(key); |
| 5743 return res; |
| 5744 } |
| 5745 |
| 5746 /*! |
| 5747 * Simple equality for flat iterable objects |
| 5748 * such as Arrays or Node.js buffers. |
| 5749 * |
| 5750 * @param {Iterable} a |
| 5751 * @param {Iterable} b |
| 5752 * @return {Boolean} result |
| 5753 */ |
| 5754 |
| 5755 function iterableEqual(a, b) { |
| 5756 if (a.length !== b.length) return false; |
| 5757 |
| 5758 var i = 0; |
| 5759 var match = true; |
| 5760 |
| 5761 for (; i < a.length; i++) { |
| 5762 if (a[i] !== b[i]) { |
| 5763 match = false; |
| 5764 break; |
| 5765 } |
| 5766 } |
| 5767 |
| 5768 return match; |
| 5769 } |
| 5770 |
| 5771 /*! |
| 5772 * Extension to `iterableEqual` specifically |
| 5773 * for Node.js Buffers. |
| 5774 * |
| 5775 * @param {Buffer} a |
| 5776 * @param {Mixed} b |
| 5777 * @return {Boolean} result |
| 5778 */ |
| 5779 |
| 5780 function bufferEqual(a, b) { |
| 5781 if (!Buffer.isBuffer(b)) return false; |
| 5782 return iterableEqual(a, b); |
| 5783 } |
| 5784 |
| 5785 /*! |
| 5786 * Block for `objectEqual` ensuring non-existing |
| 5787 * values don't get in. |
| 5788 * |
| 5789 * @param {Mixed} object |
| 5790 * @return {Boolean} result |
| 5791 */ |
| 5792 |
| 5793 function isValue(a) { |
| 5794 return a !== null && a !== undefined; |
| 5795 } |
| 5796 |
| 5797 /*! |
| 5798 * Recursively check the equality of two objects. |
| 5799 * Once basic sameness has been established it will |
| 5800 * defer to `deepEqual` for each enumerable key |
| 5801 * in the object. |
| 5802 * |
| 5803 * @param {Mixed} a |
| 5804 * @param {Mixed} b |
| 5805 * @return {Boolean} result |
| 5806 */ |
| 5807 |
| 5808 function objectEqual(a, b, m) { |
| 5809 if (!isValue(a) || !isValue(b)) { |
| 5810 return false; |
| 5811 } |
| 5812 |
| 5813 if (a.prototype !== b.prototype) { |
| 5814 return false; |
| 5815 } |
| 5816 |
| 5817 var i; |
| 5818 if (m) { |
| 5819 for (i = 0; i < m.length; i++) { |
| 5820 if ((m[i][0] === a && m[i][1] === b) |
| 5821 || (m[i][0] === b && m[i][1] === a)) { |
| 5822 return true; |
| 5823 } |
| 5824 } |
| 5825 } else { |
| 5826 m = []; |
| 5827 } |
| 5828 |
| 5829 try { |
| 5830 var ka = enumerable(a); |
| 5831 var kb = enumerable(b); |
| 5832 } catch (ex) { |
| 5833 return false; |
| 5834 } |
| 5835 |
| 5836 ka.sort(); |
| 5837 kb.sort(); |
| 5838 |
| 5839 if (!iterableEqual(ka, kb)) { |
| 5840 return false; |
| 5841 } |
| 5842 |
| 5843 m.push([ a, b ]); |
| 5844 |
| 5845 var key; |
| 5846 for (i = ka.length - 1; i >= 0; i--) { |
| 5847 key = ka[i]; |
| 5848 if (!deepEqual(a[key], b[key], m)) { |
| 5849 return false; |
| 5850 } |
| 5851 } |
| 5852 |
| 5853 return true; |
| 5854 } |
| 5855 |
| 5856 },{"buffer":undefined,"type-detect":33}],33:[function(require,module,exports){ |
| 5857 module.exports = require('./lib/type'); |
| 5858 |
| 5859 },{"./lib/type":34}],34:[function(require,module,exports){ |
| 5860 /*! |
| 5861 * type-detect |
| 5862 * Copyright(c) 2013 jake luer <jake@alogicalparadox.com> |
| 5863 * MIT Licensed |
| 5864 */ |
| 5865 |
| 5866 /*! |
| 5867 * Primary Exports |
| 5868 */ |
| 5869 |
| 5870 var exports = module.exports = getType; |
| 5871 |
| 5872 /*! |
| 5873 * Detectable javascript natives |
| 5874 */ |
| 5875 |
| 5876 var natives = { |
| 5877 '[object Array]': 'array' |
| 5878 , '[object RegExp]': 'regexp' |
| 5879 , '[object Function]': 'function' |
| 5880 , '[object Arguments]': 'arguments' |
| 5881 , '[object Date]': 'date' |
| 5882 }; |
| 5883 |
| 5884 /** |
| 5885 * ### typeOf (obj) |
| 5886 * |
| 5887 * Use several different techniques to determine |
| 5888 * the type of object being tested. |
| 5889 * |
| 5890 * |
| 5891 * @param {Mixed} object |
| 5892 * @return {String} object type |
| 5893 * @api public |
| 5894 */ |
| 5895 |
| 5896 function getType (obj) { |
| 5897 var str = Object.prototype.toString.call(obj); |
| 5898 if (natives[str]) return natives[str]; |
| 5899 if (obj === null) return 'null'; |
| 5900 if (obj === undefined) return 'undefined'; |
| 5901 if (obj === Object(obj)) return 'object'; |
| 5902 return typeof obj; |
| 5903 } |
| 5904 |
| 5905 exports.Library = Library; |
| 5906 |
| 5907 /** |
| 5908 * ### Library |
| 5909 * |
| 5910 * Create a repository for custom type detection. |
| 5911 * |
| 5912 * ```js |
| 5913 * var lib = new type.Library; |
| 5914 * ``` |
| 5915 * |
| 5916 */ |
| 5917 |
| 5918 function Library () { |
| 5919 this.tests = {}; |
| 5920 } |
| 5921 |
| 5922 /** |
| 5923 * #### .of (obj) |
| 5924 * |
| 5925 * Expose replacement `typeof` detection to the library. |
| 5926 * |
| 5927 * ```js |
| 5928 * if ('string' === lib.of('hello world')) { |
| 5929 * // ... |
| 5930 * } |
| 5931 * ``` |
| 5932 * |
| 5933 * @param {Mixed} object to test |
| 5934 * @return {String} type |
| 5935 */ |
| 5936 |
| 5937 Library.prototype.of = getType; |
| 5938 |
| 5939 /** |
| 5940 * #### .define (type, test) |
| 5941 * |
| 5942 * Add a test to for the `.test()` assertion. |
| 5943 * |
| 5944 * Can be defined as a regular expression: |
| 5945 * |
| 5946 * ```js |
| 5947 * lib.define('int', /^[0-9]+$/); |
| 5948 * ``` |
| 5949 * |
| 5950 * ... or as a function: |
| 5951 * |
| 5952 * ```js |
| 5953 * lib.define('bln', function (obj) { |
| 5954 * if ('boolean' === lib.of(obj)) return true; |
| 5955 * var blns = [ 'yes', 'no', 'true', 'false', 1, 0 ]; |
| 5956 * if ('string' === lib.of(obj)) obj = obj.toLowerCase(); |
| 5957 * return !! ~blns.indexOf(obj); |
| 5958 * }); |
| 5959 * ``` |
| 5960 * |
| 5961 * @param {String} type |
| 5962 * @param {RegExp|Function} test |
| 5963 * @api public |
| 5964 */ |
| 5965 |
| 5966 Library.prototype.define = function (type, test) { |
| 5967 if (arguments.length === 1) return this.tests[type]; |
| 5968 this.tests[type] = test; |
| 5969 return this; |
| 5970 }; |
| 5971 |
| 5972 /** |
| 5973 * #### .test (obj, test) |
| 5974 * |
| 5975 * Assert that an object is of type. Will first |
| 5976 * check natives, and if that does not pass it will |
| 5977 * use the user defined custom tests. |
| 5978 * |
| 5979 * ```js |
| 5980 * assert(lib.test('1', 'int')); |
| 5981 * assert(lib.test('yes', 'bln')); |
| 5982 * ``` |
| 5983 * |
| 5984 * @param {Mixed} object |
| 5985 * @param {String} type |
| 5986 * @return {Boolean} result |
| 5987 * @api public |
| 5988 */ |
| 5989 |
| 5990 Library.prototype.test = function (obj, type) { |
| 5991 if (type === getType(obj)) return true; |
| 5992 var test = this.tests[type]; |
| 5993 |
| 5994 if (test && 'regexp' === getType(test)) { |
| 5995 return test.test(obj); |
| 5996 } else if (test && 'function' === getType(test)) { |
| 5997 return test(obj); |
| 5998 } else { |
| 5999 throw new ReferenceError('Type test "' + type + '" not defined or invalid.')
; |
| 6000 } |
| 6001 }; |
| 6002 |
| 6003 },{}],35:[function(require,module,exports){ |
| 6004 arguments[4][33][0].apply(exports,arguments) |
| 6005 },{"./lib/type":36,"dup":33}],36:[function(require,module,exports){ |
| 6006 /*! |
| 6007 * type-detect |
| 6008 * Copyright(c) 2013 jake luer <jake@alogicalparadox.com> |
| 6009 * MIT Licensed |
| 6010 */ |
| 6011 |
| 6012 /*! |
| 6013 * Primary Exports |
| 6014 */ |
| 6015 |
| 6016 var exports = module.exports = getType; |
| 6017 |
| 6018 /** |
| 6019 * ### typeOf (obj) |
| 6020 * |
| 6021 * Use several different techniques to determine |
| 6022 * the type of object being tested. |
| 6023 * |
| 6024 * |
| 6025 * @param {Mixed} object |
| 6026 * @return {String} object type |
| 6027 * @api public |
| 6028 */ |
| 6029 var objectTypeRegexp = /^\[object (.*)\]$/; |
| 6030 |
| 6031 function getType(obj) { |
| 6032 var type = Object.prototype.toString.call(obj).match(objectTypeRegexp)[1].toLo
werCase(); |
| 6033 // Let "new String('')" return 'object' |
| 6034 if (typeof Promise === 'function' && obj instanceof Promise) return 'promise'; |
| 6035 // PhantomJS has type "DOMWindow" for null |
| 6036 if (obj === null) return 'null'; |
| 6037 // PhantomJS has type "DOMWindow" for undefined |
| 6038 if (obj === undefined) return 'undefined'; |
| 6039 return type; |
| 6040 } |
| 6041 |
| 6042 exports.Library = Library; |
| 6043 |
| 6044 /** |
| 6045 * ### Library |
| 6046 * |
| 6047 * Create a repository for custom type detection. |
| 6048 * |
| 6049 * ```js |
| 6050 * var lib = new type.Library; |
| 6051 * ``` |
| 6052 * |
| 6053 */ |
| 6054 |
| 6055 function Library() { |
| 6056 if (!(this instanceof Library)) return new Library(); |
| 6057 this.tests = {}; |
| 6058 } |
| 6059 |
| 6060 /** |
| 6061 * #### .of (obj) |
| 6062 * |
| 6063 * Expose replacement `typeof` detection to the library. |
| 6064 * |
| 6065 * ```js |
| 6066 * if ('string' === lib.of('hello world')) { |
| 6067 * // ... |
| 6068 * } |
| 6069 * ``` |
| 6070 * |
| 6071 * @param {Mixed} object to test |
| 6072 * @return {String} type |
| 6073 */ |
| 6074 |
| 6075 Library.prototype.of = getType; |
| 6076 |
| 6077 /** |
| 6078 * #### .define (type, test) |
| 6079 * |
| 6080 * Add a test to for the `.test()` assertion. |
| 6081 * |
| 6082 * Can be defined as a regular expression: |
| 6083 * |
| 6084 * ```js |
| 6085 * lib.define('int', /^[0-9]+$/); |
| 6086 * ``` |
| 6087 * |
| 6088 * ... or as a function: |
| 6089 * |
| 6090 * ```js |
| 6091 * lib.define('bln', function (obj) { |
| 6092 * if ('boolean' === lib.of(obj)) return true; |
| 6093 * var blns = [ 'yes', 'no', 'true', 'false', 1, 0 ]; |
| 6094 * if ('string' === lib.of(obj)) obj = obj.toLowerCase(); |
| 6095 * return !! ~blns.indexOf(obj); |
| 6096 * }); |
| 6097 * ``` |
| 6098 * |
| 6099 * @param {String} type |
| 6100 * @param {RegExp|Function} test |
| 6101 * @api public |
| 6102 */ |
| 6103 |
| 6104 Library.prototype.define = function(type, test) { |
| 6105 if (arguments.length === 1) return this.tests[type]; |
| 6106 this.tests[type] = test; |
| 6107 return this; |
| 6108 }; |
| 6109 |
| 6110 /** |
| 6111 * #### .test (obj, test) |
| 6112 * |
| 6113 * Assert that an object is of type. Will first |
| 6114 * check natives, and if that does not pass it will |
| 6115 * use the user defined custom tests. |
| 6116 * |
| 6117 * ```js |
| 6118 * assert(lib.test('1', 'int')); |
| 6119 * assert(lib.test('yes', 'bln')); |
| 6120 * ``` |
| 6121 * |
| 6122 * @param {Mixed} object |
| 6123 * @param {String} type |
| 6124 * @return {Boolean} result |
| 6125 * @api public |
| 6126 */ |
| 6127 |
| 6128 Library.prototype.test = function(obj, type) { |
| 6129 if (type === getType(obj)) return true; |
| 6130 var test = this.tests[type]; |
| 6131 |
| 6132 if (test && 'regexp' === getType(test)) { |
| 6133 return test.test(obj); |
| 6134 } else if (test && 'function' === getType(test)) { |
| 6135 return test(obj); |
| 6136 } else { |
| 6137 throw new ReferenceError('Type test "' + type + '" not defined or invalid.')
; |
| 6138 } |
| 6139 }; |
| 6140 |
| 6141 },{}]},{},[1])(1) |
| 6142 }); |
| OLD | NEW |