ende 0.4.3 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -26,10 +26,14 @@ function require(path, parent, orig) {
26
26
  // perform real require()
27
27
  // by invoking the module's
28
28
  // registered function
29
- if (!module.exports) {
30
- module.exports = {};
31
- module.client = module.component = true;
32
- module.call(this, module.exports, require.relative(resolved), module);
29
+ if (!module._resolving && !module.exports) {
30
+ var mod = {};
31
+ mod.exports = {};
32
+ mod.client = mod.component = true;
33
+ module._resolving = true;
34
+ module.call(this, mod.exports, require.relative(resolved), mod);
35
+ delete module._resolving;
36
+ module.exports = mod.exports;
33
37
  }
34
38
 
35
39
  return module.exports;
@@ -15071,6 +15075,4124 @@ exports.mixin = function(object) {
15071
15075
  return $.extend(object, mixin);
15072
15076
  };
15073
15077
 
15078
+ });
15079
+ require.register("chaijs-assertion-error/index.js", function(exports, require, module){
15080
+ /*!
15081
+ * assertion-error
15082
+ * Copyright(c) 2013 Jake Luer <jake@qualiancy.com>
15083
+ * MIT Licensed
15084
+ */
15085
+
15086
+ /*!
15087
+ * Return a function that will copy properties from
15088
+ * one object to another excluding any originally
15089
+ * listed. Returned function will create a new `{}`.
15090
+ *
15091
+ * @param {String} excluded properties ...
15092
+ * @return {Function}
15093
+ */
15094
+
15095
+ function exclude () {
15096
+ var excludes = [].slice.call(arguments);
15097
+
15098
+ function excludeProps (res, obj) {
15099
+ Object.keys(obj).forEach(function (key) {
15100
+ if (!~excludes.indexOf(key)) res[key] = obj[key];
15101
+ });
15102
+ }
15103
+
15104
+ return function extendExclude () {
15105
+ var args = [].slice.call(arguments)
15106
+ , i = 0
15107
+ , res = {};
15108
+
15109
+ for (; i < args.length; i++) {
15110
+ excludeProps(res, args[i]);
15111
+ }
15112
+
15113
+ return res;
15114
+ };
15115
+ };
15116
+
15117
+ /*!
15118
+ * Primary Exports
15119
+ */
15120
+
15121
+ module.exports = AssertionError;
15122
+
15123
+ /**
15124
+ * ### AssertionError
15125
+ *
15126
+ * An extension of the JavaScript `Error` constructor for
15127
+ * assertion and validation scenarios.
15128
+ *
15129
+ * @param {String} message
15130
+ * @param {Object} properties to include (optional)
15131
+ * @param {callee} start stack function (optional)
15132
+ */
15133
+
15134
+ function AssertionError (message, _props, ssf) {
15135
+ var extend = exclude('name', 'message', 'stack', 'constructor', 'toJSON')
15136
+ , props = extend(_props || {});
15137
+
15138
+ // default values
15139
+ this.message = message || 'Unspecified AssertionError';
15140
+ this.showDiff = false;
15141
+
15142
+ // copy from properties
15143
+ for (var key in props) {
15144
+ this[key] = props[key];
15145
+ }
15146
+
15147
+ // capture stack trace
15148
+ ssf = ssf || arguments.callee;
15149
+ if (ssf && Error.captureStackTrace) {
15150
+ Error.captureStackTrace(this, ssf);
15151
+ }
15152
+ }
15153
+
15154
+ /*!
15155
+ * Inherit from Error.prototype
15156
+ */
15157
+
15158
+ AssertionError.prototype = Object.create(Error.prototype);
15159
+
15160
+ /*!
15161
+ * Statically set name
15162
+ */
15163
+
15164
+ AssertionError.prototype.name = 'AssertionError';
15165
+
15166
+ /*!
15167
+ * Ensure correct constructor
15168
+ */
15169
+
15170
+ AssertionError.prototype.constructor = AssertionError;
15171
+
15172
+ /**
15173
+ * Allow errors to be converted to JSON for static transfer.
15174
+ *
15175
+ * @param {Boolean} include stack (default: `true`)
15176
+ * @return {Object} object that can be `JSON.stringify`
15177
+ */
15178
+
15179
+ AssertionError.prototype.toJSON = function (stack) {
15180
+ var extend = exclude('constructor', 'toJSON', 'stack')
15181
+ , props = extend({ name: this.name }, this);
15182
+
15183
+ // include stack if exists and not turned off
15184
+ if (false !== stack && this.stack) {
15185
+ props.stack = this.stack;
15186
+ }
15187
+
15188
+ return props;
15189
+ };
15190
+
15191
+ });
15192
+ require.register("chaijs-chai/index.js", function(exports, require, module){
15193
+ module.exports = require('./lib/chai');
15194
+
15195
+ });
15196
+ require.register("chaijs-chai/lib/chai.js", function(exports, require, module){
15197
+ /*!
15198
+ * chai
15199
+ * Copyright(c) 2011-2013 Jake Luer <jake@alogicalparadox.com>
15200
+ * MIT Licensed
15201
+ */
15202
+
15203
+ var used = []
15204
+ , exports = module.exports = {};
15205
+
15206
+ /*!
15207
+ * Chai version
15208
+ */
15209
+
15210
+ exports.version = '1.7.2';
15211
+
15212
+ /*!
15213
+ * Assertion Error
15214
+ */
15215
+
15216
+ exports.AssertionError = require('assertion-error');
15217
+
15218
+ /*!
15219
+ * Utils for plugins (not exported)
15220
+ */
15221
+
15222
+ var util = require('./chai/utils');
15223
+
15224
+ /**
15225
+ * # .use(function)
15226
+ *
15227
+ * Provides a way to extend the internals of Chai
15228
+ *
15229
+ * @param {Function}
15230
+ * @returns {this} for chaining
15231
+ * @api public
15232
+ */
15233
+
15234
+ exports.use = function (fn) {
15235
+ if (!~used.indexOf(fn)) {
15236
+ fn(this, util);
15237
+ used.push(fn);
15238
+ }
15239
+
15240
+ return this;
15241
+ };
15242
+
15243
+ /*!
15244
+ * Primary `Assertion` prototype
15245
+ */
15246
+
15247
+ var assertion = require('./chai/assertion');
15248
+ exports.use(assertion);
15249
+
15250
+ /*!
15251
+ * Core Assertions
15252
+ */
15253
+
15254
+ var core = require('./chai/core/assertions');
15255
+ exports.use(core);
15256
+
15257
+ /*!
15258
+ * Expect interface
15259
+ */
15260
+
15261
+ var expect = require('./chai/interface/expect');
15262
+ exports.use(expect);
15263
+
15264
+ /*!
15265
+ * Should interface
15266
+ */
15267
+
15268
+ var should = require('./chai/interface/should');
15269
+ exports.use(should);
15270
+
15271
+ /*!
15272
+ * Assert interface
15273
+ */
15274
+
15275
+ var assert = require('./chai/interface/assert');
15276
+ exports.use(assert);
15277
+
15278
+ });
15279
+ require.register("chaijs-chai/lib/chai/assertion.js", function(exports, require, module){
15280
+ /*!
15281
+ * chai
15282
+ * http://chaijs.com
15283
+ * Copyright(c) 2011-2013 Jake Luer <jake@alogicalparadox.com>
15284
+ * MIT Licensed
15285
+ */
15286
+
15287
+ module.exports = function (_chai, util) {
15288
+ /*!
15289
+ * Module dependencies.
15290
+ */
15291
+
15292
+ var AssertionError = _chai.AssertionError
15293
+ , flag = util.flag;
15294
+
15295
+ /*!
15296
+ * Module export.
15297
+ */
15298
+
15299
+ _chai.Assertion = Assertion;
15300
+
15301
+ /*!
15302
+ * Assertion Constructor
15303
+ *
15304
+ * Creates object for chaining.
15305
+ *
15306
+ * @api private
15307
+ */
15308
+
15309
+ function Assertion (obj, msg, stack) {
15310
+ flag(this, 'ssfi', stack || arguments.callee);
15311
+ flag(this, 'object', obj);
15312
+ flag(this, 'message', msg);
15313
+ }
15314
+
15315
+ /*!
15316
+ * ### Assertion.includeStack
15317
+ *
15318
+ * User configurable property, influences whether stack trace
15319
+ * is included in Assertion error message. Default of false
15320
+ * suppresses stack trace in the error message
15321
+ *
15322
+ * Assertion.includeStack = true; // enable stack on error
15323
+ *
15324
+ * @api public
15325
+ */
15326
+
15327
+ Assertion.includeStack = false;
15328
+
15329
+ /*!
15330
+ * ### Assertion.showDiff
15331
+ *
15332
+ * User configurable property, influences whether or not
15333
+ * the `showDiff` flag should be included in the thrown
15334
+ * AssertionErrors. `false` will always be `false`; `true`
15335
+ * will be true when the assertion has requested a diff
15336
+ * be shown.
15337
+ *
15338
+ * @api public
15339
+ */
15340
+
15341
+ Assertion.showDiff = true;
15342
+
15343
+ Assertion.addProperty = function (name, fn) {
15344
+ util.addProperty(this.prototype, name, fn);
15345
+ };
15346
+
15347
+ Assertion.addMethod = function (name, fn) {
15348
+ util.addMethod(this.prototype, name, fn);
15349
+ };
15350
+
15351
+ Assertion.addChainableMethod = function (name, fn, chainingBehavior) {
15352
+ util.addChainableMethod(this.prototype, name, fn, chainingBehavior);
15353
+ };
15354
+
15355
+ Assertion.overwriteProperty = function (name, fn) {
15356
+ util.overwriteProperty(this.prototype, name, fn);
15357
+ };
15358
+
15359
+ Assertion.overwriteMethod = function (name, fn) {
15360
+ util.overwriteMethod(this.prototype, name, fn);
15361
+ };
15362
+
15363
+ /*!
15364
+ * ### .assert(expression, message, negateMessage, expected, actual)
15365
+ *
15366
+ * Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass.
15367
+ *
15368
+ * @name assert
15369
+ * @param {Philosophical} expression to be tested
15370
+ * @param {String} message to display if fails
15371
+ * @param {String} negatedMessage to display if negated expression fails
15372
+ * @param {Mixed} expected value (remember to check for negation)
15373
+ * @param {Mixed} actual (optional) will default to `this.obj`
15374
+ * @api private
15375
+ */
15376
+
15377
+ Assertion.prototype.assert = function (expr, msg, negateMsg, expected, _actual, showDiff) {
15378
+ var ok = util.test(this, arguments);
15379
+ if (true !== showDiff) showDiff = false;
15380
+ if (true !== Assertion.showDiff) showDiff = false;
15381
+
15382
+ if (!ok) {
15383
+ var msg = util.getMessage(this, arguments)
15384
+ , actual = util.getActual(this, arguments);
15385
+ throw new AssertionError(msg, {
15386
+ actual: actual
15387
+ , expected: expected
15388
+ , showDiff: showDiff
15389
+ }, (Assertion.includeStack) ? this.assert : flag(this, 'ssfi'));
15390
+ }
15391
+ };
15392
+
15393
+ /*!
15394
+ * ### ._obj
15395
+ *
15396
+ * Quick reference to stored `actual` value for plugin developers.
15397
+ *
15398
+ * @api private
15399
+ */
15400
+
15401
+ Object.defineProperty(Assertion.prototype, '_obj',
15402
+ { get: function () {
15403
+ return flag(this, 'object');
15404
+ }
15405
+ , set: function (val) {
15406
+ flag(this, 'object', val);
15407
+ }
15408
+ });
15409
+ };
15410
+
15411
+ });
15412
+ require.register("chaijs-chai/lib/chai/core/assertions.js", function(exports, require, module){
15413
+ /*!
15414
+ * chai
15415
+ * http://chaijs.com
15416
+ * Copyright(c) 2011-2013 Jake Luer <jake@alogicalparadox.com>
15417
+ * MIT Licensed
15418
+ */
15419
+
15420
+ module.exports = function (chai, _) {
15421
+ var Assertion = chai.Assertion
15422
+ , toString = Object.prototype.toString
15423
+ , flag = _.flag;
15424
+
15425
+ /**
15426
+ * ### Language Chains
15427
+ *
15428
+ * The following are provide as chainable getters to
15429
+ * improve the readability of your assertions. They
15430
+ * do not provide an testing capability unless they
15431
+ * have been overwritten by a plugin.
15432
+ *
15433
+ * **Chains**
15434
+ *
15435
+ * - to
15436
+ * - be
15437
+ * - been
15438
+ * - is
15439
+ * - that
15440
+ * - and
15441
+ * - have
15442
+ * - with
15443
+ * - at
15444
+ * - of
15445
+ * - same
15446
+ *
15447
+ * @name language chains
15448
+ * @api public
15449
+ */
15450
+
15451
+ [ 'to', 'be', 'been'
15452
+ , 'is', 'and', 'have'
15453
+ , 'with', 'that', 'at'
15454
+ , 'of', 'same' ].forEach(function (chain) {
15455
+ Assertion.addProperty(chain, function () {
15456
+ return this;
15457
+ });
15458
+ });
15459
+
15460
+ /**
15461
+ * ### .not
15462
+ *
15463
+ * Negates any of assertions following in the chain.
15464
+ *
15465
+ * expect(foo).to.not.equal('bar');
15466
+ * expect(goodFn).to.not.throw(Error);
15467
+ * expect({ foo: 'baz' }).to.have.property('foo')
15468
+ * .and.not.equal('bar');
15469
+ *
15470
+ * @name not
15471
+ * @api public
15472
+ */
15473
+
15474
+ Assertion.addProperty('not', function () {
15475
+ flag(this, 'negate', true);
15476
+ });
15477
+
15478
+ /**
15479
+ * ### .deep
15480
+ *
15481
+ * Sets the `deep` flag, later used by the `equal` and
15482
+ * `property` assertions.
15483
+ *
15484
+ * expect(foo).to.deep.equal({ bar: 'baz' });
15485
+ * expect({ foo: { bar: { baz: 'quux' } } })
15486
+ * .to.have.deep.property('foo.bar.baz', 'quux');
15487
+ *
15488
+ * @name deep
15489
+ * @api public
15490
+ */
15491
+
15492
+ Assertion.addProperty('deep', function () {
15493
+ flag(this, 'deep', true);
15494
+ });
15495
+
15496
+ /**
15497
+ * ### .a(type)
15498
+ *
15499
+ * The `a` and `an` assertions are aliases that can be
15500
+ * used either as language chains or to assert a value's
15501
+ * type.
15502
+ *
15503
+ * // typeof
15504
+ * expect('test').to.be.a('string');
15505
+ * expect({ foo: 'bar' }).to.be.an('object');
15506
+ * expect(null).to.be.a('null');
15507
+ * expect(undefined).to.be.an('undefined');
15508
+ *
15509
+ * // language chain
15510
+ * expect(foo).to.be.an.instanceof(Foo);
15511
+ *
15512
+ * @name a
15513
+ * @alias an
15514
+ * @param {String} type
15515
+ * @param {String} message _optional_
15516
+ * @api public
15517
+ */
15518
+
15519
+ function an (type, msg) {
15520
+ if (msg) flag(this, 'message', msg);
15521
+ type = type.toLowerCase();
15522
+ var obj = flag(this, 'object')
15523
+ , article = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(type.charAt(0)) ? 'an ' : 'a ';
15524
+
15525
+ this.assert(
15526
+ type === _.type(obj)
15527
+ , 'expected #{this} to be ' + article + type
15528
+ , 'expected #{this} not to be ' + article + type
15529
+ );
15530
+ }
15531
+
15532
+ Assertion.addChainableMethod('an', an);
15533
+ Assertion.addChainableMethod('a', an);
15534
+
15535
+ /**
15536
+ * ### .include(value)
15537
+ *
15538
+ * The `include` and `contain` assertions can be used as either property
15539
+ * based language chains or as methods to assert the inclusion of an object
15540
+ * in an array or a substring in a string. When used as language chains,
15541
+ * they toggle the `contain` flag for the `keys` assertion.
15542
+ *
15543
+ * expect([1,2,3]).to.include(2);
15544
+ * expect('foobar').to.contain('foo');
15545
+ * expect({ foo: 'bar', hello: 'universe' }).to.include.keys('foo');
15546
+ *
15547
+ * @name include
15548
+ * @alias contain
15549
+ * @param {Object|String|Number} obj
15550
+ * @param {String} message _optional_
15551
+ * @api public
15552
+ */
15553
+
15554
+ function includeChainingBehavior () {
15555
+ flag(this, 'contains', true);
15556
+ }
15557
+
15558
+ function include (val, msg) {
15559
+ if (msg) flag(this, 'message', msg);
15560
+ var obj = flag(this, 'object')
15561
+ this.assert(
15562
+ ~obj.indexOf(val)
15563
+ , 'expected #{this} to include ' + _.inspect(val)
15564
+ , 'expected #{this} to not include ' + _.inspect(val));
15565
+ }
15566
+
15567
+ Assertion.addChainableMethod('include', include, includeChainingBehavior);
15568
+ Assertion.addChainableMethod('contain', include, includeChainingBehavior);
15569
+
15570
+ /**
15571
+ * ### .ok
15572
+ *
15573
+ * Asserts that the target is truthy.
15574
+ *
15575
+ * expect('everthing').to.be.ok;
15576
+ * expect(1).to.be.ok;
15577
+ * expect(false).to.not.be.ok;
15578
+ * expect(undefined).to.not.be.ok;
15579
+ * expect(null).to.not.be.ok;
15580
+ *
15581
+ * @name ok
15582
+ * @api public
15583
+ */
15584
+
15585
+ Assertion.addProperty('ok', function () {
15586
+ this.assert(
15587
+ flag(this, 'object')
15588
+ , 'expected #{this} to be truthy'
15589
+ , 'expected #{this} to be falsy');
15590
+ });
15591
+
15592
+ /**
15593
+ * ### .true
15594
+ *
15595
+ * Asserts that the target is `true`.
15596
+ *
15597
+ * expect(true).to.be.true;
15598
+ * expect(1).to.not.be.true;
15599
+ *
15600
+ * @name true
15601
+ * @api public
15602
+ */
15603
+
15604
+ Assertion.addProperty('true', function () {
15605
+ this.assert(
15606
+ true === flag(this, 'object')
15607
+ , 'expected #{this} to be true'
15608
+ , 'expected #{this} to be false'
15609
+ , this.negate ? false : true
15610
+ );
15611
+ });
15612
+
15613
+ /**
15614
+ * ### .false
15615
+ *
15616
+ * Asserts that the target is `false`.
15617
+ *
15618
+ * expect(false).to.be.false;
15619
+ * expect(0).to.not.be.false;
15620
+ *
15621
+ * @name false
15622
+ * @api public
15623
+ */
15624
+
15625
+ Assertion.addProperty('false', function () {
15626
+ this.assert(
15627
+ false === flag(this, 'object')
15628
+ , 'expected #{this} to be false'
15629
+ , 'expected #{this} to be true'
15630
+ , this.negate ? true : false
15631
+ );
15632
+ });
15633
+
15634
+ /**
15635
+ * ### .null
15636
+ *
15637
+ * Asserts that the target is `null`.
15638
+ *
15639
+ * expect(null).to.be.null;
15640
+ * expect(undefined).not.to.be.null;
15641
+ *
15642
+ * @name null
15643
+ * @api public
15644
+ */
15645
+
15646
+ Assertion.addProperty('null', function () {
15647
+ this.assert(
15648
+ null === flag(this, 'object')
15649
+ , 'expected #{this} to be null'
15650
+ , 'expected #{this} not to be null'
15651
+ );
15652
+ });
15653
+
15654
+ /**
15655
+ * ### .undefined
15656
+ *
15657
+ * Asserts that the target is `undefined`.
15658
+ *
15659
+ * expect(undefined).to.be.undefined;
15660
+ * expect(null).to.not.be.undefined;
15661
+ *
15662
+ * @name undefined
15663
+ * @api public
15664
+ */
15665
+
15666
+ Assertion.addProperty('undefined', function () {
15667
+ this.assert(
15668
+ undefined === flag(this, 'object')
15669
+ , 'expected #{this} to be undefined'
15670
+ , 'expected #{this} not to be undefined'
15671
+ );
15672
+ });
15673
+
15674
+ /**
15675
+ * ### .exist
15676
+ *
15677
+ * Asserts that the target is neither `null` nor `undefined`.
15678
+ *
15679
+ * var foo = 'hi'
15680
+ * , bar = null
15681
+ * , baz;
15682
+ *
15683
+ * expect(foo).to.exist;
15684
+ * expect(bar).to.not.exist;
15685
+ * expect(baz).to.not.exist;
15686
+ *
15687
+ * @name exist
15688
+ * @api public
15689
+ */
15690
+
15691
+ Assertion.addProperty('exist', function () {
15692
+ this.assert(
15693
+ null != flag(this, 'object')
15694
+ , 'expected #{this} to exist'
15695
+ , 'expected #{this} to not exist'
15696
+ );
15697
+ });
15698
+
15699
+
15700
+ /**
15701
+ * ### .empty
15702
+ *
15703
+ * Asserts that the target's length is `0`. For arrays, it checks
15704
+ * the `length` property. For objects, it gets the count of
15705
+ * enumerable keys.
15706
+ *
15707
+ * expect([]).to.be.empty;
15708
+ * expect('').to.be.empty;
15709
+ * expect({}).to.be.empty;
15710
+ *
15711
+ * @name empty
15712
+ * @api public
15713
+ */
15714
+
15715
+ Assertion.addProperty('empty', function () {
15716
+ var obj = flag(this, 'object')
15717
+ , expected = obj;
15718
+
15719
+ if (Array.isArray(obj) || 'string' === typeof object) {
15720
+ expected = obj.length;
15721
+ } else if (typeof obj === 'object') {
15722
+ expected = Object.keys(obj).length;
15723
+ }
15724
+
15725
+ this.assert(
15726
+ !expected
15727
+ , 'expected #{this} to be empty'
15728
+ , 'expected #{this} not to be empty'
15729
+ );
15730
+ });
15731
+
15732
+ /**
15733
+ * ### .arguments
15734
+ *
15735
+ * Asserts that the target is an arguments object.
15736
+ *
15737
+ * function test () {
15738
+ * expect(arguments).to.be.arguments;
15739
+ * }
15740
+ *
15741
+ * @name arguments
15742
+ * @alias Arguments
15743
+ * @api public
15744
+ */
15745
+
15746
+ function checkArguments () {
15747
+ var obj = flag(this, 'object')
15748
+ , type = Object.prototype.toString.call(obj);
15749
+ this.assert(
15750
+ '[object Arguments]' === type
15751
+ , 'expected #{this} to be arguments but got ' + type
15752
+ , 'expected #{this} to not be arguments'
15753
+ );
15754
+ }
15755
+
15756
+ Assertion.addProperty('arguments', checkArguments);
15757
+ Assertion.addProperty('Arguments', checkArguments);
15758
+
15759
+ /**
15760
+ * ### .equal(value)
15761
+ *
15762
+ * Asserts that the target is strictly equal (`===`) to `value`.
15763
+ * Alternately, if the `deep` flag is set, asserts that
15764
+ * the target is deeply equal to `value`.
15765
+ *
15766
+ * expect('hello').to.equal('hello');
15767
+ * expect(42).to.equal(42);
15768
+ * expect(1).to.not.equal(true);
15769
+ * expect({ foo: 'bar' }).to.not.equal({ foo: 'bar' });
15770
+ * expect({ foo: 'bar' }).to.deep.equal({ foo: 'bar' });
15771
+ *
15772
+ * @name equal
15773
+ * @alias equals
15774
+ * @alias eq
15775
+ * @alias deep.equal
15776
+ * @param {Mixed} value
15777
+ * @param {String} message _optional_
15778
+ * @api public
15779
+ */
15780
+
15781
+ function assertEqual (val, msg) {
15782
+ if (msg) flag(this, 'message', msg);
15783
+ var obj = flag(this, 'object');
15784
+ if (flag(this, 'deep')) {
15785
+ return this.eql(val);
15786
+ } else {
15787
+ this.assert(
15788
+ val === obj
15789
+ , 'expected #{this} to equal #{exp}'
15790
+ , 'expected #{this} to not equal #{exp}'
15791
+ , val
15792
+ , this._obj
15793
+ , true
15794
+ );
15795
+ }
15796
+ }
15797
+
15798
+ Assertion.addMethod('equal', assertEqual);
15799
+ Assertion.addMethod('equals', assertEqual);
15800
+ Assertion.addMethod('eq', assertEqual);
15801
+
15802
+ /**
15803
+ * ### .eql(value)
15804
+ *
15805
+ * Asserts that the target is deeply equal to `value`.
15806
+ *
15807
+ * expect({ foo: 'bar' }).to.eql({ foo: 'bar' });
15808
+ * expect([ 1, 2, 3 ]).to.eql([ 1, 2, 3 ]);
15809
+ *
15810
+ * @name eql
15811
+ * @alias eqls
15812
+ * @param {Mixed} value
15813
+ * @param {String} message _optional_
15814
+ * @api public
15815
+ */
15816
+
15817
+ function assertEql(obj, msg) {
15818
+ if (msg) flag(this, 'message', msg);
15819
+ this.assert(
15820
+ _.eql(obj, flag(this, 'object'))
15821
+ , 'expected #{this} to deeply equal #{exp}'
15822
+ , 'expected #{this} to not deeply equal #{exp}'
15823
+ , obj
15824
+ , this._obj
15825
+ , true
15826
+ );
15827
+ }
15828
+
15829
+ Assertion.addMethod('eql', assertEql);
15830
+ Assertion.addMethod('eqls', assertEql);
15831
+
15832
+ /**
15833
+ * ### .above(value)
15834
+ *
15835
+ * Asserts that the target is greater than `value`.
15836
+ *
15837
+ * expect(10).to.be.above(5);
15838
+ *
15839
+ * Can also be used in conjunction with `length` to
15840
+ * assert a minimum length. The benefit being a
15841
+ * more informative error message than if the length
15842
+ * was supplied directly.
15843
+ *
15844
+ * expect('foo').to.have.length.above(2);
15845
+ * expect([ 1, 2, 3 ]).to.have.length.above(2);
15846
+ *
15847
+ * @name above
15848
+ * @alias gt
15849
+ * @alias greaterThan
15850
+ * @param {Number} value
15851
+ * @param {String} message _optional_
15852
+ * @api public
15853
+ */
15854
+
15855
+ function assertAbove (n, msg) {
15856
+ if (msg) flag(this, 'message', msg);
15857
+ var obj = flag(this, 'object');
15858
+ if (flag(this, 'doLength')) {
15859
+ new Assertion(obj, msg).to.have.property('length');
15860
+ var len = obj.length;
15861
+ this.assert(
15862
+ len > n
15863
+ , 'expected #{this} to have a length above #{exp} but got #{act}'
15864
+ , 'expected #{this} to not have a length above #{exp}'
15865
+ , n
15866
+ , len
15867
+ );
15868
+ } else {
15869
+ this.assert(
15870
+ obj > n
15871
+ , 'expected #{this} to be above ' + n
15872
+ , 'expected #{this} to be at most ' + n
15873
+ );
15874
+ }
15875
+ }
15876
+
15877
+ Assertion.addMethod('above', assertAbove);
15878
+ Assertion.addMethod('gt', assertAbove);
15879
+ Assertion.addMethod('greaterThan', assertAbove);
15880
+
15881
+ /**
15882
+ * ### .least(value)
15883
+ *
15884
+ * Asserts that the target is greater than or equal to `value`.
15885
+ *
15886
+ * expect(10).to.be.at.least(10);
15887
+ *
15888
+ * Can also be used in conjunction with `length` to
15889
+ * assert a minimum length. The benefit being a
15890
+ * more informative error message than if the length
15891
+ * was supplied directly.
15892
+ *
15893
+ * expect('foo').to.have.length.of.at.least(2);
15894
+ * expect([ 1, 2, 3 ]).to.have.length.of.at.least(3);
15895
+ *
15896
+ * @name least
15897
+ * @alias gte
15898
+ * @param {Number} value
15899
+ * @param {String} message _optional_
15900
+ * @api public
15901
+ */
15902
+
15903
+ function assertLeast (n, msg) {
15904
+ if (msg) flag(this, 'message', msg);
15905
+ var obj = flag(this, 'object');
15906
+ if (flag(this, 'doLength')) {
15907
+ new Assertion(obj, msg).to.have.property('length');
15908
+ var len = obj.length;
15909
+ this.assert(
15910
+ len >= n
15911
+ , 'expected #{this} to have a length at least #{exp} but got #{act}'
15912
+ , 'expected #{this} to have a length below #{exp}'
15913
+ , n
15914
+ , len
15915
+ );
15916
+ } else {
15917
+ this.assert(
15918
+ obj >= n
15919
+ , 'expected #{this} to be at least ' + n
15920
+ , 'expected #{this} to be below ' + n
15921
+ );
15922
+ }
15923
+ }
15924
+
15925
+ Assertion.addMethod('least', assertLeast);
15926
+ Assertion.addMethod('gte', assertLeast);
15927
+
15928
+ /**
15929
+ * ### .below(value)
15930
+ *
15931
+ * Asserts that the target is less than `value`.
15932
+ *
15933
+ * expect(5).to.be.below(10);
15934
+ *
15935
+ * Can also be used in conjunction with `length` to
15936
+ * assert a maximum length. The benefit being a
15937
+ * more informative error message than if the length
15938
+ * was supplied directly.
15939
+ *
15940
+ * expect('foo').to.have.length.below(4);
15941
+ * expect([ 1, 2, 3 ]).to.have.length.below(4);
15942
+ *
15943
+ * @name below
15944
+ * @alias lt
15945
+ * @alias lessThan
15946
+ * @param {Number} value
15947
+ * @param {String} message _optional_
15948
+ * @api public
15949
+ */
15950
+
15951
+ function assertBelow (n, msg) {
15952
+ if (msg) flag(this, 'message', msg);
15953
+ var obj = flag(this, 'object');
15954
+ if (flag(this, 'doLength')) {
15955
+ new Assertion(obj, msg).to.have.property('length');
15956
+ var len = obj.length;
15957
+ this.assert(
15958
+ len < n
15959
+ , 'expected #{this} to have a length below #{exp} but got #{act}'
15960
+ , 'expected #{this} to not have a length below #{exp}'
15961
+ , n
15962
+ , len
15963
+ );
15964
+ } else {
15965
+ this.assert(
15966
+ obj < n
15967
+ , 'expected #{this} to be below ' + n
15968
+ , 'expected #{this} to be at least ' + n
15969
+ );
15970
+ }
15971
+ }
15972
+
15973
+ Assertion.addMethod('below', assertBelow);
15974
+ Assertion.addMethod('lt', assertBelow);
15975
+ Assertion.addMethod('lessThan', assertBelow);
15976
+
15977
+ /**
15978
+ * ### .most(value)
15979
+ *
15980
+ * Asserts that the target is less than or equal to `value`.
15981
+ *
15982
+ * expect(5).to.be.at.most(5);
15983
+ *
15984
+ * Can also be used in conjunction with `length` to
15985
+ * assert a maximum length. The benefit being a
15986
+ * more informative error message than if the length
15987
+ * was supplied directly.
15988
+ *
15989
+ * expect('foo').to.have.length.of.at.most(4);
15990
+ * expect([ 1, 2, 3 ]).to.have.length.of.at.most(3);
15991
+ *
15992
+ * @name most
15993
+ * @alias lte
15994
+ * @param {Number} value
15995
+ * @param {String} message _optional_
15996
+ * @api public
15997
+ */
15998
+
15999
+ function assertMost (n, msg) {
16000
+ if (msg) flag(this, 'message', msg);
16001
+ var obj = flag(this, 'object');
16002
+ if (flag(this, 'doLength')) {
16003
+ new Assertion(obj, msg).to.have.property('length');
16004
+ var len = obj.length;
16005
+ this.assert(
16006
+ len <= n
16007
+ , 'expected #{this} to have a length at most #{exp} but got #{act}'
16008
+ , 'expected #{this} to have a length above #{exp}'
16009
+ , n
16010
+ , len
16011
+ );
16012
+ } else {
16013
+ this.assert(
16014
+ obj <= n
16015
+ , 'expected #{this} to be at most ' + n
16016
+ , 'expected #{this} to be above ' + n
16017
+ );
16018
+ }
16019
+ }
16020
+
16021
+ Assertion.addMethod('most', assertMost);
16022
+ Assertion.addMethod('lte', assertMost);
16023
+
16024
+ /**
16025
+ * ### .within(start, finish)
16026
+ *
16027
+ * Asserts that the target is within a range.
16028
+ *
16029
+ * expect(7).to.be.within(5,10);
16030
+ *
16031
+ * Can also be used in conjunction with `length` to
16032
+ * assert a length range. The benefit being a
16033
+ * more informative error message than if the length
16034
+ * was supplied directly.
16035
+ *
16036
+ * expect('foo').to.have.length.within(2,4);
16037
+ * expect([ 1, 2, 3 ]).to.have.length.within(2,4);
16038
+ *
16039
+ * @name within
16040
+ * @param {Number} start lowerbound inclusive
16041
+ * @param {Number} finish upperbound inclusive
16042
+ * @param {String} message _optional_
16043
+ * @api public
16044
+ */
16045
+
16046
+ Assertion.addMethod('within', function (start, finish, msg) {
16047
+ if (msg) flag(this, 'message', msg);
16048
+ var obj = flag(this, 'object')
16049
+ , range = start + '..' + finish;
16050
+ if (flag(this, 'doLength')) {
16051
+ new Assertion(obj, msg).to.have.property('length');
16052
+ var len = obj.length;
16053
+ this.assert(
16054
+ len >= start && len <= finish
16055
+ , 'expected #{this} to have a length within ' + range
16056
+ , 'expected #{this} to not have a length within ' + range
16057
+ );
16058
+ } else {
16059
+ this.assert(
16060
+ obj >= start && obj <= finish
16061
+ , 'expected #{this} to be within ' + range
16062
+ , 'expected #{this} to not be within ' + range
16063
+ );
16064
+ }
16065
+ });
16066
+
16067
+ /**
16068
+ * ### .instanceof(constructor)
16069
+ *
16070
+ * Asserts that the target is an instance of `constructor`.
16071
+ *
16072
+ * var Tea = function (name) { this.name = name; }
16073
+ * , Chai = new Tea('chai');
16074
+ *
16075
+ * expect(Chai).to.be.an.instanceof(Tea);
16076
+ * expect([ 1, 2, 3 ]).to.be.instanceof(Array);
16077
+ *
16078
+ * @name instanceof
16079
+ * @param {Constructor} constructor
16080
+ * @param {String} message _optional_
16081
+ * @alias instanceOf
16082
+ * @api public
16083
+ */
16084
+
16085
+ function assertInstanceOf (constructor, msg) {
16086
+ if (msg) flag(this, 'message', msg);
16087
+ var name = _.getName(constructor);
16088
+ this.assert(
16089
+ flag(this, 'object') instanceof constructor
16090
+ , 'expected #{this} to be an instance of ' + name
16091
+ , 'expected #{this} to not be an instance of ' + name
16092
+ );
16093
+ };
16094
+
16095
+ Assertion.addMethod('instanceof', assertInstanceOf);
16096
+ Assertion.addMethod('instanceOf', assertInstanceOf);
16097
+
16098
+ /**
16099
+ * ### .property(name, [value])
16100
+ *
16101
+ * Asserts that the target has a property `name`, optionally asserting that
16102
+ * the value of that property is strictly equal to `value`.
16103
+ * If the `deep` flag is set, you can use dot- and bracket-notation for deep
16104
+ * references into objects and arrays.
16105
+ *
16106
+ * // simple referencing
16107
+ * var obj = { foo: 'bar' };
16108
+ * expect(obj).to.have.property('foo');
16109
+ * expect(obj).to.have.property('foo', 'bar');
16110
+ *
16111
+ * // deep referencing
16112
+ * var deepObj = {
16113
+ * green: { tea: 'matcha' }
16114
+ * , teas: [ 'chai', 'matcha', { tea: 'konacha' } ]
16115
+ * };
16116
+
16117
+ * expect(deepObj).to.have.deep.property('green.tea', 'matcha');
16118
+ * expect(deepObj).to.have.deep.property('teas[1]', 'matcha');
16119
+ * expect(deepObj).to.have.deep.property('teas[2].tea', 'konacha');
16120
+ *
16121
+ * You can also use an array as the starting point of a `deep.property`
16122
+ * assertion, or traverse nested arrays.
16123
+ *
16124
+ * var arr = [
16125
+ * [ 'chai', 'matcha', 'konacha' ]
16126
+ * , [ { tea: 'chai' }
16127
+ * , { tea: 'matcha' }
16128
+ * , { tea: 'konacha' } ]
16129
+ * ];
16130
+ *
16131
+ * expect(arr).to.have.deep.property('[0][1]', 'matcha');
16132
+ * expect(arr).to.have.deep.property('[1][2].tea', 'konacha');
16133
+ *
16134
+ * Furthermore, `property` changes the subject of the assertion
16135
+ * to be the value of that property from the original object. This
16136
+ * permits for further chainable assertions on that property.
16137
+ *
16138
+ * expect(obj).to.have.property('foo')
16139
+ * .that.is.a('string');
16140
+ * expect(deepObj).to.have.property('green')
16141
+ * .that.is.an('object')
16142
+ * .that.deep.equals({ tea: 'matcha' });
16143
+ * expect(deepObj).to.have.property('teas')
16144
+ * .that.is.an('array')
16145
+ * .with.deep.property('[2]')
16146
+ * .that.deep.equals({ tea: 'konacha' });
16147
+ *
16148
+ * @name property
16149
+ * @alias deep.property
16150
+ * @param {String} name
16151
+ * @param {Mixed} value (optional)
16152
+ * @param {String} message _optional_
16153
+ * @returns value of property for chaining
16154
+ * @api public
16155
+ */
16156
+
16157
+ Assertion.addMethod('property', function (name, val, msg) {
16158
+ if (msg) flag(this, 'message', msg);
16159
+
16160
+ var descriptor = flag(this, 'deep') ? 'deep property ' : 'property '
16161
+ , negate = flag(this, 'negate')
16162
+ , obj = flag(this, 'object')
16163
+ , value = flag(this, 'deep')
16164
+ ? _.getPathValue(name, obj)
16165
+ : obj[name];
16166
+
16167
+ if (negate && undefined !== val) {
16168
+ if (undefined === value) {
16169
+ msg = (msg != null) ? msg + ': ' : '';
16170
+ throw new Error(msg + _.inspect(obj) + ' has no ' + descriptor + _.inspect(name));
16171
+ }
16172
+ } else {
16173
+ this.assert(
16174
+ undefined !== value
16175
+ , 'expected #{this} to have a ' + descriptor + _.inspect(name)
16176
+ , 'expected #{this} to not have ' + descriptor + _.inspect(name));
16177
+ }
16178
+
16179
+ if (undefined !== val) {
16180
+ this.assert(
16181
+ val === value
16182
+ , 'expected #{this} to have a ' + descriptor + _.inspect(name) + ' of #{exp}, but got #{act}'
16183
+ , 'expected #{this} to not have a ' + descriptor + _.inspect(name) + ' of #{act}'
16184
+ , val
16185
+ , value
16186
+ );
16187
+ }
16188
+
16189
+ flag(this, 'object', value);
16190
+ });
16191
+
16192
+
16193
+ /**
16194
+ * ### .ownProperty(name)
16195
+ *
16196
+ * Asserts that the target has an own property `name`.
16197
+ *
16198
+ * expect('test').to.have.ownProperty('length');
16199
+ *
16200
+ * @name ownProperty
16201
+ * @alias haveOwnProperty
16202
+ * @param {String} name
16203
+ * @param {String} message _optional_
16204
+ * @api public
16205
+ */
16206
+
16207
+ function assertOwnProperty (name, msg) {
16208
+ if (msg) flag(this, 'message', msg);
16209
+ var obj = flag(this, 'object');
16210
+ this.assert(
16211
+ obj.hasOwnProperty(name)
16212
+ , 'expected #{this} to have own property ' + _.inspect(name)
16213
+ , 'expected #{this} to not have own property ' + _.inspect(name)
16214
+ );
16215
+ }
16216
+
16217
+ Assertion.addMethod('ownProperty', assertOwnProperty);
16218
+ Assertion.addMethod('haveOwnProperty', assertOwnProperty);
16219
+
16220
+ /**
16221
+ * ### .length(value)
16222
+ *
16223
+ * Asserts that the target's `length` property has
16224
+ * the expected value.
16225
+ *
16226
+ * expect([ 1, 2, 3]).to.have.length(3);
16227
+ * expect('foobar').to.have.length(6);
16228
+ *
16229
+ * Can also be used as a chain precursor to a value
16230
+ * comparison for the length property.
16231
+ *
16232
+ * expect('foo').to.have.length.above(2);
16233
+ * expect([ 1, 2, 3 ]).to.have.length.above(2);
16234
+ * expect('foo').to.have.length.below(4);
16235
+ * expect([ 1, 2, 3 ]).to.have.length.below(4);
16236
+ * expect('foo').to.have.length.within(2,4);
16237
+ * expect([ 1, 2, 3 ]).to.have.length.within(2,4);
16238
+ *
16239
+ * @name length
16240
+ * @alias lengthOf
16241
+ * @param {Number} length
16242
+ * @param {String} message _optional_
16243
+ * @api public
16244
+ */
16245
+
16246
+ function assertLengthChain () {
16247
+ flag(this, 'doLength', true);
16248
+ }
16249
+
16250
+ function assertLength (n, msg) {
16251
+ if (msg) flag(this, 'message', msg);
16252
+ var obj = flag(this, 'object');
16253
+ new Assertion(obj, msg).to.have.property('length');
16254
+ var len = obj.length;
16255
+
16256
+ this.assert(
16257
+ len == n
16258
+ , 'expected #{this} to have a length of #{exp} but got #{act}'
16259
+ , 'expected #{this} to not have a length of #{act}'
16260
+ , n
16261
+ , len
16262
+ );
16263
+ }
16264
+
16265
+ Assertion.addChainableMethod('length', assertLength, assertLengthChain);
16266
+ Assertion.addMethod('lengthOf', assertLength, assertLengthChain);
16267
+
16268
+ /**
16269
+ * ### .match(regexp)
16270
+ *
16271
+ * Asserts that the target matches a regular expression.
16272
+ *
16273
+ * expect('foobar').to.match(/^foo/);
16274
+ *
16275
+ * @name match
16276
+ * @param {RegExp} RegularExpression
16277
+ * @param {String} message _optional_
16278
+ * @api public
16279
+ */
16280
+
16281
+ Assertion.addMethod('match', function (re, msg) {
16282
+ if (msg) flag(this, 'message', msg);
16283
+ var obj = flag(this, 'object');
16284
+ this.assert(
16285
+ re.exec(obj)
16286
+ , 'expected #{this} to match ' + re
16287
+ , 'expected #{this} not to match ' + re
16288
+ );
16289
+ });
16290
+
16291
+ /**
16292
+ * ### .string(string)
16293
+ *
16294
+ * Asserts that the string target contains another string.
16295
+ *
16296
+ * expect('foobar').to.have.string('bar');
16297
+ *
16298
+ * @name string
16299
+ * @param {String} string
16300
+ * @param {String} message _optional_
16301
+ * @api public
16302
+ */
16303
+
16304
+ Assertion.addMethod('string', function (str, msg) {
16305
+ if (msg) flag(this, 'message', msg);
16306
+ var obj = flag(this, 'object');
16307
+ new Assertion(obj, msg).is.a('string');
16308
+
16309
+ this.assert(
16310
+ ~obj.indexOf(str)
16311
+ , 'expected #{this} to contain ' + _.inspect(str)
16312
+ , 'expected #{this} to not contain ' + _.inspect(str)
16313
+ );
16314
+ });
16315
+
16316
+
16317
+ /**
16318
+ * ### .keys(key1, [key2], [...])
16319
+ *
16320
+ * Asserts that the target has exactly the given keys, or
16321
+ * asserts the inclusion of some keys when using the
16322
+ * `include` or `contain` modifiers.
16323
+ *
16324
+ * expect({ foo: 1, bar: 2 }).to.have.keys(['foo', 'bar']);
16325
+ * expect({ foo: 1, bar: 2, baz: 3 }).to.contain.keys('foo', 'bar');
16326
+ *
16327
+ * @name keys
16328
+ * @alias key
16329
+ * @param {String...|Array} keys
16330
+ * @api public
16331
+ */
16332
+
16333
+ function assertKeys (keys) {
16334
+ var obj = flag(this, 'object')
16335
+ , str
16336
+ , ok = true;
16337
+
16338
+ keys = keys instanceof Array
16339
+ ? keys
16340
+ : Array.prototype.slice.call(arguments);
16341
+
16342
+ if (!keys.length) throw new Error('keys required');
16343
+
16344
+ var actual = Object.keys(obj)
16345
+ , len = keys.length;
16346
+
16347
+ // Inclusion
16348
+ ok = keys.every(function(key){
16349
+ return ~actual.indexOf(key);
16350
+ });
16351
+
16352
+ // Strict
16353
+ if (!flag(this, 'negate') && !flag(this, 'contains')) {
16354
+ ok = ok && keys.length == actual.length;
16355
+ }
16356
+
16357
+ // Key string
16358
+ if (len > 1) {
16359
+ keys = keys.map(function(key){
16360
+ return _.inspect(key);
16361
+ });
16362
+ var last = keys.pop();
16363
+ str = keys.join(', ') + ', and ' + last;
16364
+ } else {
16365
+ str = _.inspect(keys[0]);
16366
+ }
16367
+
16368
+ // Form
16369
+ str = (len > 1 ? 'keys ' : 'key ') + str;
16370
+
16371
+ // Have / include
16372
+ str = (flag(this, 'contains') ? 'contain ' : 'have ') + str;
16373
+
16374
+ // Assertion
16375
+ this.assert(
16376
+ ok
16377
+ , 'expected #{this} to ' + str
16378
+ , 'expected #{this} to not ' + str
16379
+ );
16380
+ }
16381
+
16382
+ Assertion.addMethod('keys', assertKeys);
16383
+ Assertion.addMethod('key', assertKeys);
16384
+
16385
+ /**
16386
+ * ### .throw(constructor)
16387
+ *
16388
+ * Asserts that the function target will throw a specific error, or specific type of error
16389
+ * (as determined using `instanceof`), optionally with a RegExp or string inclusion test
16390
+ * for the error's message.
16391
+ *
16392
+ * var err = new ReferenceError('This is a bad function.');
16393
+ * var fn = function () { throw err; }
16394
+ * expect(fn).to.throw(ReferenceError);
16395
+ * expect(fn).to.throw(Error);
16396
+ * expect(fn).to.throw(/bad function/);
16397
+ * expect(fn).to.not.throw('good function');
16398
+ * expect(fn).to.throw(ReferenceError, /bad function/);
16399
+ * expect(fn).to.throw(err);
16400
+ * expect(fn).to.not.throw(new RangeError('Out of range.'));
16401
+ *
16402
+ * Please note that when a throw expectation is negated, it will check each
16403
+ * parameter independently, starting with error constructor type. The appropriate way
16404
+ * to check for the existence of a type of error but for a message that does not match
16405
+ * is to use `and`.
16406
+ *
16407
+ * expect(fn).to.throw(ReferenceError)
16408
+ * .and.not.throw(/good function/);
16409
+ *
16410
+ * @name throw
16411
+ * @alias throws
16412
+ * @alias Throw
16413
+ * @param {ErrorConstructor} constructor
16414
+ * @param {String|RegExp} expected error message
16415
+ * @param {String} message _optional_
16416
+ * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types
16417
+ * @api public
16418
+ */
16419
+
16420
+ function assertThrows (constructor, errMsg, msg) {
16421
+ if (msg) flag(this, 'message', msg);
16422
+ var obj = flag(this, 'object');
16423
+ new Assertion(obj, msg).is.a('function');
16424
+
16425
+ var thrown = false
16426
+ , desiredError = null
16427
+ , name = null
16428
+ , thrownError = null;
16429
+
16430
+ if (arguments.length === 0) {
16431
+ errMsg = null;
16432
+ constructor = null;
16433
+ } else if (constructor && (constructor instanceof RegExp || 'string' === typeof constructor)) {
16434
+ errMsg = constructor;
16435
+ constructor = null;
16436
+ } else if (constructor && constructor instanceof Error) {
16437
+ desiredError = constructor;
16438
+ constructor = null;
16439
+ errMsg = null;
16440
+ } else if (typeof constructor === 'function') {
16441
+ name = (new constructor()).name;
16442
+ } else {
16443
+ constructor = null;
16444
+ }
16445
+
16446
+ try {
16447
+ obj();
16448
+ } catch (err) {
16449
+ // first, check desired error
16450
+ if (desiredError) {
16451
+ this.assert(
16452
+ err === desiredError
16453
+ , 'expected #{this} to throw #{exp} but #{act} was thrown'
16454
+ , 'expected #{this} to not throw #{exp}'
16455
+ , desiredError
16456
+ , err
16457
+ );
16458
+
16459
+ return this;
16460
+ }
16461
+ // next, check constructor
16462
+ if (constructor) {
16463
+ this.assert(
16464
+ err instanceof constructor
16465
+ , 'expected #{this} to throw #{exp} but #{act} was thrown'
16466
+ , 'expected #{this} to not throw #{exp} but #{act} was thrown'
16467
+ , name
16468
+ , err
16469
+ );
16470
+
16471
+ if (!errMsg) return this;
16472
+ }
16473
+ // next, check message
16474
+ var message = 'object' === _.type(err) && "message" in err
16475
+ ? err.message
16476
+ : '' + err;
16477
+
16478
+ if ((message != null) && errMsg && errMsg instanceof RegExp) {
16479
+ this.assert(
16480
+ errMsg.exec(message)
16481
+ , 'expected #{this} to throw error matching #{exp} but got #{act}'
16482
+ , 'expected #{this} to throw error not matching #{exp}'
16483
+ , errMsg
16484
+ , message
16485
+ );
16486
+
16487
+ return this;
16488
+ } else if ((message != null) && errMsg && 'string' === typeof errMsg) {
16489
+ this.assert(
16490
+ ~message.indexOf(errMsg)
16491
+ , 'expected #{this} to throw error including #{exp} but got #{act}'
16492
+ , 'expected #{this} to throw error not including #{act}'
16493
+ , errMsg
16494
+ , message
16495
+ );
16496
+
16497
+ return this;
16498
+ } else {
16499
+ thrown = true;
16500
+ thrownError = err;
16501
+ }
16502
+ }
16503
+
16504
+ var actuallyGot = ''
16505
+ , expectedThrown = name !== null
16506
+ ? name
16507
+ : desiredError
16508
+ ? '#{exp}' //_.inspect(desiredError)
16509
+ : 'an error';
16510
+
16511
+ if (thrown) {
16512
+ actuallyGot = ' but #{act} was thrown'
16513
+ }
16514
+
16515
+ this.assert(
16516
+ thrown === true
16517
+ , 'expected #{this} to throw ' + expectedThrown + actuallyGot
16518
+ , 'expected #{this} to not throw ' + expectedThrown + actuallyGot
16519
+ , desiredError
16520
+ , thrownError
16521
+ );
16522
+ };
16523
+
16524
+ Assertion.addMethod('throw', assertThrows);
16525
+ Assertion.addMethod('throws', assertThrows);
16526
+ Assertion.addMethod('Throw', assertThrows);
16527
+
16528
+ /**
16529
+ * ### .respondTo(method)
16530
+ *
16531
+ * Asserts that the object or class target will respond to a method.
16532
+ *
16533
+ * Klass.prototype.bar = function(){};
16534
+ * expect(Klass).to.respondTo('bar');
16535
+ * expect(obj).to.respondTo('bar');
16536
+ *
16537
+ * To check if a constructor will respond to a static function,
16538
+ * set the `itself` flag.
16539
+ *
16540
+ * Klass.baz = function(){};
16541
+ * expect(Klass).itself.to.respondTo('baz');
16542
+ *
16543
+ * @name respondTo
16544
+ * @param {String} method
16545
+ * @param {String} message _optional_
16546
+ * @api public
16547
+ */
16548
+
16549
+ Assertion.addMethod('respondTo', function (method, msg) {
16550
+ if (msg) flag(this, 'message', msg);
16551
+ var obj = flag(this, 'object')
16552
+ , itself = flag(this, 'itself')
16553
+ , context = ('function' === _.type(obj) && !itself)
16554
+ ? obj.prototype[method]
16555
+ : obj[method];
16556
+
16557
+ this.assert(
16558
+ 'function' === typeof context
16559
+ , 'expected #{this} to respond to ' + _.inspect(method)
16560
+ , 'expected #{this} to not respond to ' + _.inspect(method)
16561
+ );
16562
+ });
16563
+
16564
+ /**
16565
+ * ### .itself
16566
+ *
16567
+ * Sets the `itself` flag, later used by the `respondTo` assertion.
16568
+ *
16569
+ * function Foo() {}
16570
+ * Foo.bar = function() {}
16571
+ * Foo.prototype.baz = function() {}
16572
+ *
16573
+ * expect(Foo).itself.to.respondTo('bar');
16574
+ * expect(Foo).itself.not.to.respondTo('baz');
16575
+ *
16576
+ * @name itself
16577
+ * @api public
16578
+ */
16579
+
16580
+ Assertion.addProperty('itself', function () {
16581
+ flag(this, 'itself', true);
16582
+ });
16583
+
16584
+ /**
16585
+ * ### .satisfy(method)
16586
+ *
16587
+ * Asserts that the target passes a given truth test.
16588
+ *
16589
+ * expect(1).to.satisfy(function(num) { return num > 0; });
16590
+ *
16591
+ * @name satisfy
16592
+ * @param {Function} matcher
16593
+ * @param {String} message _optional_
16594
+ * @api public
16595
+ */
16596
+
16597
+ Assertion.addMethod('satisfy', function (matcher, msg) {
16598
+ if (msg) flag(this, 'message', msg);
16599
+ var obj = flag(this, 'object');
16600
+ this.assert(
16601
+ matcher(obj)
16602
+ , 'expected #{this} to satisfy ' + _.objDisplay(matcher)
16603
+ , 'expected #{this} to not satisfy' + _.objDisplay(matcher)
16604
+ , this.negate ? false : true
16605
+ , matcher(obj)
16606
+ );
16607
+ });
16608
+
16609
+ /**
16610
+ * ### .closeTo(expected, delta)
16611
+ *
16612
+ * Asserts that the target is equal `expected`, to within a +/- `delta` range.
16613
+ *
16614
+ * expect(1.5).to.be.closeTo(1, 0.5);
16615
+ *
16616
+ * @name closeTo
16617
+ * @param {Number} expected
16618
+ * @param {Number} delta
16619
+ * @param {String} message _optional_
16620
+ * @api public
16621
+ */
16622
+
16623
+ Assertion.addMethod('closeTo', function (expected, delta, msg) {
16624
+ if (msg) flag(this, 'message', msg);
16625
+ var obj = flag(this, 'object');
16626
+ this.assert(
16627
+ Math.abs(obj - expected) <= delta
16628
+ , 'expected #{this} to be close to ' + expected + ' +/- ' + delta
16629
+ , 'expected #{this} not to be close to ' + expected + ' +/- ' + delta
16630
+ );
16631
+ });
16632
+
16633
+ function isSubsetOf(subset, superset) {
16634
+ return subset.every(function(elem) {
16635
+ return superset.indexOf(elem) !== -1;
16636
+ })
16637
+ }
16638
+
16639
+ /**
16640
+ * ### .members(set)
16641
+ *
16642
+ * Asserts that the target is a superset of `set`,
16643
+ * or that the target and `set` have the same members.
16644
+ *
16645
+ * expect([1, 2, 3]).to.include.members([3, 2]);
16646
+ * expect([1, 2, 3]).to.not.include.members([3, 2, 8]);
16647
+ *
16648
+ * expect([4, 2]).to.have.members([2, 4]);
16649
+ * expect([5, 2]).to.not.have.members([5, 2, 1]);
16650
+ *
16651
+ * @name members
16652
+ * @param {Array} set
16653
+ * @param {String} message _optional_
16654
+ * @api public
16655
+ */
16656
+
16657
+ Assertion.addMethod('members', function (subset, msg) {
16658
+ if (msg) flag(this, 'message', msg);
16659
+ var obj = flag(this, 'object');
16660
+
16661
+ new Assertion(obj).to.be.an('array');
16662
+ new Assertion(subset).to.be.an('array');
16663
+
16664
+ if (flag(this, 'contains')) {
16665
+ return this.assert(
16666
+ isSubsetOf(subset, obj)
16667
+ , 'expected #{this} to be a superset of #{act}'
16668
+ , 'expected #{this} to not be a superset of #{act}'
16669
+ , obj
16670
+ , subset
16671
+ );
16672
+ }
16673
+
16674
+ this.assert(
16675
+ isSubsetOf(obj, subset) && isSubsetOf(subset, obj)
16676
+ , 'expected #{this} to have the same members as #{act}'
16677
+ , 'expected #{this} to not have the same members as #{act}'
16678
+ , obj
16679
+ , subset
16680
+ );
16681
+ });
16682
+ };
16683
+
16684
+ });
16685
+ require.register("chaijs-chai/lib/chai/interface/assert.js", function(exports, require, module){
16686
+ /*!
16687
+ * chai
16688
+ * Copyright(c) 2011-2013 Jake Luer <jake@alogicalparadox.com>
16689
+ * MIT Licensed
16690
+ */
16691
+
16692
+
16693
+ module.exports = function (chai, util) {
16694
+
16695
+ /*!
16696
+ * Chai dependencies.
16697
+ */
16698
+
16699
+ var Assertion = chai.Assertion
16700
+ , flag = util.flag;
16701
+
16702
+ /*!
16703
+ * Module export.
16704
+ */
16705
+
16706
+ /**
16707
+ * ### assert(expression, message)
16708
+ *
16709
+ * Write your own test expressions.
16710
+ *
16711
+ * assert('foo' !== 'bar', 'foo is not bar');
16712
+ * assert(Array.isArray([]), 'empty arrays are arrays');
16713
+ *
16714
+ * @param {Mixed} expression to test for truthiness
16715
+ * @param {String} message to display on error
16716
+ * @name assert
16717
+ * @api public
16718
+ */
16719
+
16720
+ var assert = chai.assert = function (express, errmsg) {
16721
+ var test = new Assertion(null);
16722
+ test.assert(
16723
+ express
16724
+ , errmsg
16725
+ , '[ negation message unavailable ]'
16726
+ );
16727
+ };
16728
+
16729
+ /**
16730
+ * ### .fail(actual, expected, [message], [operator])
16731
+ *
16732
+ * Throw a failure. Node.js `assert` module-compatible.
16733
+ *
16734
+ * @name fail
16735
+ * @param {Mixed} actual
16736
+ * @param {Mixed} expected
16737
+ * @param {String} message
16738
+ * @param {String} operator
16739
+ * @api public
16740
+ */
16741
+
16742
+ assert.fail = function (actual, expected, message, operator) {
16743
+ throw new chai.AssertionError({
16744
+ actual: actual
16745
+ , expected: expected
16746
+ , message: message
16747
+ , operator: operator
16748
+ , stackStartFunction: assert.fail
16749
+ });
16750
+ };
16751
+
16752
+ /**
16753
+ * ### .ok(object, [message])
16754
+ *
16755
+ * Asserts that `object` is truthy.
16756
+ *
16757
+ * assert.ok('everything', 'everything is ok');
16758
+ * assert.ok(false, 'this will fail');
16759
+ *
16760
+ * @name ok
16761
+ * @param {Mixed} object to test
16762
+ * @param {String} message
16763
+ * @api public
16764
+ */
16765
+
16766
+ assert.ok = function (val, msg) {
16767
+ new Assertion(val, msg).is.ok;
16768
+ };
16769
+
16770
+ /**
16771
+ * ### .notOk(object, [message])
16772
+ *
16773
+ * Asserts that `object` is falsy.
16774
+ *
16775
+ * assert.notOk('everything', 'this will fail');
16776
+ * assert.notOk(false, 'this will pass');
16777
+ *
16778
+ * @name notOk
16779
+ * @param {Mixed} object to test
16780
+ * @param {String} message
16781
+ * @api public
16782
+ */
16783
+
16784
+ assert.notOk = function (val, msg) {
16785
+ new Assertion(val, msg).is.not.ok;
16786
+ };
16787
+
16788
+ /**
16789
+ * ### .equal(actual, expected, [message])
16790
+ *
16791
+ * Asserts non-strict equality (`==`) of `actual` and `expected`.
16792
+ *
16793
+ * assert.equal(3, '3', '== coerces values to strings');
16794
+ *
16795
+ * @name equal
16796
+ * @param {Mixed} actual
16797
+ * @param {Mixed} expected
16798
+ * @param {String} message
16799
+ * @api public
16800
+ */
16801
+
16802
+ assert.equal = function (act, exp, msg) {
16803
+ var test = new Assertion(act, msg);
16804
+
16805
+ test.assert(
16806
+ exp == flag(test, 'object')
16807
+ , 'expected #{this} to equal #{exp}'
16808
+ , 'expected #{this} to not equal #{act}'
16809
+ , exp
16810
+ , act
16811
+ );
16812
+ };
16813
+
16814
+ /**
16815
+ * ### .notEqual(actual, expected, [message])
16816
+ *
16817
+ * Asserts non-strict inequality (`!=`) of `actual` and `expected`.
16818
+ *
16819
+ * assert.notEqual(3, 4, 'these numbers are not equal');
16820
+ *
16821
+ * @name notEqual
16822
+ * @param {Mixed} actual
16823
+ * @param {Mixed} expected
16824
+ * @param {String} message
16825
+ * @api public
16826
+ */
16827
+
16828
+ assert.notEqual = function (act, exp, msg) {
16829
+ var test = new Assertion(act, msg);
16830
+
16831
+ test.assert(
16832
+ exp != flag(test, 'object')
16833
+ , 'expected #{this} to not equal #{exp}'
16834
+ , 'expected #{this} to equal #{act}'
16835
+ , exp
16836
+ , act
16837
+ );
16838
+ };
16839
+
16840
+ /**
16841
+ * ### .strictEqual(actual, expected, [message])
16842
+ *
16843
+ * Asserts strict equality (`===`) of `actual` and `expected`.
16844
+ *
16845
+ * assert.strictEqual(true, true, 'these booleans are strictly equal');
16846
+ *
16847
+ * @name strictEqual
16848
+ * @param {Mixed} actual
16849
+ * @param {Mixed} expected
16850
+ * @param {String} message
16851
+ * @api public
16852
+ */
16853
+
16854
+ assert.strictEqual = function (act, exp, msg) {
16855
+ new Assertion(act, msg).to.equal(exp);
16856
+ };
16857
+
16858
+ /**
16859
+ * ### .notStrictEqual(actual, expected, [message])
16860
+ *
16861
+ * Asserts strict inequality (`!==`) of `actual` and `expected`.
16862
+ *
16863
+ * assert.notStrictEqual(3, '3', 'no coercion for strict equality');
16864
+ *
16865
+ * @name notStrictEqual
16866
+ * @param {Mixed} actual
16867
+ * @param {Mixed} expected
16868
+ * @param {String} message
16869
+ * @api public
16870
+ */
16871
+
16872
+ assert.notStrictEqual = function (act, exp, msg) {
16873
+ new Assertion(act, msg).to.not.equal(exp);
16874
+ };
16875
+
16876
+ /**
16877
+ * ### .deepEqual(actual, expected, [message])
16878
+ *
16879
+ * Asserts that `actual` is deeply equal to `expected`.
16880
+ *
16881
+ * assert.deepEqual({ tea: 'green' }, { tea: 'green' });
16882
+ *
16883
+ * @name deepEqual
16884
+ * @param {Mixed} actual
16885
+ * @param {Mixed} expected
16886
+ * @param {String} message
16887
+ * @api public
16888
+ */
16889
+
16890
+ assert.deepEqual = function (act, exp, msg) {
16891
+ new Assertion(act, msg).to.eql(exp);
16892
+ };
16893
+
16894
+ /**
16895
+ * ### .notDeepEqual(actual, expected, [message])
16896
+ *
16897
+ * Assert that `actual` is not deeply equal to `expected`.
16898
+ *
16899
+ * assert.notDeepEqual({ tea: 'green' }, { tea: 'jasmine' });
16900
+ *
16901
+ * @name notDeepEqual
16902
+ * @param {Mixed} actual
16903
+ * @param {Mixed} expected
16904
+ * @param {String} message
16905
+ * @api public
16906
+ */
16907
+
16908
+ assert.notDeepEqual = function (act, exp, msg) {
16909
+ new Assertion(act, msg).to.not.eql(exp);
16910
+ };
16911
+
16912
+ /**
16913
+ * ### .isTrue(value, [message])
16914
+ *
16915
+ * Asserts that `value` is true.
16916
+ *
16917
+ * var teaServed = true;
16918
+ * assert.isTrue(teaServed, 'the tea has been served');
16919
+ *
16920
+ * @name isTrue
16921
+ * @param {Mixed} value
16922
+ * @param {String} message
16923
+ * @api public
16924
+ */
16925
+
16926
+ assert.isTrue = function (val, msg) {
16927
+ new Assertion(val, msg).is['true'];
16928
+ };
16929
+
16930
+ /**
16931
+ * ### .isFalse(value, [message])
16932
+ *
16933
+ * Asserts that `value` is false.
16934
+ *
16935
+ * var teaServed = false;
16936
+ * assert.isFalse(teaServed, 'no tea yet? hmm...');
16937
+ *
16938
+ * @name isFalse
16939
+ * @param {Mixed} value
16940
+ * @param {String} message
16941
+ * @api public
16942
+ */
16943
+
16944
+ assert.isFalse = function (val, msg) {
16945
+ new Assertion(val, msg).is['false'];
16946
+ };
16947
+
16948
+ /**
16949
+ * ### .isNull(value, [message])
16950
+ *
16951
+ * Asserts that `value` is null.
16952
+ *
16953
+ * assert.isNull(err, 'there was no error');
16954
+ *
16955
+ * @name isNull
16956
+ * @param {Mixed} value
16957
+ * @param {String} message
16958
+ * @api public
16959
+ */
16960
+
16961
+ assert.isNull = function (val, msg) {
16962
+ new Assertion(val, msg).to.equal(null);
16963
+ };
16964
+
16965
+ /**
16966
+ * ### .isNotNull(value, [message])
16967
+ *
16968
+ * Asserts that `value` is not null.
16969
+ *
16970
+ * var tea = 'tasty chai';
16971
+ * assert.isNotNull(tea, 'great, time for tea!');
16972
+ *
16973
+ * @name isNotNull
16974
+ * @param {Mixed} value
16975
+ * @param {String} message
16976
+ * @api public
16977
+ */
16978
+
16979
+ assert.isNotNull = function (val, msg) {
16980
+ new Assertion(val, msg).to.not.equal(null);
16981
+ };
16982
+
16983
+ /**
16984
+ * ### .isUndefined(value, [message])
16985
+ *
16986
+ * Asserts that `value` is `undefined`.
16987
+ *
16988
+ * var tea;
16989
+ * assert.isUndefined(tea, 'no tea defined');
16990
+ *
16991
+ * @name isUndefined
16992
+ * @param {Mixed} value
16993
+ * @param {String} message
16994
+ * @api public
16995
+ */
16996
+
16997
+ assert.isUndefined = function (val, msg) {
16998
+ new Assertion(val, msg).to.equal(undefined);
16999
+ };
17000
+
17001
+ /**
17002
+ * ### .isDefined(value, [message])
17003
+ *
17004
+ * Asserts that `value` is not `undefined`.
17005
+ *
17006
+ * var tea = 'cup of chai';
17007
+ * assert.isDefined(tea, 'tea has been defined');
17008
+ *
17009
+ * @name isDefined
17010
+ * @param {Mixed} value
17011
+ * @param {String} message
17012
+ * @api public
17013
+ */
17014
+
17015
+ assert.isDefined = function (val, msg) {
17016
+ new Assertion(val, msg).to.not.equal(undefined);
17017
+ };
17018
+
17019
+ /**
17020
+ * ### .isFunction(value, [message])
17021
+ *
17022
+ * Asserts that `value` is a function.
17023
+ *
17024
+ * function serveTea() { return 'cup of tea'; };
17025
+ * assert.isFunction(serveTea, 'great, we can have tea now');
17026
+ *
17027
+ * @name isFunction
17028
+ * @param {Mixed} value
17029
+ * @param {String} message
17030
+ * @api public
17031
+ */
17032
+
17033
+ assert.isFunction = function (val, msg) {
17034
+ new Assertion(val, msg).to.be.a('function');
17035
+ };
17036
+
17037
+ /**
17038
+ * ### .isNotFunction(value, [message])
17039
+ *
17040
+ * Asserts that `value` is _not_ a function.
17041
+ *
17042
+ * var serveTea = [ 'heat', 'pour', 'sip' ];
17043
+ * assert.isNotFunction(serveTea, 'great, we have listed the steps');
17044
+ *
17045
+ * @name isNotFunction
17046
+ * @param {Mixed} value
17047
+ * @param {String} message
17048
+ * @api public
17049
+ */
17050
+
17051
+ assert.isNotFunction = function (val, msg) {
17052
+ new Assertion(val, msg).to.not.be.a('function');
17053
+ };
17054
+
17055
+ /**
17056
+ * ### .isObject(value, [message])
17057
+ *
17058
+ * Asserts that `value` is an object (as revealed by
17059
+ * `Object.prototype.toString`).
17060
+ *
17061
+ * var selection = { name: 'Chai', serve: 'with spices' };
17062
+ * assert.isObject(selection, 'tea selection is an object');
17063
+ *
17064
+ * @name isObject
17065
+ * @param {Mixed} value
17066
+ * @param {String} message
17067
+ * @api public
17068
+ */
17069
+
17070
+ assert.isObject = function (val, msg) {
17071
+ new Assertion(val, msg).to.be.a('object');
17072
+ };
17073
+
17074
+ /**
17075
+ * ### .isNotObject(value, [message])
17076
+ *
17077
+ * Asserts that `value` is _not_ an object.
17078
+ *
17079
+ * var selection = 'chai'
17080
+ * assert.isObject(selection, 'tea selection is not an object');
17081
+ * assert.isObject(null, 'null is not an object');
17082
+ *
17083
+ * @name isNotObject
17084
+ * @param {Mixed} value
17085
+ * @param {String} message
17086
+ * @api public
17087
+ */
17088
+
17089
+ assert.isNotObject = function (val, msg) {
17090
+ new Assertion(val, msg).to.not.be.a('object');
17091
+ };
17092
+
17093
+ /**
17094
+ * ### .isArray(value, [message])
17095
+ *
17096
+ * Asserts that `value` is an array.
17097
+ *
17098
+ * var menu = [ 'green', 'chai', 'oolong' ];
17099
+ * assert.isArray(menu, 'what kind of tea do we want?');
17100
+ *
17101
+ * @name isArray
17102
+ * @param {Mixed} value
17103
+ * @param {String} message
17104
+ * @api public
17105
+ */
17106
+
17107
+ assert.isArray = function (val, msg) {
17108
+ new Assertion(val, msg).to.be.an('array');
17109
+ };
17110
+
17111
+ /**
17112
+ * ### .isNotArray(value, [message])
17113
+ *
17114
+ * Asserts that `value` is _not_ an array.
17115
+ *
17116
+ * var menu = 'green|chai|oolong';
17117
+ * assert.isNotArray(menu, 'what kind of tea do we want?');
17118
+ *
17119
+ * @name isNotArray
17120
+ * @param {Mixed} value
17121
+ * @param {String} message
17122
+ * @api public
17123
+ */
17124
+
17125
+ assert.isNotArray = function (val, msg) {
17126
+ new Assertion(val, msg).to.not.be.an('array');
17127
+ };
17128
+
17129
+ /**
17130
+ * ### .isString(value, [message])
17131
+ *
17132
+ * Asserts that `value` is a string.
17133
+ *
17134
+ * var teaOrder = 'chai';
17135
+ * assert.isString(teaOrder, 'order placed');
17136
+ *
17137
+ * @name isString
17138
+ * @param {Mixed} value
17139
+ * @param {String} message
17140
+ * @api public
17141
+ */
17142
+
17143
+ assert.isString = function (val, msg) {
17144
+ new Assertion(val, msg).to.be.a('string');
17145
+ };
17146
+
17147
+ /**
17148
+ * ### .isNotString(value, [message])
17149
+ *
17150
+ * Asserts that `value` is _not_ a string.
17151
+ *
17152
+ * var teaOrder = 4;
17153
+ * assert.isNotString(teaOrder, 'order placed');
17154
+ *
17155
+ * @name isNotString
17156
+ * @param {Mixed} value
17157
+ * @param {String} message
17158
+ * @api public
17159
+ */
17160
+
17161
+ assert.isNotString = function (val, msg) {
17162
+ new Assertion(val, msg).to.not.be.a('string');
17163
+ };
17164
+
17165
+ /**
17166
+ * ### .isNumber(value, [message])
17167
+ *
17168
+ * Asserts that `value` is a number.
17169
+ *
17170
+ * var cups = 2;
17171
+ * assert.isNumber(cups, 'how many cups');
17172
+ *
17173
+ * @name isNumber
17174
+ * @param {Number} value
17175
+ * @param {String} message
17176
+ * @api public
17177
+ */
17178
+
17179
+ assert.isNumber = function (val, msg) {
17180
+ new Assertion(val, msg).to.be.a('number');
17181
+ };
17182
+
17183
+ /**
17184
+ * ### .isNotNumber(value, [message])
17185
+ *
17186
+ * Asserts that `value` is _not_ a number.
17187
+ *
17188
+ * var cups = '2 cups please';
17189
+ * assert.isNotNumber(cups, 'how many cups');
17190
+ *
17191
+ * @name isNotNumber
17192
+ * @param {Mixed} value
17193
+ * @param {String} message
17194
+ * @api public
17195
+ */
17196
+
17197
+ assert.isNotNumber = function (val, msg) {
17198
+ new Assertion(val, msg).to.not.be.a('number');
17199
+ };
17200
+
17201
+ /**
17202
+ * ### .isBoolean(value, [message])
17203
+ *
17204
+ * Asserts that `value` is a boolean.
17205
+ *
17206
+ * var teaReady = true
17207
+ * , teaServed = false;
17208
+ *
17209
+ * assert.isBoolean(teaReady, 'is the tea ready');
17210
+ * assert.isBoolean(teaServed, 'has tea been served');
17211
+ *
17212
+ * @name isBoolean
17213
+ * @param {Mixed} value
17214
+ * @param {String} message
17215
+ * @api public
17216
+ */
17217
+
17218
+ assert.isBoolean = function (val, msg) {
17219
+ new Assertion(val, msg).to.be.a('boolean');
17220
+ };
17221
+
17222
+ /**
17223
+ * ### .isNotBoolean(value, [message])
17224
+ *
17225
+ * Asserts that `value` is _not_ a boolean.
17226
+ *
17227
+ * var teaReady = 'yep'
17228
+ * , teaServed = 'nope';
17229
+ *
17230
+ * assert.isNotBoolean(teaReady, 'is the tea ready');
17231
+ * assert.isNotBoolean(teaServed, 'has tea been served');
17232
+ *
17233
+ * @name isNotBoolean
17234
+ * @param {Mixed} value
17235
+ * @param {String} message
17236
+ * @api public
17237
+ */
17238
+
17239
+ assert.isNotBoolean = function (val, msg) {
17240
+ new Assertion(val, msg).to.not.be.a('boolean');
17241
+ };
17242
+
17243
+ /**
17244
+ * ### .typeOf(value, name, [message])
17245
+ *
17246
+ * Asserts that `value`'s type is `name`, as determined by
17247
+ * `Object.prototype.toString`.
17248
+ *
17249
+ * assert.typeOf({ tea: 'chai' }, 'object', 'we have an object');
17250
+ * assert.typeOf(['chai', 'jasmine'], 'array', 'we have an array');
17251
+ * assert.typeOf('tea', 'string', 'we have a string');
17252
+ * assert.typeOf(/tea/, 'regexp', 'we have a regular expression');
17253
+ * assert.typeOf(null, 'null', 'we have a null');
17254
+ * assert.typeOf(undefined, 'undefined', 'we have an undefined');
17255
+ *
17256
+ * @name typeOf
17257
+ * @param {Mixed} value
17258
+ * @param {String} name
17259
+ * @param {String} message
17260
+ * @api public
17261
+ */
17262
+
17263
+ assert.typeOf = function (val, type, msg) {
17264
+ new Assertion(val, msg).to.be.a(type);
17265
+ };
17266
+
17267
+ /**
17268
+ * ### .notTypeOf(value, name, [message])
17269
+ *
17270
+ * Asserts that `value`'s type is _not_ `name`, as determined by
17271
+ * `Object.prototype.toString`.
17272
+ *
17273
+ * assert.notTypeOf('tea', 'number', 'strings are not numbers');
17274
+ *
17275
+ * @name notTypeOf
17276
+ * @param {Mixed} value
17277
+ * @param {String} typeof name
17278
+ * @param {String} message
17279
+ * @api public
17280
+ */
17281
+
17282
+ assert.notTypeOf = function (val, type, msg) {
17283
+ new Assertion(val, msg).to.not.be.a(type);
17284
+ };
17285
+
17286
+ /**
17287
+ * ### .instanceOf(object, constructor, [message])
17288
+ *
17289
+ * Asserts that `value` is an instance of `constructor`.
17290
+ *
17291
+ * var Tea = function (name) { this.name = name; }
17292
+ * , chai = new Tea('chai');
17293
+ *
17294
+ * assert.instanceOf(chai, Tea, 'chai is an instance of tea');
17295
+ *
17296
+ * @name instanceOf
17297
+ * @param {Object} object
17298
+ * @param {Constructor} constructor
17299
+ * @param {String} message
17300
+ * @api public
17301
+ */
17302
+
17303
+ assert.instanceOf = function (val, type, msg) {
17304
+ new Assertion(val, msg).to.be.instanceOf(type);
17305
+ };
17306
+
17307
+ /**
17308
+ * ### .notInstanceOf(object, constructor, [message])
17309
+ *
17310
+ * Asserts `value` is not an instance of `constructor`.
17311
+ *
17312
+ * var Tea = function (name) { this.name = name; }
17313
+ * , chai = new String('chai');
17314
+ *
17315
+ * assert.notInstanceOf(chai, Tea, 'chai is not an instance of tea');
17316
+ *
17317
+ * @name notInstanceOf
17318
+ * @param {Object} object
17319
+ * @param {Constructor} constructor
17320
+ * @param {String} message
17321
+ * @api public
17322
+ */
17323
+
17324
+ assert.notInstanceOf = function (val, type, msg) {
17325
+ new Assertion(val, msg).to.not.be.instanceOf(type);
17326
+ };
17327
+
17328
+ /**
17329
+ * ### .include(haystack, needle, [message])
17330
+ *
17331
+ * Asserts that `haystack` includes `needle`. Works
17332
+ * for strings and arrays.
17333
+ *
17334
+ * assert.include('foobar', 'bar', 'foobar contains string "bar"');
17335
+ * assert.include([ 1, 2, 3 ], 3, 'array contains value');
17336
+ *
17337
+ * @name include
17338
+ * @param {Array|String} haystack
17339
+ * @param {Mixed} needle
17340
+ * @param {String} message
17341
+ * @api public
17342
+ */
17343
+
17344
+ assert.include = function (exp, inc, msg) {
17345
+ var obj = new Assertion(exp, msg);
17346
+
17347
+ if (Array.isArray(exp)) {
17348
+ obj.to.include(inc);
17349
+ } else if ('string' === typeof exp) {
17350
+ obj.to.contain.string(inc);
17351
+ } else {
17352
+ throw new chai.AssertionError(
17353
+ 'expected an array or string'
17354
+ , null
17355
+ , assert.include
17356
+ );
17357
+ }
17358
+ };
17359
+
17360
+ /**
17361
+ * ### .notInclude(haystack, needle, [message])
17362
+ *
17363
+ * Asserts that `haystack` does not include `needle`. Works
17364
+ * for strings and arrays.
17365
+ *i
17366
+ * assert.notInclude('foobar', 'baz', 'string not include substring');
17367
+ * assert.notInclude([ 1, 2, 3 ], 4, 'array not include contain value');
17368
+ *
17369
+ * @name notInclude
17370
+ * @param {Array|String} haystack
17371
+ * @param {Mixed} needle
17372
+ * @param {String} message
17373
+ * @api public
17374
+ */
17375
+
17376
+ assert.notInclude = function (exp, inc, msg) {
17377
+ var obj = new Assertion(exp, msg);
17378
+
17379
+ if (Array.isArray(exp)) {
17380
+ obj.to.not.include(inc);
17381
+ } else if ('string' === typeof exp) {
17382
+ obj.to.not.contain.string(inc);
17383
+ } else {
17384
+ throw new chai.AssertionError(
17385
+ 'expected an array or string'
17386
+ , null
17387
+ , assert.notInclude
17388
+ );
17389
+ }
17390
+ };
17391
+
17392
+ /**
17393
+ * ### .match(value, regexp, [message])
17394
+ *
17395
+ * Asserts that `value` matches the regular expression `regexp`.
17396
+ *
17397
+ * assert.match('foobar', /^foo/, 'regexp matches');
17398
+ *
17399
+ * @name match
17400
+ * @param {Mixed} value
17401
+ * @param {RegExp} regexp
17402
+ * @param {String} message
17403
+ * @api public
17404
+ */
17405
+
17406
+ assert.match = function (exp, re, msg) {
17407
+ new Assertion(exp, msg).to.match(re);
17408
+ };
17409
+
17410
+ /**
17411
+ * ### .notMatch(value, regexp, [message])
17412
+ *
17413
+ * Asserts that `value` does not match the regular expression `regexp`.
17414
+ *
17415
+ * assert.notMatch('foobar', /^foo/, 'regexp does not match');
17416
+ *
17417
+ * @name notMatch
17418
+ * @param {Mixed} value
17419
+ * @param {RegExp} regexp
17420
+ * @param {String} message
17421
+ * @api public
17422
+ */
17423
+
17424
+ assert.notMatch = function (exp, re, msg) {
17425
+ new Assertion(exp, msg).to.not.match(re);
17426
+ };
17427
+
17428
+ /**
17429
+ * ### .property(object, property, [message])
17430
+ *
17431
+ * Asserts that `object` has a property named by `property`.
17432
+ *
17433
+ * assert.property({ tea: { green: 'matcha' }}, 'tea');
17434
+ *
17435
+ * @name property
17436
+ * @param {Object} object
17437
+ * @param {String} property
17438
+ * @param {String} message
17439
+ * @api public
17440
+ */
17441
+
17442
+ assert.property = function (obj, prop, msg) {
17443
+ new Assertion(obj, msg).to.have.property(prop);
17444
+ };
17445
+
17446
+ /**
17447
+ * ### .notProperty(object, property, [message])
17448
+ *
17449
+ * Asserts that `object` does _not_ have a property named by `property`.
17450
+ *
17451
+ * assert.notProperty({ tea: { green: 'matcha' }}, 'coffee');
17452
+ *
17453
+ * @name notProperty
17454
+ * @param {Object} object
17455
+ * @param {String} property
17456
+ * @param {String} message
17457
+ * @api public
17458
+ */
17459
+
17460
+ assert.notProperty = function (obj, prop, msg) {
17461
+ new Assertion(obj, msg).to.not.have.property(prop);
17462
+ };
17463
+
17464
+ /**
17465
+ * ### .deepProperty(object, property, [message])
17466
+ *
17467
+ * Asserts that `object` has a property named by `property`, which can be a
17468
+ * string using dot- and bracket-notation for deep reference.
17469
+ *
17470
+ * assert.deepProperty({ tea: { green: 'matcha' }}, 'tea.green');
17471
+ *
17472
+ * @name deepProperty
17473
+ * @param {Object} object
17474
+ * @param {String} property
17475
+ * @param {String} message
17476
+ * @api public
17477
+ */
17478
+
17479
+ assert.deepProperty = function (obj, prop, msg) {
17480
+ new Assertion(obj, msg).to.have.deep.property(prop);
17481
+ };
17482
+
17483
+ /**
17484
+ * ### .notDeepProperty(object, property, [message])
17485
+ *
17486
+ * Asserts that `object` does _not_ have a property named by `property`, which
17487
+ * can be a string using dot- and bracket-notation for deep reference.
17488
+ *
17489
+ * assert.notDeepProperty({ tea: { green: 'matcha' }}, 'tea.oolong');
17490
+ *
17491
+ * @name notDeepProperty
17492
+ * @param {Object} object
17493
+ * @param {String} property
17494
+ * @param {String} message
17495
+ * @api public
17496
+ */
17497
+
17498
+ assert.notDeepProperty = function (obj, prop, msg) {
17499
+ new Assertion(obj, msg).to.not.have.deep.property(prop);
17500
+ };
17501
+
17502
+ /**
17503
+ * ### .propertyVal(object, property, value, [message])
17504
+ *
17505
+ * Asserts that `object` has a property named by `property` with value given
17506
+ * by `value`.
17507
+ *
17508
+ * assert.propertyVal({ tea: 'is good' }, 'tea', 'is good');
17509
+ *
17510
+ * @name propertyVal
17511
+ * @param {Object} object
17512
+ * @param {String} property
17513
+ * @param {Mixed} value
17514
+ * @param {String} message
17515
+ * @api public
17516
+ */
17517
+
17518
+ assert.propertyVal = function (obj, prop, val, msg) {
17519
+ new Assertion(obj, msg).to.have.property(prop, val);
17520
+ };
17521
+
17522
+ /**
17523
+ * ### .propertyNotVal(object, property, value, [message])
17524
+ *
17525
+ * Asserts that `object` has a property named by `property`, but with a value
17526
+ * different from that given by `value`.
17527
+ *
17528
+ * assert.propertyNotVal({ tea: 'is good' }, 'tea', 'is bad');
17529
+ *
17530
+ * @name propertyNotVal
17531
+ * @param {Object} object
17532
+ * @param {String} property
17533
+ * @param {Mixed} value
17534
+ * @param {String} message
17535
+ * @api public
17536
+ */
17537
+
17538
+ assert.propertyNotVal = function (obj, prop, val, msg) {
17539
+ new Assertion(obj, msg).to.not.have.property(prop, val);
17540
+ };
17541
+
17542
+ /**
17543
+ * ### .deepPropertyVal(object, property, value, [message])
17544
+ *
17545
+ * Asserts that `object` has a property named by `property` with value given
17546
+ * by `value`. `property` can use dot- and bracket-notation for deep
17547
+ * reference.
17548
+ *
17549
+ * assert.deepPropertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'matcha');
17550
+ *
17551
+ * @name deepPropertyVal
17552
+ * @param {Object} object
17553
+ * @param {String} property
17554
+ * @param {Mixed} value
17555
+ * @param {String} message
17556
+ * @api public
17557
+ */
17558
+
17559
+ assert.deepPropertyVal = function (obj, prop, val, msg) {
17560
+ new Assertion(obj, msg).to.have.deep.property(prop, val);
17561
+ };
17562
+
17563
+ /**
17564
+ * ### .deepPropertyNotVal(object, property, value, [message])
17565
+ *
17566
+ * Asserts that `object` has a property named by `property`, but with a value
17567
+ * different from that given by `value`. `property` can use dot- and
17568
+ * bracket-notation for deep reference.
17569
+ *
17570
+ * assert.deepPropertyNotVal({ tea: { green: 'matcha' }}, 'tea.green', 'konacha');
17571
+ *
17572
+ * @name deepPropertyNotVal
17573
+ * @param {Object} object
17574
+ * @param {String} property
17575
+ * @param {Mixed} value
17576
+ * @param {String} message
17577
+ * @api public
17578
+ */
17579
+
17580
+ assert.deepPropertyNotVal = function (obj, prop, val, msg) {
17581
+ new Assertion(obj, msg).to.not.have.deep.property(prop, val);
17582
+ };
17583
+
17584
+ /**
17585
+ * ### .lengthOf(object, length, [message])
17586
+ *
17587
+ * Asserts that `object` has a `length` property with the expected value.
17588
+ *
17589
+ * assert.lengthOf([1,2,3], 3, 'array has length of 3');
17590
+ * assert.lengthOf('foobar', 5, 'string has length of 6');
17591
+ *
17592
+ * @name lengthOf
17593
+ * @param {Mixed} object
17594
+ * @param {Number} length
17595
+ * @param {String} message
17596
+ * @api public
17597
+ */
17598
+
17599
+ assert.lengthOf = function (exp, len, msg) {
17600
+ new Assertion(exp, msg).to.have.length(len);
17601
+ };
17602
+
17603
+ /**
17604
+ * ### .throws(function, [constructor/string/regexp], [string/regexp], [message])
17605
+ *
17606
+ * Asserts that `function` will throw an error that is an instance of
17607
+ * `constructor`, or alternately that it will throw an error with message
17608
+ * matching `regexp`.
17609
+ *
17610
+ * assert.throw(fn, 'function throws a reference error');
17611
+ * assert.throw(fn, /function throws a reference error/);
17612
+ * assert.throw(fn, ReferenceError);
17613
+ * assert.throw(fn, ReferenceError, 'function throws a reference error');
17614
+ * assert.throw(fn, ReferenceError, /function throws a reference error/);
17615
+ *
17616
+ * @name throws
17617
+ * @alias throw
17618
+ * @alias Throw
17619
+ * @param {Function} function
17620
+ * @param {ErrorConstructor} constructor
17621
+ * @param {RegExp} regexp
17622
+ * @param {String} message
17623
+ * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types
17624
+ * @api public
17625
+ */
17626
+
17627
+ assert.Throw = function (fn, errt, errs, msg) {
17628
+ if ('string' === typeof errt || errt instanceof RegExp) {
17629
+ errs = errt;
17630
+ errt = null;
17631
+ }
17632
+
17633
+ new Assertion(fn, msg).to.Throw(errt, errs);
17634
+ };
17635
+
17636
+ /**
17637
+ * ### .doesNotThrow(function, [constructor/regexp], [message])
17638
+ *
17639
+ * Asserts that `function` will _not_ throw an error that is an instance of
17640
+ * `constructor`, or alternately that it will not throw an error with message
17641
+ * matching `regexp`.
17642
+ *
17643
+ * assert.doesNotThrow(fn, Error, 'function does not throw');
17644
+ *
17645
+ * @name doesNotThrow
17646
+ * @param {Function} function
17647
+ * @param {ErrorConstructor} constructor
17648
+ * @param {RegExp} regexp
17649
+ * @param {String} message
17650
+ * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types
17651
+ * @api public
17652
+ */
17653
+
17654
+ assert.doesNotThrow = function (fn, type, msg) {
17655
+ if ('string' === typeof type) {
17656
+ msg = type;
17657
+ type = null;
17658
+ }
17659
+
17660
+ new Assertion(fn, msg).to.not.Throw(type);
17661
+ };
17662
+
17663
+ /**
17664
+ * ### .operator(val1, operator, val2, [message])
17665
+ *
17666
+ * Compares two values using `operator`.
17667
+ *
17668
+ * assert.operator(1, '<', 2, 'everything is ok');
17669
+ * assert.operator(1, '>', 2, 'this will fail');
17670
+ *
17671
+ * @name operator
17672
+ * @param {Mixed} val1
17673
+ * @param {String} operator
17674
+ * @param {Mixed} val2
17675
+ * @param {String} message
17676
+ * @api public
17677
+ */
17678
+
17679
+ assert.operator = function (val, operator, val2, msg) {
17680
+ if (!~['==', '===', '>', '>=', '<', '<=', '!=', '!=='].indexOf(operator)) {
17681
+ throw new Error('Invalid operator "' + operator + '"');
17682
+ }
17683
+ var test = new Assertion(eval(val + operator + val2), msg);
17684
+ test.assert(
17685
+ true === flag(test, 'object')
17686
+ , 'expected ' + util.inspect(val) + ' to be ' + operator + ' ' + util.inspect(val2)
17687
+ , 'expected ' + util.inspect(val) + ' to not be ' + operator + ' ' + util.inspect(val2) );
17688
+ };
17689
+
17690
+ /**
17691
+ * ### .closeTo(actual, expected, delta, [message])
17692
+ *
17693
+ * Asserts that the target is equal `expected`, to within a +/- `delta` range.
17694
+ *
17695
+ * assert.closeTo(1.5, 1, 0.5, 'numbers are close');
17696
+ *
17697
+ * @name closeTo
17698
+ * @param {Number} actual
17699
+ * @param {Number} expected
17700
+ * @param {Number} delta
17701
+ * @param {String} message
17702
+ * @api public
17703
+ */
17704
+
17705
+ assert.closeTo = function (act, exp, delta, msg) {
17706
+ new Assertion(act, msg).to.be.closeTo(exp, delta);
17707
+ };
17708
+
17709
+ /**
17710
+ * ### .sameMembers(set1, set2, [message])
17711
+ *
17712
+ * Asserts that `set1` and `set2` have the same members.
17713
+ * Order is not taken into account.
17714
+ *
17715
+ * assert.sameMembers([ 1, 2, 3 ], [ 2, 1, 3 ], 'same members');
17716
+ *
17717
+ * @name sameMembers
17718
+ * @param {Array} superset
17719
+ * @param {Array} subset
17720
+ * @param {String} message
17721
+ * @api public
17722
+ */
17723
+
17724
+ assert.sameMembers = function (set1, set2, msg) {
17725
+ new Assertion(set1, msg).to.have.same.members(set2);
17726
+ }
17727
+
17728
+ /**
17729
+ * ### .includeMembers(superset, subset, [message])
17730
+ *
17731
+ * Asserts that `subset` is included in `superset`.
17732
+ * Order is not taken into account.
17733
+ *
17734
+ * assert.includeMembers([ 1, 2, 3 ], [ 2, 1 ], 'include members');
17735
+ *
17736
+ * @name includeMembers
17737
+ * @param {Array} superset
17738
+ * @param {Array} subset
17739
+ * @param {String} message
17740
+ * @api public
17741
+ */
17742
+
17743
+ assert.includeMembers = function (superset, subset, msg) {
17744
+ new Assertion(superset, msg).to.include.members(subset);
17745
+ }
17746
+
17747
+ /*!
17748
+ * Undocumented / untested
17749
+ */
17750
+
17751
+ assert.ifError = function (val, msg) {
17752
+ new Assertion(val, msg).to.not.be.ok;
17753
+ };
17754
+
17755
+ /*!
17756
+ * Aliases.
17757
+ */
17758
+
17759
+ (function alias(name, as){
17760
+ assert[as] = assert[name];
17761
+ return alias;
17762
+ })
17763
+ ('Throw', 'throw')
17764
+ ('Throw', 'throws');
17765
+ };
17766
+
17767
+ });
17768
+ require.register("chaijs-chai/lib/chai/interface/expect.js", function(exports, require, module){
17769
+ /*!
17770
+ * chai
17771
+ * Copyright(c) 2011-2013 Jake Luer <jake@alogicalparadox.com>
17772
+ * MIT Licensed
17773
+ */
17774
+
17775
+ module.exports = function (chai, util) {
17776
+ chai.expect = function (val, message) {
17777
+ return new chai.Assertion(val, message);
17778
+ };
17779
+ };
17780
+
17781
+
17782
+ });
17783
+ require.register("chaijs-chai/lib/chai/interface/should.js", function(exports, require, module){
17784
+ /*!
17785
+ * chai
17786
+ * Copyright(c) 2011-2013 Jake Luer <jake@alogicalparadox.com>
17787
+ * MIT Licensed
17788
+ */
17789
+
17790
+ module.exports = function (chai, util) {
17791
+ var Assertion = chai.Assertion;
17792
+
17793
+ function loadShould () {
17794
+ // modify Object.prototype to have `should`
17795
+ Object.defineProperty(Object.prototype, 'should',
17796
+ {
17797
+ set: function (value) {
17798
+ // See https://github.com/chaijs/chai/issues/86: this makes
17799
+ // `whatever.should = someValue` actually set `someValue`, which is
17800
+ // especially useful for `global.should = require('chai').should()`.
17801
+ //
17802
+ // Note that we have to use [[DefineProperty]] instead of [[Put]]
17803
+ // since otherwise we would trigger this very setter!
17804
+ Object.defineProperty(this, 'should', {
17805
+ value: value,
17806
+ enumerable: true,
17807
+ configurable: true,
17808
+ writable: true
17809
+ });
17810
+ }
17811
+ , get: function(){
17812
+ if (this instanceof String || this instanceof Number) {
17813
+ return new Assertion(this.constructor(this));
17814
+ } else if (this instanceof Boolean) {
17815
+ return new Assertion(this == true);
17816
+ }
17817
+ return new Assertion(this);
17818
+ }
17819
+ , configurable: true
17820
+ });
17821
+
17822
+ var should = {};
17823
+
17824
+ should.equal = function (val1, val2, msg) {
17825
+ new Assertion(val1, msg).to.equal(val2);
17826
+ };
17827
+
17828
+ should.Throw = function (fn, errt, errs, msg) {
17829
+ new Assertion(fn, msg).to.Throw(errt, errs);
17830
+ };
17831
+
17832
+ should.exist = function (val, msg) {
17833
+ new Assertion(val, msg).to.exist;
17834
+ }
17835
+
17836
+ // negation
17837
+ should.not = {}
17838
+
17839
+ should.not.equal = function (val1, val2, msg) {
17840
+ new Assertion(val1, msg).to.not.equal(val2);
17841
+ };
17842
+
17843
+ should.not.Throw = function (fn, errt, errs, msg) {
17844
+ new Assertion(fn, msg).to.not.Throw(errt, errs);
17845
+ };
17846
+
17847
+ should.not.exist = function (val, msg) {
17848
+ new Assertion(val, msg).to.not.exist;
17849
+ }
17850
+
17851
+ should['throw'] = should['Throw'];
17852
+ should.not['throw'] = should.not['Throw'];
17853
+
17854
+ return should;
17855
+ };
17856
+
17857
+ chai.should = loadShould;
17858
+ chai.Should = loadShould;
17859
+ };
17860
+
17861
+ });
17862
+ require.register("chaijs-chai/lib/chai/utils/addChainableMethod.js", function(exports, require, module){
17863
+ /*!
17864
+ * Chai - addChainingMethod utility
17865
+ * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
17866
+ * MIT Licensed
17867
+ */
17868
+
17869
+ /*!
17870
+ * Module dependencies
17871
+ */
17872
+
17873
+ var transferFlags = require('./transferFlags');
17874
+
17875
+ /*!
17876
+ * Module variables
17877
+ */
17878
+
17879
+ // Check whether `__proto__` is supported
17880
+ var hasProtoSupport = '__proto__' in Object;
17881
+
17882
+ // Without `__proto__` support, this module will need to add properties to a function.
17883
+ // However, some Function.prototype methods cannot be overwritten,
17884
+ // and there seems no easy cross-platform way to detect them (@see chaijs/chai/issues/69).
17885
+ var excludeNames = /^(?:length|name|arguments|caller)$/;
17886
+
17887
+ // Cache `Function` properties
17888
+ var call = Function.prototype.call,
17889
+ apply = Function.prototype.apply;
17890
+
17891
+ /**
17892
+ * ### addChainableMethod (ctx, name, method, chainingBehavior)
17893
+ *
17894
+ * Adds a method to an object, such that the method can also be chained.
17895
+ *
17896
+ * utils.addChainableMethod(chai.Assertion.prototype, 'foo', function (str) {
17897
+ * var obj = utils.flag(this, 'object');
17898
+ * new chai.Assertion(obj).to.be.equal(str);
17899
+ * });
17900
+ *
17901
+ * Can also be accessed directly from `chai.Assertion`.
17902
+ *
17903
+ * chai.Assertion.addChainableMethod('foo', fn, chainingBehavior);
17904
+ *
17905
+ * The result can then be used as both a method assertion, executing both `method` and
17906
+ * `chainingBehavior`, or as a language chain, which only executes `chainingBehavior`.
17907
+ *
17908
+ * expect(fooStr).to.be.foo('bar');
17909
+ * expect(fooStr).to.be.foo.equal('foo');
17910
+ *
17911
+ * @param {Object} ctx object to which the method is added
17912
+ * @param {String} name of method to add
17913
+ * @param {Function} method function to be used for `name`, when called
17914
+ * @param {Function} chainingBehavior function to be called every time the property is accessed
17915
+ * @name addChainableMethod
17916
+ * @api public
17917
+ */
17918
+
17919
+ module.exports = function (ctx, name, method, chainingBehavior) {
17920
+ if (typeof chainingBehavior !== 'function')
17921
+ chainingBehavior = function () { };
17922
+
17923
+ Object.defineProperty(ctx, name,
17924
+ { get: function () {
17925
+ chainingBehavior.call(this);
17926
+
17927
+ var assert = function () {
17928
+ var result = method.apply(this, arguments);
17929
+ return result === undefined ? this : result;
17930
+ };
17931
+
17932
+ // Use `__proto__` if available
17933
+ if (hasProtoSupport) {
17934
+ // Inherit all properties from the object by replacing the `Function` prototype
17935
+ var prototype = assert.__proto__ = Object.create(this);
17936
+ // Restore the `call` and `apply` methods from `Function`
17937
+ prototype.call = call;
17938
+ prototype.apply = apply;
17939
+ }
17940
+ // Otherwise, redefine all properties (slow!)
17941
+ else {
17942
+ var asserterNames = Object.getOwnPropertyNames(ctx);
17943
+ asserterNames.forEach(function (asserterName) {
17944
+ if (!excludeNames.test(asserterName)) {
17945
+ var pd = Object.getOwnPropertyDescriptor(ctx, asserterName);
17946
+ Object.defineProperty(assert, asserterName, pd);
17947
+ }
17948
+ });
17949
+ }
17950
+
17951
+ transferFlags(this, assert);
17952
+ return assert;
17953
+ }
17954
+ , configurable: true
17955
+ });
17956
+ };
17957
+
17958
+ });
17959
+ require.register("chaijs-chai/lib/chai/utils/addMethod.js", function(exports, require, module){
17960
+ /*!
17961
+ * Chai - addMethod utility
17962
+ * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
17963
+ * MIT Licensed
17964
+ */
17965
+
17966
+ /**
17967
+ * ### .addMethod (ctx, name, method)
17968
+ *
17969
+ * Adds a method to the prototype of an object.
17970
+ *
17971
+ * utils.addMethod(chai.Assertion.prototype, 'foo', function (str) {
17972
+ * var obj = utils.flag(this, 'object');
17973
+ * new chai.Assertion(obj).to.be.equal(str);
17974
+ * });
17975
+ *
17976
+ * Can also be accessed directly from `chai.Assertion`.
17977
+ *
17978
+ * chai.Assertion.addMethod('foo', fn);
17979
+ *
17980
+ * Then can be used as any other assertion.
17981
+ *
17982
+ * expect(fooStr).to.be.foo('bar');
17983
+ *
17984
+ * @param {Object} ctx object to which the method is added
17985
+ * @param {String} name of method to add
17986
+ * @param {Function} method function to be used for name
17987
+ * @name addMethod
17988
+ * @api public
17989
+ */
17990
+
17991
+ module.exports = function (ctx, name, method) {
17992
+ ctx[name] = function () {
17993
+ var result = method.apply(this, arguments);
17994
+ return result === undefined ? this : result;
17995
+ };
17996
+ };
17997
+
17998
+ });
17999
+ require.register("chaijs-chai/lib/chai/utils/addProperty.js", function(exports, require, module){
18000
+ /*!
18001
+ * Chai - addProperty utility
18002
+ * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
18003
+ * MIT Licensed
18004
+ */
18005
+
18006
+ /**
18007
+ * ### addProperty (ctx, name, getter)
18008
+ *
18009
+ * Adds a property to the prototype of an object.
18010
+ *
18011
+ * utils.addProperty(chai.Assertion.prototype, 'foo', function () {
18012
+ * var obj = utils.flag(this, 'object');
18013
+ * new chai.Assertion(obj).to.be.instanceof(Foo);
18014
+ * });
18015
+ *
18016
+ * Can also be accessed directly from `chai.Assertion`.
18017
+ *
18018
+ * chai.Assertion.addProperty('foo', fn);
18019
+ *
18020
+ * Then can be used as any other assertion.
18021
+ *
18022
+ * expect(myFoo).to.be.foo;
18023
+ *
18024
+ * @param {Object} ctx object to which the property is added
18025
+ * @param {String} name of property to add
18026
+ * @param {Function} getter function to be used for name
18027
+ * @name addProperty
18028
+ * @api public
18029
+ */
18030
+
18031
+ module.exports = function (ctx, name, getter) {
18032
+ Object.defineProperty(ctx, name,
18033
+ { get: function () {
18034
+ var result = getter.call(this);
18035
+ return result === undefined ? this : result;
18036
+ }
18037
+ , configurable: true
18038
+ });
18039
+ };
18040
+
18041
+ });
18042
+ require.register("chaijs-chai/lib/chai/utils/eql.js", function(exports, require, module){
18043
+ // This is (almost) directly from Node.js assert
18044
+ // https://github.com/joyent/node/blob/f8c335d0caf47f16d31413f89aa28eda3878e3aa/lib/assert.js
18045
+
18046
+ module.exports = _deepEqual;
18047
+
18048
+ var getEnumerableProperties = require('./getEnumerableProperties');
18049
+
18050
+ // for the browser
18051
+ var Buffer;
18052
+ try {
18053
+ Buffer = require('buffer').Buffer;
18054
+ } catch (ex) {
18055
+ Buffer = {
18056
+ isBuffer: function () { return false; }
18057
+ };
18058
+ }
18059
+
18060
+ function _deepEqual(actual, expected, memos) {
18061
+
18062
+ // 7.1. All identical values are equivalent, as determined by ===.
18063
+ if (actual === expected) {
18064
+ return true;
18065
+
18066
+ } else if (Buffer.isBuffer(actual) && Buffer.isBuffer(expected)) {
18067
+ if (actual.length != expected.length) return false;
18068
+
18069
+ for (var i = 0; i < actual.length; i++) {
18070
+ if (actual[i] !== expected[i]) return false;
18071
+ }
18072
+
18073
+ return true;
18074
+
18075
+ // 7.2. If the expected value is a Date object, the actual value is
18076
+ // equivalent if it is also a Date object that refers to the same time.
18077
+ } else if (expected instanceof Date) {
18078
+ if (!(actual instanceof Date)) return false;
18079
+ return actual.getTime() === expected.getTime();
18080
+
18081
+ // 7.3. Other pairs that do not both pass typeof value == 'object',
18082
+ // equivalence is determined by ==.
18083
+ } else if (typeof actual != 'object' && typeof expected != 'object') {
18084
+ return actual === expected;
18085
+
18086
+ } else if (expected instanceof RegExp) {
18087
+ if (!(actual instanceof RegExp)) return false;
18088
+ return actual.toString() === expected.toString();
18089
+
18090
+ // 7.4. For all other Object pairs, including Array objects, equivalence is
18091
+ // determined by having the same number of owned properties (as verified
18092
+ // with Object.prototype.hasOwnProperty.call), the same set of keys
18093
+ // (although not necessarily the same order), equivalent values for every
18094
+ // corresponding key, and an identical 'prototype' property. Note: this
18095
+ // accounts for both named and indexed properties on Arrays.
18096
+ } else {
18097
+ return objEquiv(actual, expected, memos);
18098
+ }
18099
+ }
18100
+
18101
+ function isUndefinedOrNull(value) {
18102
+ return value === null || value === undefined;
18103
+ }
18104
+
18105
+ function isArguments(object) {
18106
+ return Object.prototype.toString.call(object) == '[object Arguments]';
18107
+ }
18108
+
18109
+ function objEquiv(a, b, memos) {
18110
+ if (isUndefinedOrNull(a) || isUndefinedOrNull(b))
18111
+ return false;
18112
+
18113
+ // an identical 'prototype' property.
18114
+ if (a.prototype !== b.prototype) return false;
18115
+
18116
+ // check if we have already compared a and b
18117
+ var i;
18118
+ if (memos) {
18119
+ for(i = 0; i < memos.length; i++) {
18120
+ if ((memos[i][0] === a && memos[i][1] === b) ||
18121
+ (memos[i][0] === b && memos[i][1] === a))
18122
+ return true;
18123
+ }
18124
+ } else {
18125
+ memos = [];
18126
+ }
18127
+
18128
+ //~~~I've managed to break Object.keys through screwy arguments passing.
18129
+ // Converting to array solves the problem.
18130
+ if (isArguments(a)) {
18131
+ if (!isArguments(b)) {
18132
+ return false;
18133
+ }
18134
+ a = pSlice.call(a);
18135
+ b = pSlice.call(b);
18136
+ return _deepEqual(a, b, memos);
18137
+ }
18138
+ try {
18139
+ var ka = getEnumerableProperties(a),
18140
+ kb = getEnumerableProperties(b),
18141
+ key;
18142
+ } catch (e) {//happens when one is a string literal and the other isn't
18143
+ return false;
18144
+ }
18145
+
18146
+ // having the same number of owned properties (keys incorporates
18147
+ // hasOwnProperty)
18148
+ if (ka.length != kb.length)
18149
+ return false;
18150
+
18151
+ //the same set of keys (although not necessarily the same order),
18152
+ ka.sort();
18153
+ kb.sort();
18154
+ //~~~cheap key test
18155
+ for (i = ka.length - 1; i >= 0; i--) {
18156
+ if (ka[i] != kb[i])
18157
+ return false;
18158
+ }
18159
+
18160
+ // remember objects we have compared to guard against circular references
18161
+ memos.push([ a, b ]);
18162
+
18163
+ //equivalent values for every corresponding key, and
18164
+ //~~~possibly expensive deep test
18165
+ for (i = ka.length - 1; i >= 0; i--) {
18166
+ key = ka[i];
18167
+ if (!_deepEqual(a[key], b[key], memos)) return false;
18168
+ }
18169
+
18170
+ return true;
18171
+ }
18172
+
18173
+ });
18174
+ require.register("chaijs-chai/lib/chai/utils/flag.js", function(exports, require, module){
18175
+ /*!
18176
+ * Chai - flag utility
18177
+ * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
18178
+ * MIT Licensed
18179
+ */
18180
+
18181
+ /**
18182
+ * ### flag(object ,key, [value])
18183
+ *
18184
+ * Get or set a flag value on an object. If a
18185
+ * value is provided it will be set, else it will
18186
+ * return the currently set value or `undefined` if
18187
+ * the value is not set.
18188
+ *
18189
+ * utils.flag(this, 'foo', 'bar'); // setter
18190
+ * utils.flag(this, 'foo'); // getter, returns `bar`
18191
+ *
18192
+ * @param {Object} object (constructed Assertion
18193
+ * @param {String} key
18194
+ * @param {Mixed} value (optional)
18195
+ * @name flag
18196
+ * @api private
18197
+ */
18198
+
18199
+ module.exports = function (obj, key, value) {
18200
+ var flags = obj.__flags || (obj.__flags = Object.create(null));
18201
+ if (arguments.length === 3) {
18202
+ flags[key] = value;
18203
+ } else {
18204
+ return flags[key];
18205
+ }
18206
+ };
18207
+
18208
+ });
18209
+ require.register("chaijs-chai/lib/chai/utils/getActual.js", function(exports, require, module){
18210
+ /*!
18211
+ * Chai - getActual utility
18212
+ * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
18213
+ * MIT Licensed
18214
+ */
18215
+
18216
+ /**
18217
+ * # getActual(object, [actual])
18218
+ *
18219
+ * Returns the `actual` value for an Assertion
18220
+ *
18221
+ * @param {Object} object (constructed Assertion)
18222
+ * @param {Arguments} chai.Assertion.prototype.assert arguments
18223
+ */
18224
+
18225
+ module.exports = function (obj, args) {
18226
+ var actual = args[4];
18227
+ return 'undefined' !== typeof actual ? actual : obj._obj;
18228
+ };
18229
+
18230
+ });
18231
+ require.register("chaijs-chai/lib/chai/utils/getEnumerableProperties.js", function(exports, require, module){
18232
+ /*!
18233
+ * Chai - getEnumerableProperties utility
18234
+ * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
18235
+ * MIT Licensed
18236
+ */
18237
+
18238
+ /**
18239
+ * ### .getEnumerableProperties(object)
18240
+ *
18241
+ * This allows the retrieval of enumerable property names of an object,
18242
+ * inherited or not.
18243
+ *
18244
+ * @param {Object} object
18245
+ * @returns {Array}
18246
+ * @name getEnumerableProperties
18247
+ * @api public
18248
+ */
18249
+
18250
+ module.exports = function getEnumerableProperties(object) {
18251
+ var result = [];
18252
+ for (var name in object) {
18253
+ result.push(name);
18254
+ }
18255
+ return result;
18256
+ };
18257
+
18258
+ });
18259
+ require.register("chaijs-chai/lib/chai/utils/getMessage.js", function(exports, require, module){
18260
+ /*!
18261
+ * Chai - message composition utility
18262
+ * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
18263
+ * MIT Licensed
18264
+ */
18265
+
18266
+ /*!
18267
+ * Module dependancies
18268
+ */
18269
+
18270
+ var flag = require('./flag')
18271
+ , getActual = require('./getActual')
18272
+ , inspect = require('./inspect')
18273
+ , objDisplay = require('./objDisplay');
18274
+
18275
+ /**
18276
+ * ### .getMessage(object, message, negateMessage)
18277
+ *
18278
+ * Construct the error message based on flags
18279
+ * and template tags. Template tags will return
18280
+ * a stringified inspection of the object referenced.
18281
+ *
18282
+ * Message template tags:
18283
+ * - `#{this}` current asserted object
18284
+ * - `#{act}` actual value
18285
+ * - `#{exp}` expected value
18286
+ *
18287
+ * @param {Object} object (constructed Assertion)
18288
+ * @param {Arguments} chai.Assertion.prototype.assert arguments
18289
+ * @name getMessage
18290
+ * @api public
18291
+ */
18292
+
18293
+ module.exports = function (obj, args) {
18294
+ var negate = flag(obj, 'negate')
18295
+ , val = flag(obj, 'object')
18296
+ , expected = args[3]
18297
+ , actual = getActual(obj, args)
18298
+ , msg = negate ? args[2] : args[1]
18299
+ , flagMsg = flag(obj, 'message');
18300
+
18301
+ msg = msg || '';
18302
+ msg = msg
18303
+ .replace(/#{this}/g, objDisplay(val))
18304
+ .replace(/#{act}/g, objDisplay(actual))
18305
+ .replace(/#{exp}/g, objDisplay(expected));
18306
+
18307
+ return flagMsg ? flagMsg + ': ' + msg : msg;
18308
+ };
18309
+
18310
+ });
18311
+ require.register("chaijs-chai/lib/chai/utils/getName.js", function(exports, require, module){
18312
+ /*!
18313
+ * Chai - getName utility
18314
+ * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
18315
+ * MIT Licensed
18316
+ */
18317
+
18318
+ /**
18319
+ * # getName(func)
18320
+ *
18321
+ * Gets the name of a function, in a cross-browser way.
18322
+ *
18323
+ * @param {Function} a function (usually a constructor)
18324
+ */
18325
+
18326
+ module.exports = function (func) {
18327
+ if (func.name) return func.name;
18328
+
18329
+ var match = /^\s?function ([^(]*)\(/.exec(func);
18330
+ return match && match[1] ? match[1] : "";
18331
+ };
18332
+
18333
+ });
18334
+ require.register("chaijs-chai/lib/chai/utils/getPathValue.js", function(exports, require, module){
18335
+ /*!
18336
+ * Chai - getPathValue utility
18337
+ * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
18338
+ * @see https://github.com/logicalparadox/filtr
18339
+ * MIT Licensed
18340
+ */
18341
+
18342
+ /**
18343
+ * ### .getPathValue(path, object)
18344
+ *
18345
+ * This allows the retrieval of values in an
18346
+ * object given a string path.
18347
+ *
18348
+ * var obj = {
18349
+ * prop1: {
18350
+ * arr: ['a', 'b', 'c']
18351
+ * , str: 'Hello'
18352
+ * }
18353
+ * , prop2: {
18354
+ * arr: [ { nested: 'Universe' } ]
18355
+ * , str: 'Hello again!'
18356
+ * }
18357
+ * }
18358
+ *
18359
+ * The following would be the results.
18360
+ *
18361
+ * getPathValue('prop1.str', obj); // Hello
18362
+ * getPathValue('prop1.att[2]', obj); // b
18363
+ * getPathValue('prop2.arr[0].nested', obj); // Universe
18364
+ *
18365
+ * @param {String} path
18366
+ * @param {Object} object
18367
+ * @returns {Object} value or `undefined`
18368
+ * @name getPathValue
18369
+ * @api public
18370
+ */
18371
+
18372
+ var getPathValue = module.exports = function (path, obj) {
18373
+ var parsed = parsePath(path);
18374
+ return _getPathValue(parsed, obj);
18375
+ };
18376
+
18377
+ /*!
18378
+ * ## parsePath(path)
18379
+ *
18380
+ * Helper function used to parse string object
18381
+ * paths. Use in conjunction with `_getPathValue`.
18382
+ *
18383
+ * var parsed = parsePath('myobject.property.subprop');
18384
+ *
18385
+ * ### Paths:
18386
+ *
18387
+ * * Can be as near infinitely deep and nested
18388
+ * * Arrays are also valid using the formal `myobject.document[3].property`.
18389
+ *
18390
+ * @param {String} path
18391
+ * @returns {Object} parsed
18392
+ * @api private
18393
+ */
18394
+
18395
+ function parsePath (path) {
18396
+ var str = path.replace(/\[/g, '.[')
18397
+ , parts = str.match(/(\\\.|[^.]+?)+/g);
18398
+ return parts.map(function (value) {
18399
+ var re = /\[(\d+)\]$/
18400
+ , mArr = re.exec(value)
18401
+ if (mArr) return { i: parseFloat(mArr[1]) };
18402
+ else return { p: value };
18403
+ });
18404
+ };
18405
+
18406
+ /*!
18407
+ * ## _getPathValue(parsed, obj)
18408
+ *
18409
+ * Helper companion function for `.parsePath` that returns
18410
+ * the value located at the parsed address.
18411
+ *
18412
+ * var value = getPathValue(parsed, obj);
18413
+ *
18414
+ * @param {Object} parsed definition from `parsePath`.
18415
+ * @param {Object} object to search against
18416
+ * @returns {Object|Undefined} value
18417
+ * @api private
18418
+ */
18419
+
18420
+ function _getPathValue (parsed, obj) {
18421
+ var tmp = obj
18422
+ , res;
18423
+ for (var i = 0, l = parsed.length; i < l; i++) {
18424
+ var part = parsed[i];
18425
+ if (tmp) {
18426
+ if ('undefined' !== typeof part.p)
18427
+ tmp = tmp[part.p];
18428
+ else if ('undefined' !== typeof part.i)
18429
+ tmp = tmp[part.i];
18430
+ if (i == (l - 1)) res = tmp;
18431
+ } else {
18432
+ res = undefined;
18433
+ }
18434
+ }
18435
+ return res;
18436
+ };
18437
+
18438
+ });
18439
+ require.register("chaijs-chai/lib/chai/utils/getProperties.js", function(exports, require, module){
18440
+ /*!
18441
+ * Chai - getProperties utility
18442
+ * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
18443
+ * MIT Licensed
18444
+ */
18445
+
18446
+ /**
18447
+ * ### .getProperties(object)
18448
+ *
18449
+ * This allows the retrieval of property names of an object, enumerable or not,
18450
+ * inherited or not.
18451
+ *
18452
+ * @param {Object} object
18453
+ * @returns {Array}
18454
+ * @name getProperties
18455
+ * @api public
18456
+ */
18457
+
18458
+ module.exports = function getProperties(object) {
18459
+ var result = Object.getOwnPropertyNames(subject);
18460
+
18461
+ function addProperty(property) {
18462
+ if (result.indexOf(property) === -1) {
18463
+ result.push(property);
18464
+ }
18465
+ }
18466
+
18467
+ var proto = Object.getPrototypeOf(subject);
18468
+ while (proto !== null) {
18469
+ Object.getOwnPropertyNames(proto).forEach(addProperty);
18470
+ proto = Object.getPrototypeOf(proto);
18471
+ }
18472
+
18473
+ return result;
18474
+ };
18475
+
18476
+ });
18477
+ require.register("chaijs-chai/lib/chai/utils/index.js", function(exports, require, module){
18478
+ /*!
18479
+ * chai
18480
+ * Copyright(c) 2011 Jake Luer <jake@alogicalparadox.com>
18481
+ * MIT Licensed
18482
+ */
18483
+
18484
+ /*!
18485
+ * Main exports
18486
+ */
18487
+
18488
+ var exports = module.exports = {};
18489
+
18490
+ /*!
18491
+ * test utility
18492
+ */
18493
+
18494
+ exports.test = require('./test');
18495
+
18496
+ /*!
18497
+ * type utility
18498
+ */
18499
+
18500
+ exports.type = require('./type');
18501
+
18502
+ /*!
18503
+ * message utility
18504
+ */
18505
+
18506
+ exports.getMessage = require('./getMessage');
18507
+
18508
+ /*!
18509
+ * actual utility
18510
+ */
18511
+
18512
+ exports.getActual = require('./getActual');
18513
+
18514
+ /*!
18515
+ * Inspect util
18516
+ */
18517
+
18518
+ exports.inspect = require('./inspect');
18519
+
18520
+ /*!
18521
+ * Object Display util
18522
+ */
18523
+
18524
+ exports.objDisplay = require('./objDisplay');
18525
+
18526
+ /*!
18527
+ * Flag utility
18528
+ */
18529
+
18530
+ exports.flag = require('./flag');
18531
+
18532
+ /*!
18533
+ * Flag transferring utility
18534
+ */
18535
+
18536
+ exports.transferFlags = require('./transferFlags');
18537
+
18538
+ /*!
18539
+ * Deep equal utility
18540
+ */
18541
+
18542
+ exports.eql = require('./eql');
18543
+
18544
+ /*!
18545
+ * Deep path value
18546
+ */
18547
+
18548
+ exports.getPathValue = require('./getPathValue');
18549
+
18550
+ /*!
18551
+ * Function name
18552
+ */
18553
+
18554
+ exports.getName = require('./getName');
18555
+
18556
+ /*!
18557
+ * add Property
18558
+ */
18559
+
18560
+ exports.addProperty = require('./addProperty');
18561
+
18562
+ /*!
18563
+ * add Method
18564
+ */
18565
+
18566
+ exports.addMethod = require('./addMethod');
18567
+
18568
+ /*!
18569
+ * overwrite Property
18570
+ */
18571
+
18572
+ exports.overwriteProperty = require('./overwriteProperty');
18573
+
18574
+ /*!
18575
+ * overwrite Method
18576
+ */
18577
+
18578
+ exports.overwriteMethod = require('./overwriteMethod');
18579
+
18580
+ /*!
18581
+ * Add a chainable method
18582
+ */
18583
+
18584
+ exports.addChainableMethod = require('./addChainableMethod');
18585
+
18586
+
18587
+ });
18588
+ require.register("chaijs-chai/lib/chai/utils/inspect.js", function(exports, require, module){
18589
+ // This is (almost) directly from Node.js utils
18590
+ // https://github.com/joyent/node/blob/f8c335d0caf47f16d31413f89aa28eda3878e3aa/lib/util.js
18591
+
18592
+ var getName = require('./getName');
18593
+ var getProperties = require('./getProperties');
18594
+ var getEnumerableProperties = require('./getEnumerableProperties');
18595
+
18596
+ module.exports = inspect;
18597
+
18598
+ /**
18599
+ * Echos the value of a value. Trys to print the value out
18600
+ * in the best way possible given the different types.
18601
+ *
18602
+ * @param {Object} obj The object to print out.
18603
+ * @param {Boolean} showHidden Flag that shows hidden (not enumerable)
18604
+ * properties of objects.
18605
+ * @param {Number} depth Depth in which to descend in object. Default is 2.
18606
+ * @param {Boolean} colors Flag to turn on ANSI escape codes to color the
18607
+ * output. Default is false (no coloring).
18608
+ */
18609
+ function inspect(obj, showHidden, depth, colors) {
18610
+ var ctx = {
18611
+ showHidden: showHidden,
18612
+ seen: [],
18613
+ stylize: function (str) { return str; }
18614
+ };
18615
+ return formatValue(ctx, obj, (typeof depth === 'undefined' ? 2 : depth));
18616
+ }
18617
+
18618
+ // https://gist.github.com/1044128/
18619
+ var getOuterHTML = function(element) {
18620
+ if ('outerHTML' in element) return element.outerHTML;
18621
+ var ns = "http://www.w3.org/1999/xhtml";
18622
+ var container = document.createElementNS(ns, '_');
18623
+ var elemProto = (window.HTMLElement || window.Element).prototype;
18624
+ var xmlSerializer = new XMLSerializer();
18625
+ var html;
18626
+ if (document.xmlVersion) {
18627
+ return xmlSerializer.serializeToString(element);
18628
+ } else {
18629
+ container.appendChild(element.cloneNode(false));
18630
+ html = container.innerHTML.replace('><', '>' + element.innerHTML + '<');
18631
+ container.innerHTML = '';
18632
+ return html;
18633
+ }
18634
+ };
18635
+
18636
+ // Returns true if object is a DOM element.
18637
+ var isDOMElement = function (object) {
18638
+ if (typeof HTMLElement === 'object') {
18639
+ return object instanceof HTMLElement;
18640
+ } else {
18641
+ return object &&
18642
+ typeof object === 'object' &&
18643
+ object.nodeType === 1 &&
18644
+ typeof object.nodeName === 'string';
18645
+ }
18646
+ };
18647
+
18648
+ function formatValue(ctx, value, recurseTimes) {
18649
+ // Provide a hook for user-specified inspect functions.
18650
+ // Check that value is an object with an inspect function on it
18651
+ if (value && typeof value.inspect === 'function' &&
18652
+ // Filter out the util module, it's inspect function is special
18653
+ value.inspect !== exports.inspect &&
18654
+ // Also filter out any prototype objects using the circular check.
18655
+ !(value.constructor && value.constructor.prototype === value)) {
18656
+ var ret = value.inspect(recurseTimes);
18657
+ if (typeof ret !== 'string') {
18658
+ ret = formatValue(ctx, ret, recurseTimes);
18659
+ }
18660
+ return ret;
18661
+ }
18662
+
18663
+ // Primitive types cannot have properties
18664
+ var primitive = formatPrimitive(ctx, value);
18665
+ if (primitive) {
18666
+ return primitive;
18667
+ }
18668
+
18669
+ // If it's DOM elem, get outer HTML.
18670
+ if (isDOMElement(value)) {
18671
+ return getOuterHTML(value);
18672
+ }
18673
+
18674
+ // Look up the keys of the object.
18675
+ var visibleKeys = getEnumerableProperties(value);
18676
+ var keys = ctx.showHidden ? getProperties(value) : visibleKeys;
18677
+
18678
+ // Some type of object without properties can be shortcutted.
18679
+ // In IE, errors have a single `stack` property, or if they are vanilla `Error`,
18680
+ // a `stack` plus `description` property; ignore those for consistency.
18681
+ if (keys.length === 0 || (isError(value) && (
18682
+ (keys.length === 1 && keys[0] === 'stack') ||
18683
+ (keys.length === 2 && keys[0] === 'description' && keys[1] === 'stack')
18684
+ ))) {
18685
+ if (typeof value === 'function') {
18686
+ var name = getName(value);
18687
+ var nameSuffix = name ? ': ' + name : '';
18688
+ return ctx.stylize('[Function' + nameSuffix + ']', 'special');
18689
+ }
18690
+ if (isRegExp(value)) {
18691
+ return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
18692
+ }
18693
+ if (isDate(value)) {
18694
+ return ctx.stylize(Date.prototype.toUTCString.call(value), 'date');
18695
+ }
18696
+ if (isError(value)) {
18697
+ return formatError(value);
18698
+ }
18699
+ }
18700
+
18701
+ var base = '', array = false, braces = ['{', '}'];
18702
+
18703
+ // Make Array say that they are Array
18704
+ if (isArray(value)) {
18705
+ array = true;
18706
+ braces = ['[', ']'];
18707
+ }
18708
+
18709
+ // Make functions say that they are functions
18710
+ if (typeof value === 'function') {
18711
+ var name = getName(value);
18712
+ var nameSuffix = name ? ': ' + name : '';
18713
+ base = ' [Function' + nameSuffix + ']';
18714
+ }
18715
+
18716
+ // Make RegExps say that they are RegExps
18717
+ if (isRegExp(value)) {
18718
+ base = ' ' + RegExp.prototype.toString.call(value);
18719
+ }
18720
+
18721
+ // Make dates with properties first say the date
18722
+ if (isDate(value)) {
18723
+ base = ' ' + Date.prototype.toUTCString.call(value);
18724
+ }
18725
+
18726
+ // Make error with message first say the error
18727
+ if (isError(value)) {
18728
+ return formatError(value);
18729
+ }
18730
+
18731
+ if (keys.length === 0 && (!array || value.length == 0)) {
18732
+ return braces[0] + base + braces[1];
18733
+ }
18734
+
18735
+ if (recurseTimes < 0) {
18736
+ if (isRegExp(value)) {
18737
+ return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
18738
+ } else {
18739
+ return ctx.stylize('[Object]', 'special');
18740
+ }
18741
+ }
18742
+
18743
+ ctx.seen.push(value);
18744
+
18745
+ var output;
18746
+ if (array) {
18747
+ output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
18748
+ } else {
18749
+ output = keys.map(function(key) {
18750
+ return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
18751
+ });
18752
+ }
18753
+
18754
+ ctx.seen.pop();
18755
+
18756
+ return reduceToSingleString(output, base, braces);
18757
+ }
18758
+
18759
+
18760
+ function formatPrimitive(ctx, value) {
18761
+ switch (typeof value) {
18762
+ case 'undefined':
18763
+ return ctx.stylize('undefined', 'undefined');
18764
+
18765
+ case 'string':
18766
+ var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
18767
+ .replace(/'/g, "\\'")
18768
+ .replace(/\\"/g, '"') + '\'';
18769
+ return ctx.stylize(simple, 'string');
18770
+
18771
+ case 'number':
18772
+ return ctx.stylize('' + value, 'number');
18773
+
18774
+ case 'boolean':
18775
+ return ctx.stylize('' + value, 'boolean');
18776
+ }
18777
+ // For some reason typeof null is "object", so special case here.
18778
+ if (value === null) {
18779
+ return ctx.stylize('null', 'null');
18780
+ }
18781
+ }
18782
+
18783
+
18784
+ function formatError(value) {
18785
+ return '[' + Error.prototype.toString.call(value) + ']';
18786
+ }
18787
+
18788
+
18789
+ function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
18790
+ var output = [];
18791
+ for (var i = 0, l = value.length; i < l; ++i) {
18792
+ if (Object.prototype.hasOwnProperty.call(value, String(i))) {
18793
+ output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
18794
+ String(i), true));
18795
+ } else {
18796
+ output.push('');
18797
+ }
18798
+ }
18799
+ keys.forEach(function(key) {
18800
+ if (!key.match(/^\d+$/)) {
18801
+ output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
18802
+ key, true));
18803
+ }
18804
+ });
18805
+ return output;
18806
+ }
18807
+
18808
+
18809
+ function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
18810
+ var name, str;
18811
+ if (value.__lookupGetter__) {
18812
+ if (value.__lookupGetter__(key)) {
18813
+ if (value.__lookupSetter__(key)) {
18814
+ str = ctx.stylize('[Getter/Setter]', 'special');
18815
+ } else {
18816
+ str = ctx.stylize('[Getter]', 'special');
18817
+ }
18818
+ } else {
18819
+ if (value.__lookupSetter__(key)) {
18820
+ str = ctx.stylize('[Setter]', 'special');
18821
+ }
18822
+ }
18823
+ }
18824
+ if (visibleKeys.indexOf(key) < 0) {
18825
+ name = '[' + key + ']';
18826
+ }
18827
+ if (!str) {
18828
+ if (ctx.seen.indexOf(value[key]) < 0) {
18829
+ if (recurseTimes === null) {
18830
+ str = formatValue(ctx, value[key], null);
18831
+ } else {
18832
+ str = formatValue(ctx, value[key], recurseTimes - 1);
18833
+ }
18834
+ if (str.indexOf('\n') > -1) {
18835
+ if (array) {
18836
+ str = str.split('\n').map(function(line) {
18837
+ return ' ' + line;
18838
+ }).join('\n').substr(2);
18839
+ } else {
18840
+ str = '\n' + str.split('\n').map(function(line) {
18841
+ return ' ' + line;
18842
+ }).join('\n');
18843
+ }
18844
+ }
18845
+ } else {
18846
+ str = ctx.stylize('[Circular]', 'special');
18847
+ }
18848
+ }
18849
+ if (typeof name === 'undefined') {
18850
+ if (array && key.match(/^\d+$/)) {
18851
+ return str;
18852
+ }
18853
+ name = JSON.stringify('' + key);
18854
+ if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
18855
+ name = name.substr(1, name.length - 2);
18856
+ name = ctx.stylize(name, 'name');
18857
+ } else {
18858
+ name = name.replace(/'/g, "\\'")
18859
+ .replace(/\\"/g, '"')
18860
+ .replace(/(^"|"$)/g, "'");
18861
+ name = ctx.stylize(name, 'string');
18862
+ }
18863
+ }
18864
+
18865
+ return name + ': ' + str;
18866
+ }
18867
+
18868
+
18869
+ function reduceToSingleString(output, base, braces) {
18870
+ var numLinesEst = 0;
18871
+ var length = output.reduce(function(prev, cur) {
18872
+ numLinesEst++;
18873
+ if (cur.indexOf('\n') >= 0) numLinesEst++;
18874
+ return prev + cur.length + 1;
18875
+ }, 0);
18876
+
18877
+ if (length > 60) {
18878
+ return braces[0] +
18879
+ (base === '' ? '' : base + '\n ') +
18880
+ ' ' +
18881
+ output.join(',\n ') +
18882
+ ' ' +
18883
+ braces[1];
18884
+ }
18885
+
18886
+ return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
18887
+ }
18888
+
18889
+ function isArray(ar) {
18890
+ return Array.isArray(ar) ||
18891
+ (typeof ar === 'object' && objectToString(ar) === '[object Array]');
18892
+ }
18893
+
18894
+ function isRegExp(re) {
18895
+ return typeof re === 'object' && objectToString(re) === '[object RegExp]';
18896
+ }
18897
+
18898
+ function isDate(d) {
18899
+ return typeof d === 'object' && objectToString(d) === '[object Date]';
18900
+ }
18901
+
18902
+ function isError(e) {
18903
+ return typeof e === 'object' && objectToString(e) === '[object Error]';
18904
+ }
18905
+
18906
+ function objectToString(o) {
18907
+ return Object.prototype.toString.call(o);
18908
+ }
18909
+
18910
+ });
18911
+ require.register("chaijs-chai/lib/chai/utils/objDisplay.js", function(exports, require, module){
18912
+ /*!
18913
+ * Chai - flag utility
18914
+ * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
18915
+ * MIT Licensed
18916
+ */
18917
+
18918
+ /*!
18919
+ * Module dependancies
18920
+ */
18921
+
18922
+ var inspect = require('./inspect');
18923
+
18924
+ /**
18925
+ * ### .objDisplay (object)
18926
+ *
18927
+ * Determines if an object or an array matches
18928
+ * criteria to be inspected in-line for error
18929
+ * messages or should be truncated.
18930
+ *
18931
+ * @param {Mixed} javascript object to inspect
18932
+ * @name objDisplay
18933
+ * @api public
18934
+ */
18935
+
18936
+ module.exports = function (obj) {
18937
+ var str = inspect(obj)
18938
+ , type = Object.prototype.toString.call(obj);
18939
+
18940
+ if (str.length >= 40) {
18941
+ if (type === '[object Function]') {
18942
+ return !obj.name || obj.name === ''
18943
+ ? '[Function]'
18944
+ : '[Function: ' + obj.name + ']';
18945
+ } else if (type === '[object Array]') {
18946
+ return '[ Array(' + obj.length + ') ]';
18947
+ } else if (type === '[object Object]') {
18948
+ var keys = Object.keys(obj)
18949
+ , kstr = keys.length > 2
18950
+ ? keys.splice(0, 2).join(', ') + ', ...'
18951
+ : keys.join(', ');
18952
+ return '{ Object (' + kstr + ') }';
18953
+ } else {
18954
+ return str;
18955
+ }
18956
+ } else {
18957
+ return str;
18958
+ }
18959
+ };
18960
+
18961
+ });
18962
+ require.register("chaijs-chai/lib/chai/utils/overwriteMethod.js", function(exports, require, module){
18963
+ /*!
18964
+ * Chai - overwriteMethod utility
18965
+ * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
18966
+ * MIT Licensed
18967
+ */
18968
+
18969
+ /**
18970
+ * ### overwriteMethod (ctx, name, fn)
18971
+ *
18972
+ * Overwites an already existing method and provides
18973
+ * access to previous function. Must return function
18974
+ * to be used for name.
18975
+ *
18976
+ * utils.overwriteMethod(chai.Assertion.prototype, 'equal', function (_super) {
18977
+ * return function (str) {
18978
+ * var obj = utils.flag(this, 'object');
18979
+ * if (obj instanceof Foo) {
18980
+ * new chai.Assertion(obj.value).to.equal(str);
18981
+ * } else {
18982
+ * _super.apply(this, arguments);
18983
+ * }
18984
+ * }
18985
+ * });
18986
+ *
18987
+ * Can also be accessed directly from `chai.Assertion`.
18988
+ *
18989
+ * chai.Assertion.overwriteMethod('foo', fn);
18990
+ *
18991
+ * Then can be used as any other assertion.
18992
+ *
18993
+ * expect(myFoo).to.equal('bar');
18994
+ *
18995
+ * @param {Object} ctx object whose method is to be overwritten
18996
+ * @param {String} name of method to overwrite
18997
+ * @param {Function} method function that returns a function to be used for name
18998
+ * @name overwriteMethod
18999
+ * @api public
19000
+ */
19001
+
19002
+ module.exports = function (ctx, name, method) {
19003
+ var _method = ctx[name]
19004
+ , _super = function () { return this; };
19005
+
19006
+ if (_method && 'function' === typeof _method)
19007
+ _super = _method;
19008
+
19009
+ ctx[name] = function () {
19010
+ var result = method(_super).apply(this, arguments);
19011
+ return result === undefined ? this : result;
19012
+ }
19013
+ };
19014
+
19015
+ });
19016
+ require.register("chaijs-chai/lib/chai/utils/overwriteProperty.js", function(exports, require, module){
19017
+ /*!
19018
+ * Chai - overwriteProperty utility
19019
+ * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
19020
+ * MIT Licensed
19021
+ */
19022
+
19023
+ /**
19024
+ * ### overwriteProperty (ctx, name, fn)
19025
+ *
19026
+ * Overwites an already existing property getter and provides
19027
+ * access to previous value. Must return function to use as getter.
19028
+ *
19029
+ * utils.overwriteProperty(chai.Assertion.prototype, 'ok', function (_super) {
19030
+ * return function () {
19031
+ * var obj = utils.flag(this, 'object');
19032
+ * if (obj instanceof Foo) {
19033
+ * new chai.Assertion(obj.name).to.equal('bar');
19034
+ * } else {
19035
+ * _super.call(this);
19036
+ * }
19037
+ * }
19038
+ * });
19039
+ *
19040
+ *
19041
+ * Can also be accessed directly from `chai.Assertion`.
19042
+ *
19043
+ * chai.Assertion.overwriteProperty('foo', fn);
19044
+ *
19045
+ * Then can be used as any other assertion.
19046
+ *
19047
+ * expect(myFoo).to.be.ok;
19048
+ *
19049
+ * @param {Object} ctx object whose property is to be overwritten
19050
+ * @param {String} name of property to overwrite
19051
+ * @param {Function} getter function that returns a getter function to be used for name
19052
+ * @name overwriteProperty
19053
+ * @api public
19054
+ */
19055
+
19056
+ module.exports = function (ctx, name, getter) {
19057
+ var _get = Object.getOwnPropertyDescriptor(ctx, name)
19058
+ , _super = function () {};
19059
+
19060
+ if (_get && 'function' === typeof _get.get)
19061
+ _super = _get.get
19062
+
19063
+ Object.defineProperty(ctx, name,
19064
+ { get: function () {
19065
+ var result = getter(_super).call(this);
19066
+ return result === undefined ? this : result;
19067
+ }
19068
+ , configurable: true
19069
+ });
19070
+ };
19071
+
19072
+ });
19073
+ require.register("chaijs-chai/lib/chai/utils/test.js", function(exports, require, module){
19074
+ /*!
19075
+ * Chai - test utility
19076
+ * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
19077
+ * MIT Licensed
19078
+ */
19079
+
19080
+ /*!
19081
+ * Module dependancies
19082
+ */
19083
+
19084
+ var flag = require('./flag');
19085
+
19086
+ /**
19087
+ * # test(object, expression)
19088
+ *
19089
+ * Test and object for expression.
19090
+ *
19091
+ * @param {Object} object (constructed Assertion)
19092
+ * @param {Arguments} chai.Assertion.prototype.assert arguments
19093
+ */
19094
+
19095
+ module.exports = function (obj, args) {
19096
+ var negate = flag(obj, 'negate')
19097
+ , expr = args[0];
19098
+ return negate ? !expr : expr;
19099
+ };
19100
+
19101
+ });
19102
+ require.register("chaijs-chai/lib/chai/utils/transferFlags.js", function(exports, require, module){
19103
+ /*!
19104
+ * Chai - transferFlags utility
19105
+ * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
19106
+ * MIT Licensed
19107
+ */
19108
+
19109
+ /**
19110
+ * ### transferFlags(assertion, object, includeAll = true)
19111
+ *
19112
+ * Transfer all the flags for `assertion` to `object`. If
19113
+ * `includeAll` is set to `false`, then the base Chai
19114
+ * assertion flags (namely `object`, `ssfi`, and `message`)
19115
+ * will not be transferred.
19116
+ *
19117
+ *
19118
+ * var newAssertion = new Assertion();
19119
+ * utils.transferFlags(assertion, newAssertion);
19120
+ *
19121
+ * var anotherAsseriton = new Assertion(myObj);
19122
+ * utils.transferFlags(assertion, anotherAssertion, false);
19123
+ *
19124
+ * @param {Assertion} assertion the assertion to transfer the flags from
19125
+ * @param {Object} object the object to transfer the flags too; usually a new assertion
19126
+ * @param {Boolean} includeAll
19127
+ * @name getAllFlags
19128
+ * @api private
19129
+ */
19130
+
19131
+ module.exports = function (assertion, object, includeAll) {
19132
+ var flags = assertion.__flags || (assertion.__flags = Object.create(null));
19133
+
19134
+ if (!object.__flags) {
19135
+ object.__flags = Object.create(null);
19136
+ }
19137
+
19138
+ includeAll = arguments.length === 3 ? includeAll : true;
19139
+
19140
+ for (var flag in flags) {
19141
+ if (includeAll ||
19142
+ (flag !== 'object' && flag !== 'ssfi' && flag != 'message')) {
19143
+ object.__flags[flag] = flags[flag];
19144
+ }
19145
+ }
19146
+ };
19147
+
19148
+ });
19149
+ require.register("chaijs-chai/lib/chai/utils/type.js", function(exports, require, module){
19150
+ /*!
19151
+ * Chai - type utility
19152
+ * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
19153
+ * MIT Licensed
19154
+ */
19155
+
19156
+ /*!
19157
+ * Detectable javascript natives
19158
+ */
19159
+
19160
+ var natives = {
19161
+ '[object Arguments]': 'arguments'
19162
+ , '[object Array]': 'array'
19163
+ , '[object Date]': 'date'
19164
+ , '[object Function]': 'function'
19165
+ , '[object Number]': 'number'
19166
+ , '[object RegExp]': 'regexp'
19167
+ , '[object String]': 'string'
19168
+ };
19169
+
19170
+ /**
19171
+ * ### type(object)
19172
+ *
19173
+ * Better implementation of `typeof` detection that can
19174
+ * be used cross-browser. Handles the inconsistencies of
19175
+ * Array, `null`, and `undefined` detection.
19176
+ *
19177
+ * utils.type({}) // 'object'
19178
+ * utils.type(null) // `null'
19179
+ * utils.type(undefined) // `undefined`
19180
+ * utils.type([]) // `array`
19181
+ *
19182
+ * @param {Mixed} object to detect type of
19183
+ * @name type
19184
+ * @api private
19185
+ */
19186
+
19187
+ module.exports = function (obj) {
19188
+ var str = Object.prototype.toString.call(obj);
19189
+ if (natives[str]) return natives[str];
19190
+ if (obj === null) return 'null';
19191
+ if (obj === undefined) return 'undefined';
19192
+ if (obj === Object(obj)) return 'object';
19193
+ return typeof obj;
19194
+ };
19195
+
15074
19196
  });
15075
19197
  require.register("indemma/index.js", function(exports, require, module){
15076
19198
  module.exports = require('./lib/record');
@@ -22071,11 +26193,24 @@ model.rivets = function() {
22071
26193
  };
22072
26194
 
22073
26195
  });
26196
+
26197
+
26198
+
26199
+
26200
+
26201
+
26202
+
26203
+
26204
+
26205
+
26206
+
26207
+
26208
+
26209
+
22074
26210
  require.alias("pluma-assimilate/dist/assimilate.js", "indemma/deps/assimilate/dist/assimilate.js");
22075
26211
  require.alias("pluma-assimilate/dist/assimilate.js", "indemma/deps/assimilate/index.js");
22076
26212
  require.alias("pluma-assimilate/dist/assimilate.js", "assimilate/index.js");
22077
26213
  require.alias("pluma-assimilate/dist/assimilate.js", "pluma-assimilate/index.js");
22078
-
22079
26214
  require.alias("component-type/index.js", "indemma/deps/type/index.js");
22080
26215
  require.alias("component-type/index.js", "type/index.js");
22081
26216
 
@@ -22102,3 +26237,35 @@ require.alias("indefinido-advisable/lib/advisable.js", "indemma/deps/advisable/l
22102
26237
  require.alias("indefinido-advisable/index.js", "advisable/index.js");
22103
26238
  require.alias("component-jquery/index.js", "indefinido-advisable/deps/jquery/index.js");
22104
26239
 
26240
+ require.alias("chaijs-chai/index.js", "indemma/deps/chai/index.js");
26241
+ require.alias("chaijs-chai/lib/chai.js", "indemma/deps/chai/lib/chai.js");
26242
+ require.alias("chaijs-chai/lib/chai/assertion.js", "indemma/deps/chai/lib/chai/assertion.js");
26243
+ require.alias("chaijs-chai/lib/chai/core/assertions.js", "indemma/deps/chai/lib/chai/core/assertions.js");
26244
+ require.alias("chaijs-chai/lib/chai/interface/assert.js", "indemma/deps/chai/lib/chai/interface/assert.js");
26245
+ require.alias("chaijs-chai/lib/chai/interface/expect.js", "indemma/deps/chai/lib/chai/interface/expect.js");
26246
+ require.alias("chaijs-chai/lib/chai/interface/should.js", "indemma/deps/chai/lib/chai/interface/should.js");
26247
+ require.alias("chaijs-chai/lib/chai/utils/addChainableMethod.js", "indemma/deps/chai/lib/chai/utils/addChainableMethod.js");
26248
+ require.alias("chaijs-chai/lib/chai/utils/addMethod.js", "indemma/deps/chai/lib/chai/utils/addMethod.js");
26249
+ require.alias("chaijs-chai/lib/chai/utils/addProperty.js", "indemma/deps/chai/lib/chai/utils/addProperty.js");
26250
+ require.alias("chaijs-chai/lib/chai/utils/eql.js", "indemma/deps/chai/lib/chai/utils/eql.js");
26251
+ require.alias("chaijs-chai/lib/chai/utils/flag.js", "indemma/deps/chai/lib/chai/utils/flag.js");
26252
+ require.alias("chaijs-chai/lib/chai/utils/getActual.js", "indemma/deps/chai/lib/chai/utils/getActual.js");
26253
+ require.alias("chaijs-chai/lib/chai/utils/getEnumerableProperties.js", "indemma/deps/chai/lib/chai/utils/getEnumerableProperties.js");
26254
+ require.alias("chaijs-chai/lib/chai/utils/getMessage.js", "indemma/deps/chai/lib/chai/utils/getMessage.js");
26255
+ require.alias("chaijs-chai/lib/chai/utils/getName.js", "indemma/deps/chai/lib/chai/utils/getName.js");
26256
+ require.alias("chaijs-chai/lib/chai/utils/getPathValue.js", "indemma/deps/chai/lib/chai/utils/getPathValue.js");
26257
+ require.alias("chaijs-chai/lib/chai/utils/getProperties.js", "indemma/deps/chai/lib/chai/utils/getProperties.js");
26258
+ require.alias("chaijs-chai/lib/chai/utils/index.js", "indemma/deps/chai/lib/chai/utils/index.js");
26259
+ require.alias("chaijs-chai/lib/chai/utils/inspect.js", "indemma/deps/chai/lib/chai/utils/inspect.js");
26260
+ require.alias("chaijs-chai/lib/chai/utils/objDisplay.js", "indemma/deps/chai/lib/chai/utils/objDisplay.js");
26261
+ require.alias("chaijs-chai/lib/chai/utils/overwriteMethod.js", "indemma/deps/chai/lib/chai/utils/overwriteMethod.js");
26262
+ require.alias("chaijs-chai/lib/chai/utils/overwriteProperty.js", "indemma/deps/chai/lib/chai/utils/overwriteProperty.js");
26263
+ require.alias("chaijs-chai/lib/chai/utils/test.js", "indemma/deps/chai/lib/chai/utils/test.js");
26264
+ require.alias("chaijs-chai/lib/chai/utils/transferFlags.js", "indemma/deps/chai/lib/chai/utils/transferFlags.js");
26265
+ require.alias("chaijs-chai/lib/chai/utils/type.js", "indemma/deps/chai/lib/chai/utils/type.js");
26266
+ require.alias("chaijs-chai/index.js", "indemma/deps/chai/index.js");
26267
+ require.alias("chaijs-chai/index.js", "chai/index.js");
26268
+ require.alias("chaijs-assertion-error/index.js", "chaijs-chai/deps/assertion-error/index.js");
26269
+ require.alias("chaijs-assertion-error/index.js", "chaijs-chai/deps/assertion-error/index.js");
26270
+ require.alias("chaijs-assertion-error/index.js", "chaijs-assertion-error/index.js");
26271
+ require.alias("chaijs-chai/index.js", "chaijs-chai/index.js");