konacha 3.0.0 → 3.1.0

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9706057c4d4f50ab91f189c6a9c116e0990795c6
4
+ data.tar.gz: 34ca0d65cb02b227dbb22dcce18ec0e9e91d1927
5
+ SHA512:
6
+ metadata.gz: 28e650c18b0f41f2ccd199c3b8b1eca3c62ecebf06e117d06ca0aa0ee3242d7e8dc9a94d4898504c82129f95f5ba1e822626b7fb373e34ce51c41c8fde1d7e2d
7
+ data.tar.gz: b0f2fd3fbb0a117345ee85804e970a1bbaf047718c5a73354b616fd098d899829e8e6e58fccb9b66f0ef97105f69a1ab4b8f1e493acd1b12b734acb9ea742499
data/.gitignore CHANGED
@@ -5,6 +5,7 @@ bin
5
5
  .config
6
6
  .yardoc
7
7
  Gemfile.lock
8
+ Gemfile-rails3.lock
8
9
  InstalledFiles
9
10
  _yardoc
10
11
  coverage
data/.travis.yml CHANGED
@@ -4,10 +4,7 @@ rvm:
4
4
  - 2.0.0
5
5
  gemfile:
6
6
  - Gemfile
7
- - Gemfile-rails4
7
+ - Gemfile-rails3
8
8
  before_script:
9
9
  - sh -e /etc/init.d/xvfb start
10
10
  - export DISPLAY=:99.0
11
- matrix:
12
- allow_failures:
13
- - { gemfile: Gemfile-rails4 }
data/Gemfile CHANGED
@@ -1,2 +1,5 @@
1
1
  source 'https://rubygems.org'
2
2
  gemspec
3
+
4
+ gem "sprockets-rails"
5
+ gem "activemodel" # https://github.com/rspec/rspec-rails/pull/798
data/Gemfile-rails3 ADDED
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
3
+
4
+ gem "railties", "~> 3.2"
5
+ gem "actionpack", "~> 3.2"
data/History.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # master
2
2
 
3
+ # 3.1.0
4
+
5
+ * Update mocha (1.17.1) and chai (1.9.0)
6
+ * Compatibility with yarjuf RSpec formatter (#164)
7
+ * Improve runner styling (#152)
8
+
3
9
  # 3.0.0
4
10
 
5
11
  * Update mocha (1.10.0)
data/README.md CHANGED
@@ -182,8 +182,8 @@ Konacha can be configured in an initializer, e.g. `config/initializers/konacha.r
182
182
  Konacha.configure do |config|
183
183
  config.spec_dir = "spec/javascripts"
184
184
  config.spec_matcher = /_spec\.|_test\./
185
- config.driver = :selenium
186
185
  config.stylesheets = %w(application)
186
+ config.driver = :selenium
187
187
  end if defined?(Konacha)
188
188
  ```
189
189
 
@@ -192,13 +192,20 @@ environment.
192
192
 
193
193
  The `spec_dir` option tells Konacha where to find JavaScript specs. `spec_matcher`
194
194
  is an object responding to `===` (most likely a `Regexp`); it receives a filename
195
- and should return true if the file is a spec. `driver` names a Capybara driver used
196
- for the `run` task (try `:poltergeist`, after installing
197
- [PhantomJS](https://github.com/jonleighton/poltergeist#installing-phantomjs)).
198
- The `stylesheets` option sets the stylesheets to be linked from the `<head>`
199
- of the test runner iframe.
195
+ and should return true if the file is a spec. The `stylesheets` option sets the
196
+ stylesheets to be linked from the `<head>` of the test runner iframe. `driver`
197
+ names a Capybara driver used for the `run` task. The values above are the defaults.
200
198
 
201
- The values above are the defaults.
199
+ For [PhantomJS](https://github.com/jonleighton/poltergeist#installing-phantomjs)
200
+ support you can use the [poltergeist](https://github.com/jonleighton/poltergeist)
201
+ driver. Require capybara/poltergeist in the configure block:
202
+
203
+ ```ruby
204
+ Konacha.configure do |config|
205
+ require 'capybara/poltergeist'
206
+ config.driver = :poltergeist
207
+ end if defined?(Konacha)
208
+ ```
202
209
 
203
210
  ## Test Interface and Assertions
204
211
 
@@ -13,7 +13,7 @@ body {
13
13
  -o-transform-origin: right top;
14
14
  transform-origin: right top;
15
15
 
16
- width: 1000px;
16
+ width: 55%;
17
17
  height: 700px;
18
18
 
19
19
  position: fixed;
@@ -34,8 +34,14 @@ body {
34
34
  display: none;
35
35
  }
36
36
 
37
+ #mocha {
38
+ width: 40%;
39
+ }
40
+
41
+
37
42
  @media (max-width: 1860px) {
38
43
  .test-context {
44
+ width: 66%;
39
45
  -webkit-transform: scale(0.6666666666);
40
46
  -moz-transform: scale(0.6666666666);
41
47
  -ms-transform: scale(0.6666666666);
@@ -46,6 +52,7 @@ body {
46
52
 
47
53
  @media (max-width: 1550px) {
48
54
  .test-context {
55
+ width: 100%;
49
56
  -webkit-transform: scale(0.5);
50
57
  -moz-transform: scale(0.5);
51
58
  -ms-transform: scale(0.5);
@@ -56,6 +63,7 @@ body {
56
63
 
57
64
  @media (max-width: 1230px) {
58
65
  .test-context {
66
+ width: 150%;
59
67
  -webkit-transform: scale(0.3333333333);
60
68
  -moz-transform: scale(0.3333333333);
61
69
  -ms-transform: scale(0.3333333333);
@@ -66,6 +74,7 @@ body {
66
74
 
67
75
  @media (max-width: 1050px) {
68
76
  .test-context {
77
+ width: 250%;
69
78
  -webkit-transform: scale(0.2);
70
79
  -moz-transform: scale(0.2);
71
80
  -ms-transform: scale(0.2);
data/konacha.gemspec CHANGED
@@ -17,7 +17,7 @@ the asset pipeline and engines.}
17
17
  gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
18
  gem.name = "konacha"
19
19
  gem.require_paths = ["lib"]
20
- gem.version = "3.0.0"
20
+ gem.version = "3.1.0"
21
21
  gem.license = "MIT"
22
22
 
23
23
  gem.add_dependency "railties", ">= 3.1", "< 5"
@@ -27,7 +27,7 @@ the asset pipeline and engines.}
27
27
  gem.add_dependency "colorize"
28
28
 
29
29
  gem.add_development_dependency "jquery-rails"
30
- gem.add_development_dependency "rspec-rails", "~> 2.12"
30
+ gem.add_development_dependency "rspec-rails", "~> 2.14"
31
31
  gem.add_development_dependency "capybara-firebug", "~> 1.1"
32
32
  gem.add_development_dependency "coffee-script"
33
33
  gem.add_development_dependency "ejs"
@@ -10,6 +10,9 @@ module Konacha
10
10
  def initialize(data, parent)
11
11
  @metadata = Metadata.new(data)
12
12
  @parent = parent
13
+ if parent
14
+ update_metadata(example_group: parent.metadata)
15
+ end
13
16
  end
14
17
 
15
18
  delegate :full_description, :description, :location, :file_path, :line_number, :pending, :pending_message, :exception, :execution_result, :to => :metadata
@@ -29,6 +32,10 @@ module Konacha
29
32
  def update_metadata(data)
30
33
  metadata.update(data)
31
34
  end
35
+
36
+ def [](key)
37
+ respond_to?(key) ? send(key) : metadata[key]
38
+ end
32
39
  end
33
40
  end
34
41
  end
@@ -10,11 +10,15 @@ module Konacha
10
10
  def initialize(data, parent)
11
11
  @metadata = Metadata.new(data)
12
12
  @parent = parent
13
+ if parent
14
+ update_metadata(example_group: parent.metadata)
15
+ end
13
16
  end
14
17
 
15
18
  delegate :full_description, :description, :file_path, :described_class, :to => :metadata
16
19
 
17
20
  alias_method :display_name, :description
21
+ alias_method :example_group, :parent
18
22
 
19
23
  def parent_groups
20
24
  ancestor = parent
@@ -32,6 +36,10 @@ module Konacha
32
36
  def update_metadata(data)
33
37
  metadata.update(data)
34
38
  end
39
+
40
+ def [](key)
41
+ respond_to?(key) ? send(key) : metadata[key]
42
+ end
35
43
  end
36
44
  end
37
45
  end
@@ -2,7 +2,6 @@ require File.expand_path('../boot', __FILE__)
2
2
 
3
3
  require "action_controller/railtie"
4
4
  require "action_view/railtie"
5
- require "active_model/railtie" # https://github.com/rspec/rspec-rails/pull/642
6
5
  require "sprockets/railtie"
7
6
 
8
7
  if defined?(Bundler)
@@ -6,9 +6,14 @@ describe Konacha::Reporter::ExampleGroup do
6
6
  describe "#initialize" do
7
7
  it "loads up a metadata instance and the parent" do
8
8
  data = double('data')
9
- parent = double('parent')
10
- example_group = described_class.new(data, parent)
9
+ parent_metadata = Konacha::Reporter::Metadata.new({})
10
+ parent = double('parent', metadata: parent_metadata)
11
+
12
+ # Check if parent metadata is added to metadata
13
+ described_class.any_instance.stub(:update_metadata) { nil }
14
+ described_class.any_instance.should_receive(:update_metadata).with(example_group: parent_metadata)
11
15
 
16
+ example_group = described_class.new(data, parent)
12
17
  example_group.parent.should == parent
13
18
  example_group.metadata.should be_a(Konacha::Reporter::Metadata)
14
19
  example_group.metadata.data.should == data
@@ -61,4 +66,21 @@ describe Konacha::Reporter::ExampleGroup do
61
66
  subject.update_metadata(data)
62
67
  end
63
68
  end
69
+
70
+ describe "#[]" do
71
+ it "should delegate to instance method if it exists" do
72
+ subject.stub(:some_method) { nil }
73
+ subject.stub(:metadata) { nil }
74
+ subject.should_receive(:some_method)
75
+ subject.should_not_receive(:metadata)
76
+ subject[:some_method]
77
+ end
78
+
79
+ it "should delegate to metadata if no method exists" do
80
+ subject.should_not respond_to(:some_method)
81
+ subject.metadata.stub(:[]) { nil }
82
+ subject.metadata.should_receive(:[]).with(:some_method)
83
+ subject[:some_method]
84
+ end
85
+ end
64
86
  end
@@ -6,9 +6,14 @@ describe Konacha::Reporter::Example do
6
6
  describe "#initialize" do
7
7
  it "loads up a metadata instance and the parent" do
8
8
  data = double('data')
9
- parent = double('parent')
10
- example = described_class.new(data, parent)
9
+ parent_metadata = Konacha::Reporter::Metadata.new({})
10
+ parent = double('parent', metadata: parent_metadata)
11
+
12
+ # Check if parent metadata is added to metadata
13
+ described_class.any_instance.stub(:update_metadata) { nil }
14
+ described_class.any_instance.should_receive(:update_metadata).with(example_group: parent_metadata)
11
15
 
16
+ example = described_class.new(data, parent)
12
17
  example.parent.should == parent
13
18
  example.metadata.should be_a(Konacha::Reporter::Metadata)
14
19
  example.metadata.data.should == data
@@ -74,4 +79,21 @@ describe Konacha::Reporter::Example do
74
79
  subject.update_metadata(data)
75
80
  end
76
81
  end
82
+
83
+ describe "#[]" do
84
+ it "should delegate to instance method if it exists" do
85
+ subject.stub(:some_method) { nil }
86
+ subject.stub(:metadata) { nil }
87
+ subject.should_receive(:some_method)
88
+ subject.should_not_receive(:metadata)
89
+ subject[:some_method]
90
+ end
91
+
92
+ it "should delegate to metadata if no method exists" do
93
+ subject.should_not respond_to(:some_method)
94
+ subject.metadata.stub(:[]) { nil }
95
+ subject.metadata.should_receive(:[]).with(:some_method)
96
+ subject[:some_method]
97
+ end
98
+ end
77
99
  end
data/spec/runner_spec.rb CHANGED
@@ -140,7 +140,7 @@ describe Konacha::Runner do
140
140
  subject.reporter.should_receive(:process_mocha_event).with(pass)
141
141
  subject.reporter.should_receive(:process_mocha_event).with(pending)
142
142
  subject.reporter.should_receive(:process_mocha_event).with(end_event)
143
- subject.reporter.should_receive(:process_mocha_event).any_number_of_times
143
+ subject.reporter.stub(:process_mocha_event)
144
144
  subject.run
145
145
  end
146
146
 
@@ -27,10 +27,14 @@ function require(path, parent, orig) {
27
27
  // perform real require()
28
28
  // by invoking the module's
29
29
  // registered function
30
- if (!module.exports) {
31
- module.exports = {};
32
- module.client = module.component = true;
33
- module.call(this, module.exports, require.relative(resolved), module);
30
+ if (!module._resolving && !module.exports) {
31
+ var mod = {};
32
+ mod.exports = {};
33
+ mod.client = mod.component = true;
34
+ module._resolving = true;
35
+ module.call(this, mod.exports, require.relative(resolved), mod);
36
+ delete module._resolving;
37
+ module.exports = mod.exports;
34
38
  }
35
39
 
36
40
  return module.exports;
@@ -64,7 +68,6 @@ require.aliases = {};
64
68
 
65
69
  require.resolve = function(path) {
66
70
  if (path.charAt(0) === '/') path = path.slice(1);
67
- var index = path + '/index.js';
68
71
 
69
72
  var paths = [
70
73
  path,
@@ -77,10 +80,7 @@ require.resolve = function(path) {
77
80
  for (var i = 0; i < paths.length; i++) {
78
81
  var path = paths[i];
79
82
  if (require.modules.hasOwnProperty(path)) return path;
80
- }
81
-
82
- if (require.aliases.hasOwnProperty(index)) {
83
- return require.aliases[index];
83
+ if (require.aliases.hasOwnProperty(path)) return require.aliases[path];
84
84
  }
85
85
  };
86
86
 
@@ -200,287 +200,745 @@ require.relative = function(parent) {
200
200
 
201
201
  return localRequire;
202
202
  };
203
- require.register("chai/index.js", function(exports, require, module){
204
- module.exports = require('./lib/chai');
205
-
206
- });
207
- require.register("chai/lib/chai.js", function(exports, require, module){
203
+ require.register("chaijs-assertion-error/index.js", function(exports, require, module){
208
204
  /*!
209
- * chai
210
- * Copyright(c) 2011-2013 Jake Luer <jake@alogicalparadox.com>
205
+ * assertion-error
206
+ * Copyright(c) 2013 Jake Luer <jake@qualiancy.com>
211
207
  * MIT Licensed
212
208
  */
213
209
 
214
- var used = []
215
- , exports = module.exports = {};
210
+ /*!
211
+ * Return a function that will copy properties from
212
+ * one object to another excluding any originally
213
+ * listed. Returned function will create a new `{}`.
214
+ *
215
+ * @param {String} excluded properties ...
216
+ * @return {Function}
217
+ */
218
+
219
+ function exclude () {
220
+ var excludes = [].slice.call(arguments);
221
+
222
+ function excludeProps (res, obj) {
223
+ Object.keys(obj).forEach(function (key) {
224
+ if (!~excludes.indexOf(key)) res[key] = obj[key];
225
+ });
226
+ }
227
+
228
+ return function extendExclude () {
229
+ var args = [].slice.call(arguments)
230
+ , i = 0
231
+ , res = {};
232
+
233
+ for (; i < args.length; i++) {
234
+ excludeProps(res, args[i]);
235
+ }
236
+
237
+ return res;
238
+ };
239
+ };
216
240
 
217
241
  /*!
218
- * Chai version
242
+ * Primary Exports
243
+ */
244
+
245
+ module.exports = AssertionError;
246
+
247
+ /**
248
+ * ### AssertionError
249
+ *
250
+ * An extension of the JavaScript `Error` constructor for
251
+ * assertion and validation scenarios.
252
+ *
253
+ * @param {String} message
254
+ * @param {Object} properties to include (optional)
255
+ * @param {callee} start stack function (optional)
219
256
  */
220
257
 
221
- exports.version = '1.6.0';
258
+ function AssertionError (message, _props, ssf) {
259
+ var extend = exclude('name', 'message', 'stack', 'constructor', 'toJSON')
260
+ , props = extend(_props || {});
261
+
262
+ // default values
263
+ this.message = message || 'Unspecified AssertionError';
264
+ this.showDiff = false;
265
+
266
+ // copy from properties
267
+ for (var key in props) {
268
+ this[key] = props[key];
269
+ }
270
+
271
+ // capture stack trace
272
+ ssf = ssf || arguments.callee;
273
+ if (ssf && Error.captureStackTrace) {
274
+ Error.captureStackTrace(this, ssf);
275
+ }
276
+ }
222
277
 
223
278
  /*!
224
- * Primary `Assertion` prototype
279
+ * Inherit from Error.prototype
225
280
  */
226
281
 
227
- exports.Assertion = require('./chai/assertion');
282
+ AssertionError.prototype = Object.create(Error.prototype);
228
283
 
229
284
  /*!
230
- * Assertion Error
285
+ * Statically set name
231
286
  */
232
287
 
233
- exports.AssertionError = require('./chai/error');
288
+ AssertionError.prototype.name = 'AssertionError';
234
289
 
235
290
  /*!
236
- * Utils for plugins (not exported)
291
+ * Ensure correct constructor
237
292
  */
238
293
 
239
- var util = require('./chai/utils');
294
+ AssertionError.prototype.constructor = AssertionError;
240
295
 
241
296
  /**
242
- * # .use(function)
297
+ * Allow errors to be converted to JSON for static transfer.
243
298
  *
244
- * Provides a way to extend the internals of Chai
245
- *
246
- * @param {Function}
247
- * @returns {this} for chaining
248
- * @api public
299
+ * @param {Boolean} include stack (default: `true`)
300
+ * @return {Object} object that can be `JSON.stringify`
249
301
  */
250
302
 
251
- exports.use = function (fn) {
252
- if (!~used.indexOf(fn)) {
253
- fn(this, util);
254
- used.push(fn);
303
+ AssertionError.prototype.toJSON = function (stack) {
304
+ var extend = exclude('constructor', 'toJSON', 'stack')
305
+ , props = extend({ name: this.name }, this);
306
+
307
+ // include stack if exists and not turned off
308
+ if (false !== stack && this.stack) {
309
+ props.stack = this.stack;
255
310
  }
256
311
 
257
- return this;
312
+ return props;
258
313
  };
259
314
 
315
+ });
316
+ require.register("chaijs-type-detect/lib/type.js", function(exports, require, module){
260
317
  /*!
261
- * Core Assertions
318
+ * type-detect
319
+ * Copyright(c) 2013 jake luer <jake@alogicalparadox.com>
320
+ * MIT Licensed
262
321
  */
263
322
 
264
- var core = require('./chai/core/assertions');
265
- exports.use(core);
266
-
267
323
  /*!
268
- * Expect interface
324
+ * Primary Exports
269
325
  */
270
326
 
271
- var expect = require('./chai/interface/expect');
272
- exports.use(expect);
327
+ var exports = module.exports = getType;
273
328
 
274
329
  /*!
275
- * Should interface
330
+ * Detectable javascript natives
276
331
  */
277
332
 
278
- var should = require('./chai/interface/should');
279
- exports.use(should);
333
+ var natives = {
334
+ '[object Array]': 'array'
335
+ , '[object RegExp]': 'regexp'
336
+ , '[object Function]': 'function'
337
+ , '[object Arguments]': 'arguments'
338
+ , '[object Date]': 'date'
339
+ };
280
340
 
281
- /*!
282
- * Assert interface
341
+ /**
342
+ * ### typeOf (obj)
343
+ *
344
+ * Use several different techniques to determine
345
+ * the type of object being tested.
346
+ *
347
+ *
348
+ * @param {Mixed} object
349
+ * @return {String} object type
350
+ * @api public
283
351
  */
284
352
 
285
- var assert = require('./chai/interface/assert');
286
- exports.use(assert);
353
+ function getType (obj) {
354
+ var str = Object.prototype.toString.call(obj);
355
+ if (natives[str]) return natives[str];
356
+ if (obj === null) return 'null';
357
+ if (obj === undefined) return 'undefined';
358
+ if (obj === Object(obj)) return 'object';
359
+ return typeof obj;
360
+ }
361
+
362
+ exports.Library = Library;
363
+
364
+ /**
365
+ * ### Library
366
+ *
367
+ * Create a repository for custom type detection.
368
+ *
369
+ * ```js
370
+ * var lib = new type.Library;
371
+ * ```
372
+ *
373
+ */
374
+
375
+ function Library () {
376
+ this.tests = {};
377
+ }
378
+
379
+ /**
380
+ * #### .of (obj)
381
+ *
382
+ * Expose replacement `typeof` detection to the library.
383
+ *
384
+ * ```js
385
+ * if ('string' === lib.of('hello world')) {
386
+ * // ...
387
+ * }
388
+ * ```
389
+ *
390
+ * @param {Mixed} object to test
391
+ * @return {String} type
392
+ */
393
+
394
+ Library.prototype.of = getType;
395
+
396
+ /**
397
+ * #### .define (type, test)
398
+ *
399
+ * Add a test to for the `.test()` assertion.
400
+ *
401
+ * Can be defined as a regular expression:
402
+ *
403
+ * ```js
404
+ * lib.define('int', /^[0-9]+$/);
405
+ * ```
406
+ *
407
+ * ... or as a function:
408
+ *
409
+ * ```js
410
+ * lib.define('bln', function (obj) {
411
+ * if ('boolean' === lib.of(obj)) return true;
412
+ * var blns = [ 'yes', 'no', 'true', 'false', 1, 0 ];
413
+ * if ('string' === lib.of(obj)) obj = obj.toLowerCase();
414
+ * return !! ~blns.indexOf(obj);
415
+ * });
416
+ * ```
417
+ *
418
+ * @param {String} type
419
+ * @param {RegExp|Function} test
420
+ * @api public
421
+ */
422
+
423
+ Library.prototype.define = function (type, test) {
424
+ if (arguments.length === 1) return this.tests[type];
425
+ this.tests[type] = test;
426
+ return this;
427
+ };
428
+
429
+ /**
430
+ * #### .test (obj, test)
431
+ *
432
+ * Assert that an object is of type. Will first
433
+ * check natives, and if that does not pass it will
434
+ * use the user defined custom tests.
435
+ *
436
+ * ```js
437
+ * assert(lib.test('1', 'int'));
438
+ * assert(lib.test('yes', 'bln'));
439
+ * ```
440
+ *
441
+ * @param {Mixed} object
442
+ * @param {String} type
443
+ * @return {Boolean} result
444
+ * @api public
445
+ */
446
+
447
+ Library.prototype.test = function (obj, type) {
448
+ if (type === getType(obj)) return true;
449
+ var test = this.tests[type];
450
+
451
+ if (test && 'regexp' === getType(test)) {
452
+ return test.test(obj);
453
+ } else if (test && 'function' === getType(test)) {
454
+ return test(obj);
455
+ } else {
456
+ throw new ReferenceError('Type test "' + type + '" not defined or invalid.');
457
+ }
458
+ };
287
459
 
288
460
  });
289
- require.register("chai/lib/chai/assertion.js", function(exports, require, module){
461
+ require.register("chaijs-deep-eql/lib/eql.js", function(exports, require, module){
290
462
  /*!
291
- * chai
292
- * http://chaijs.com
293
- * Copyright(c) 2011-2013 Jake Luer <jake@alogicalparadox.com>
463
+ * deep-eql
464
+ * Copyright(c) 2013 Jake Luer <jake@alogicalparadox.com>
294
465
  * MIT Licensed
295
466
  */
296
467
 
297
468
  /*!
298
- * Module dependencies.
469
+ * Module dependencies
299
470
  */
300
471
 
301
- var AssertionError = require('./error')
302
- , util = require('./utils')
303
- , flag = util.flag;
472
+ var type = require('type-detect');
304
473
 
305
474
  /*!
306
- * Module export.
475
+ * Buffer.isBuffer browser shim
307
476
  */
308
477
 
309
- module.exports = Assertion;
478
+ var Buffer;
479
+ try { Buffer = require('buffer').Buffer; }
480
+ catch(ex) {
481
+ Buffer = {};
482
+ Buffer.isBuffer = function() { return false; }
483
+ }
310
484
 
485
+ /*!
486
+ * Primary Export
487
+ */
488
+
489
+ module.exports = deepEqual;
490
+
491
+ /**
492
+ * Assert super-strict (egal) equality between
493
+ * two objects of any type.
494
+ *
495
+ * @param {Mixed} a
496
+ * @param {Mixed} b
497
+ * @param {Array} memoised (optional)
498
+ * @return {Boolean} equal match
499
+ */
500
+
501
+ function deepEqual(a, b, m) {
502
+ if (sameValue(a, b)) {
503
+ return true;
504
+ } else if ('date' === type(a)) {
505
+ return dateEqual(a, b);
506
+ } else if ('regexp' === type(a)) {
507
+ return regexpEqual(a, b);
508
+ } else if (Buffer.isBuffer(a)) {
509
+ return bufferEqual(a, b);
510
+ } else if ('arguments' === type(a)) {
511
+ return argumentsEqual(a, b, m);
512
+ } else if (!typeEqual(a, b)) {
513
+ return false;
514
+ } else if (('object' !== type(a) && 'object' !== type(b))
515
+ && ('array' !== type(a) && 'array' !== type(b))) {
516
+ return sameValue(a, b);
517
+ } else {
518
+ return objectEqual(a, b, m);
519
+ }
520
+ }
311
521
 
312
522
  /*!
313
- * Assertion Constructor
523
+ * Strict (egal) equality test. Ensures that NaN always
524
+ * equals NaN and `-0` does not equal `+0`.
314
525
  *
315
- * Creates object for chaining.
526
+ * @param {Mixed} a
527
+ * @param {Mixed} b
528
+ * @return {Boolean} equal match
529
+ */
530
+
531
+ function sameValue(a, b) {
532
+ if (a === b) return a !== 0 || 1 / a === 1 / b;
533
+ return a !== a && b !== b;
534
+ }
535
+
536
+ /*!
537
+ * Compare the types of two given objects and
538
+ * return if they are equal. Note that an Array
539
+ * has a type of `array` (not `object`) and arguments
540
+ * have a type of `arguments` (not `array`/`object`).
316
541
  *
317
- * @api private
542
+ * @param {Mixed} a
543
+ * @param {Mixed} b
544
+ * @return {Boolean} result
318
545
  */
319
546
 
320
- function Assertion (obj, msg, stack) {
321
- flag(this, 'ssfi', stack || arguments.callee);
322
- flag(this, 'object', obj);
323
- flag(this, 'message', msg);
547
+ function typeEqual(a, b) {
548
+ return type(a) === type(b);
324
549
  }
325
550
 
326
551
  /*!
327
- * ### Assertion.includeStack
328
- *
329
- * User configurable property, influences whether stack trace
330
- * is included in Assertion error message. Default of false
331
- * suppresses stack trace in the error message
332
- *
333
- * Assertion.includeStack = true; // enable stack on error
334
- *
335
- * @api public
336
- */
337
-
338
- Assertion.includeStack = false;
552
+ * Compare two Date objects by asserting that
553
+ * the time values are equal using `saveValue`.
554
+ *
555
+ * @param {Date} a
556
+ * @param {Date} b
557
+ * @return {Boolean} result
558
+ */
559
+
560
+ function dateEqual(a, b) {
561
+ if ('date' !== type(b)) return false;
562
+ return sameValue(a.getTime(), b.getTime());
563
+ }
339
564
 
340
565
  /*!
341
- * ### Assertion.showDiff
566
+ * Compare two regular expressions by converting them
567
+ * to string and checking for `sameValue`.
342
568
  *
343
- * User configurable property, influences whether or not
344
- * the `showDiff` flag should be included in the thrown
345
- * AssertionErrors. `false` will always be `false`; `true`
346
- * will be true when the assertion has requested a diff
347
- * be shown.
569
+ * @param {RegExp} a
570
+ * @param {RegExp} b
571
+ * @return {Boolean} result
572
+ */
573
+
574
+ function regexpEqual(a, b) {
575
+ if ('regexp' !== type(b)) return false;
576
+ return sameValue(a.toString(), b.toString());
577
+ }
578
+
579
+ /*!
580
+ * Assert deep equality of two `arguments` objects.
581
+ * Unfortunately, these must be sliced to arrays
582
+ * prior to test to ensure no bad behavior.
348
583
  *
349
- * @api public
584
+ * @param {Arguments} a
585
+ * @param {Arguments} b
586
+ * @param {Array} memoize (optional)
587
+ * @return {Boolean} result
350
588
  */
351
589
 
352
- Assertion.showDiff = true;
590
+ function argumentsEqual(a, b, m) {
591
+ if ('arguments' !== type(b)) return false;
592
+ a = [].slice.call(a);
593
+ b = [].slice.call(b);
594
+ return deepEqual(a, b, m);
595
+ }
353
596
 
354
- Assertion.addProperty = function (name, fn) {
355
- util.addProperty(this.prototype, name, fn);
356
- };
597
+ /*!
598
+ * Get enumerable properties of a given object.
599
+ *
600
+ * @param {Object} a
601
+ * @return {Array} property names
602
+ */
357
603
 
358
- Assertion.addMethod = function (name, fn) {
359
- util.addMethod(this.prototype, name, fn);
360
- };
604
+ function enumerable(a) {
605
+ var res = [];
606
+ for (var key in a) res.push(key);
607
+ return res;
608
+ }
361
609
 
362
- Assertion.addChainableMethod = function (name, fn, chainingBehavior) {
363
- util.addChainableMethod(this.prototype, name, fn, chainingBehavior);
364
- };
610
+ /*!
611
+ * Simple equality for flat iterable objects
612
+ * such as Arrays or Node.js buffers.
613
+ *
614
+ * @param {Iterable} a
615
+ * @param {Iterable} b
616
+ * @return {Boolean} result
617
+ */
365
618
 
366
- Assertion.overwriteProperty = function (name, fn) {
367
- util.overwriteProperty(this.prototype, name, fn);
368
- };
619
+ function iterableEqual(a, b) {
620
+ if (a.length !== b.length) return false;
369
621
 
370
- Assertion.overwriteMethod = function (name, fn) {
371
- util.overwriteMethod(this.prototype, name, fn);
372
- };
622
+ var i = 0;
623
+ var match = true;
624
+
625
+ for (; i < a.length; i++) {
626
+ if (a[i] !== b[i]) {
627
+ match = false;
628
+ break;
629
+ }
630
+ }
631
+
632
+ return match;
633
+ }
373
634
 
374
635
  /*!
375
- * ### .assert(expression, message, negateMessage, expected, actual)
636
+ * Extension to `iterableEqual` specifically
637
+ * for Node.js Buffers.
376
638
  *
377
- * Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass.
378
- *
379
- * @name assert
380
- * @param {Philosophical} expression to be tested
381
- * @param {String} message to display if fails
382
- * @param {String} negatedMessage to display if negated expression fails
383
- * @param {Mixed} expected value (remember to check for negation)
384
- * @param {Mixed} actual (optional) will default to `this.obj`
385
- * @api private
639
+ * @param {Buffer} a
640
+ * @param {Mixed} b
641
+ * @return {Boolean} result
386
642
  */
387
643
 
388
- Assertion.prototype.assert = function (expr, msg, negateMsg, expected, _actual, showDiff) {
389
- var ok = util.test(this, arguments);
390
- if (true !== showDiff) showDiff = false;
391
- if (true !== Assertion.showDiff) showDiff = false;
392
-
393
- if (!ok) {
394
- var msg = util.getMessage(this, arguments)
395
- , actual = util.getActual(this, arguments);
396
- throw new AssertionError({
397
- message: msg
398
- , actual: actual
399
- , expected: expected
400
- , stackStartFunction: (Assertion.includeStack) ? this.assert : flag(this, 'ssfi')
401
- , showDiff: showDiff
402
- });
403
- }
404
- };
644
+ function bufferEqual(a, b) {
645
+ if (!Buffer.isBuffer(b)) return false;
646
+ return iterableEqual(a, b);
647
+ }
405
648
 
406
649
  /*!
407
- * ### ._obj
650
+ * Block for `objectEqual` ensuring non-existing
651
+ * values don't get in.
408
652
  *
409
- * Quick reference to stored `actual` value for plugin developers.
653
+ * @param {Mixed} object
654
+ * @return {Boolean} result
655
+ */
656
+
657
+ function isValue(a) {
658
+ return a !== null && a !== undefined;
659
+ }
660
+
661
+ /*!
662
+ * Recursively check the equality of two objects.
663
+ * Once basic sameness has been established it will
664
+ * defer to `deepEqual` for each enumerable key
665
+ * in the object.
410
666
  *
411
- * @api private
667
+ * @param {Mixed} a
668
+ * @param {Mixed} b
669
+ * @return {Boolean} result
412
670
  */
413
671
 
414
- Object.defineProperty(Assertion.prototype, '_obj',
415
- { get: function () {
416
- return flag(this, 'object');
672
+ function objectEqual(a, b, m) {
673
+ if (!isValue(a) || !isValue(b)) {
674
+ return false;
675
+ }
676
+
677
+ if (a.prototype !== b.prototype) {
678
+ return false;
679
+ }
680
+
681
+ var i;
682
+ if (m) {
683
+ for (i = 0; i < m.length; i++) {
684
+ if ((m[i][0] === a && m[i][1] === b)
685
+ || (m[i][0] === b && m[i][1] === a)) {
686
+ return true;
687
+ }
417
688
  }
418
- , set: function (val) {
419
- flag(this, 'object', val);
689
+ } else {
690
+ m = [];
691
+ }
692
+
693
+ try {
694
+ var ka = enumerable(a);
695
+ var kb = enumerable(b);
696
+ } catch (ex) {
697
+ return false;
698
+ }
699
+
700
+ ka.sort();
701
+ kb.sort();
702
+
703
+ if (!iterableEqual(ka, kb)) {
704
+ return false;
705
+ }
706
+
707
+ m.push([ a, b ]);
708
+
709
+ var key;
710
+ for (i = ka.length - 1; i >= 0; i--) {
711
+ key = ka[i];
712
+ if (!deepEqual(a[key], b[key], m)) {
713
+ return false;
420
714
  }
715
+ }
716
+
717
+ return true;
718
+ }
719
+
421
720
  });
721
+ require.register("chai/index.js", function(exports, require, module){
722
+ module.exports = require('./lib/chai');
422
723
 
423
724
  });
424
- require.register("chai/lib/chai/error.js", function(exports, require, module){
725
+ require.register("chai/lib/chai.js", function(exports, require, module){
425
726
  /*!
426
727
  * chai
427
- * Copyright(c) 2011-2013 Jake Luer <jake@alogicalparadox.com>
728
+ * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com>
428
729
  * MIT Licensed
429
730
  */
430
731
 
732
+ var used = []
733
+ , exports = module.exports = {};
734
+
431
735
  /*!
432
- * Main export
736
+ * Chai version
433
737
  */
434
738
 
435
- module.exports = AssertionError;
739
+ exports.version = '1.8.1';
740
+
741
+ /*!
742
+ * Assertion Error
743
+ */
744
+
745
+ exports.AssertionError = require('assertion-error');
746
+
747
+ /*!
748
+ * Utils for plugins (not exported)
749
+ */
750
+
751
+ var util = require('./chai/utils');
436
752
 
437
753
  /**
438
- * # AssertionError (constructor)
439
- *
440
- * Create a new assertion error based on the Javascript
441
- * `Error` prototype.
754
+ * # .use(function)
442
755
  *
443
- * **Options**
444
- * - message
445
- * - actual
446
- * - expected
447
- * - operator
448
- * - startStackFunction
756
+ * Provides a way to extend the internals of Chai
449
757
  *
450
- * @param {Object} options
758
+ * @param {Function}
759
+ * @returns {this} for chaining
451
760
  * @api public
452
761
  */
453
762
 
454
- function AssertionError (options) {
455
- options = options || {};
456
- this.message = options.message;
457
- this.actual = options.actual;
458
- this.expected = options.expected;
459
- this.operator = options.operator;
460
- this.showDiff = options.showDiff;
461
-
462
- if (options.stackStartFunction && Error.captureStackTrace) {
463
- var stackStartFunction = options.stackStartFunction;
464
- Error.captureStackTrace(this, stackStartFunction);
763
+ exports.use = function (fn) {
764
+ if (!~used.indexOf(fn)) {
765
+ fn(this, util);
766
+ used.push(fn);
465
767
  }
466
- }
768
+
769
+ return this;
770
+ };
467
771
 
468
772
  /*!
469
- * Inherit from Error
773
+ * Primary `Assertion` prototype
470
774
  */
471
775
 
472
- AssertionError.prototype = Object.create(Error.prototype);
473
- AssertionError.prototype.name = 'AssertionError';
474
- AssertionError.prototype.constructor = AssertionError;
776
+ var assertion = require('./chai/assertion');
777
+ exports.use(assertion);
475
778
 
476
- /**
477
- * # toString()
478
- *
479
- * Override default to string method
779
+ /*!
780
+ * Core Assertions
781
+ */
782
+
783
+ var core = require('./chai/core/assertions');
784
+ exports.use(core);
785
+
786
+ /*!
787
+ * Expect interface
788
+ */
789
+
790
+ var expect = require('./chai/interface/expect');
791
+ exports.use(expect);
792
+
793
+ /*!
794
+ * Should interface
480
795
  */
481
796
 
482
- AssertionError.prototype.toString = function() {
483
- return this.message;
797
+ var should = require('./chai/interface/should');
798
+ exports.use(should);
799
+
800
+ /*!
801
+ * Assert interface
802
+ */
803
+
804
+ var assert = require('./chai/interface/assert');
805
+ exports.use(assert);
806
+
807
+ });
808
+ require.register("chai/lib/chai/assertion.js", function(exports, require, module){
809
+ /*!
810
+ * chai
811
+ * http://chaijs.com
812
+ * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com>
813
+ * MIT Licensed
814
+ */
815
+
816
+ module.exports = function (_chai, util) {
817
+ /*!
818
+ * Module dependencies.
819
+ */
820
+
821
+ var AssertionError = _chai.AssertionError
822
+ , flag = util.flag;
823
+
824
+ /*!
825
+ * Module export.
826
+ */
827
+
828
+ _chai.Assertion = Assertion;
829
+
830
+ /*!
831
+ * Assertion Constructor
832
+ *
833
+ * Creates object for chaining.
834
+ *
835
+ * @api private
836
+ */
837
+
838
+ function Assertion (obj, msg, stack) {
839
+ flag(this, 'ssfi', stack || arguments.callee);
840
+ flag(this, 'object', obj);
841
+ flag(this, 'message', msg);
842
+ }
843
+
844
+ /*!
845
+ * ### Assertion.includeStack
846
+ *
847
+ * User configurable property, influences whether stack trace
848
+ * is included in Assertion error message. Default of false
849
+ * suppresses stack trace in the error message
850
+ *
851
+ * Assertion.includeStack = true; // enable stack on error
852
+ *
853
+ * @api public
854
+ */
855
+
856
+ Assertion.includeStack = false;
857
+
858
+ /*!
859
+ * ### Assertion.showDiff
860
+ *
861
+ * User configurable property, influences whether or not
862
+ * the `showDiff` flag should be included in the thrown
863
+ * AssertionErrors. `false` will always be `false`; `true`
864
+ * will be true when the assertion has requested a diff
865
+ * be shown.
866
+ *
867
+ * @api public
868
+ */
869
+
870
+ Assertion.showDiff = true;
871
+
872
+ Assertion.addProperty = function (name, fn) {
873
+ util.addProperty(this.prototype, name, fn);
874
+ };
875
+
876
+ Assertion.addMethod = function (name, fn) {
877
+ util.addMethod(this.prototype, name, fn);
878
+ };
879
+
880
+ Assertion.addChainableMethod = function (name, fn, chainingBehavior) {
881
+ util.addChainableMethod(this.prototype, name, fn, chainingBehavior);
882
+ };
883
+
884
+ Assertion.overwriteProperty = function (name, fn) {
885
+ util.overwriteProperty(this.prototype, name, fn);
886
+ };
887
+
888
+ Assertion.overwriteMethod = function (name, fn) {
889
+ util.overwriteMethod(this.prototype, name, fn);
890
+ };
891
+
892
+ Assertion.overwriteChainableMethod = function (name, fn, chainingBehavior) {
893
+ util.overwriteChainableMethod(this.prototype, name, fn, chainingBehavior);
894
+ };
895
+
896
+ /*!
897
+ * ### .assert(expression, message, negateMessage, expected, actual)
898
+ *
899
+ * Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass.
900
+ *
901
+ * @name assert
902
+ * @param {Philosophical} expression to be tested
903
+ * @param {String} message to display if fails
904
+ * @param {String} negatedMessage to display if negated expression fails
905
+ * @param {Mixed} expected value (remember to check for negation)
906
+ * @param {Mixed} actual (optional) will default to `this.obj`
907
+ * @api private
908
+ */
909
+
910
+ Assertion.prototype.assert = function (expr, msg, negateMsg, expected, _actual, showDiff) {
911
+ var ok = util.test(this, arguments);
912
+ if (true !== showDiff) showDiff = false;
913
+ if (true !== Assertion.showDiff) showDiff = false;
914
+
915
+ if (!ok) {
916
+ var msg = util.getMessage(this, arguments)
917
+ , actual = util.getActual(this, arguments);
918
+ throw new AssertionError(msg, {
919
+ actual: actual
920
+ , expected: expected
921
+ , showDiff: showDiff
922
+ }, (Assertion.includeStack) ? this.assert : flag(this, 'ssfi'));
923
+ }
924
+ };
925
+
926
+ /*!
927
+ * ### ._obj
928
+ *
929
+ * Quick reference to stored `actual` value for plugin developers.
930
+ *
931
+ * @api private
932
+ */
933
+
934
+ Object.defineProperty(Assertion.prototype, '_obj',
935
+ { get: function () {
936
+ return flag(this, 'object');
937
+ }
938
+ , set: function (val) {
939
+ flag(this, 'object', val);
940
+ }
941
+ });
484
942
  };
485
943
 
486
944
  });
@@ -488,7 +946,7 @@ require.register("chai/lib/chai/core/assertions.js", function(exports, require,
488
946
  /*!
489
947
  * chai
490
948
  * http://chaijs.com
491
- * Copyright(c) 2011-2013 Jake Luer <jake@alogicalparadox.com>
949
+ * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com>
492
950
  * MIT Licensed
493
951
  */
494
952
 
@@ -500,7 +958,7 @@ module.exports = function (chai, _) {
500
958
  /**
501
959
  * ### Language Chains
502
960
  *
503
- * The following are provide as chainable getters to
961
+ * The following are provided as chainable getters to
504
962
  * improve the readability of your assertions. They
505
963
  * do not provide an testing capability unless they
506
964
  * have been overwritten by a plugin.
@@ -513,6 +971,7 @@ module.exports = function (chai, _) {
513
971
  * - is
514
972
  * - that
515
973
  * - and
974
+ * - has
516
975
  * - have
517
976
  * - with
518
977
  * - at
@@ -524,7 +983,7 @@ module.exports = function (chai, _) {
524
983
  */
525
984
 
526
985
  [ 'to', 'be', 'been'
527
- , 'is', 'and', 'have'
986
+ , 'is', 'and', 'has', 'have'
528
987
  , 'with', 'that', 'at'
529
988
  , 'of', 'same' ].forEach(function (chain) {
530
989
  Assertion.addProperty(chain, function () {
@@ -632,9 +1091,21 @@ module.exports = function (chai, _) {
632
1091
 
633
1092
  function include (val, msg) {
634
1093
  if (msg) flag(this, 'message', msg);
635
- var obj = flag(this, 'object')
1094
+ var obj = flag(this, 'object');
1095
+
1096
+ if (_.type(val) === 'object') {
1097
+ if (!flag(this, 'negate')) {
1098
+ for (var k in val) new Assertion(obj).property(k, val[k]);
1099
+ return;
1100
+ }
1101
+ var subset = {}
1102
+ for (var k in val) subset[k] = obj[k]
1103
+ var expected = _.eql(subset, val);
1104
+ } else {
1105
+ var expected = obj && ~obj.indexOf(val)
1106
+ }
636
1107
  this.assert(
637
- ~obj.indexOf(val)
1108
+ expected
638
1109
  , 'expected #{this} to include ' + _.inspect(val)
639
1110
  , 'expected #{this} to not include ' + _.inspect(val));
640
1111
  }
@@ -731,8 +1202,8 @@ module.exports = function (chai, _) {
731
1202
  *
732
1203
  * Asserts that the target is `undefined`.
733
1204
  *
734
- * expect(undefined).to.be.undefined;
735
- * expect(null).to.not.be.undefined;
1205
+ * expect(undefined).to.be.undefined;
1206
+ * expect(null).to.not.be.undefined;
736
1207
  *
737
1208
  * @name undefined
738
1209
  * @api public
@@ -1489,6 +1960,7 @@ module.exports = function (chai, _) {
1489
1960
  * @param {String|RegExp} expected error message
1490
1961
  * @param {String} message _optional_
1491
1962
  * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types
1963
+ * @returns error for chaining (null if no error)
1492
1964
  * @api public
1493
1965
  */
1494
1966
 
@@ -1513,7 +1985,10 @@ module.exports = function (chai, _) {
1513
1985
  constructor = null;
1514
1986
  errMsg = null;
1515
1987
  } else if (typeof constructor === 'function') {
1516
- name = (new constructor()).name;
1988
+ name = constructor.prototype.name || constructor.name;
1989
+ if (name === 'Error' && constructor !== Error) {
1990
+ name = (new constructor()).name;
1991
+ }
1517
1992
  } else {
1518
1993
  constructor = null;
1519
1994
  }
@@ -1527,12 +2002,14 @@ module.exports = function (chai, _) {
1527
2002
  err === desiredError
1528
2003
  , 'expected #{this} to throw #{exp} but #{act} was thrown'
1529
2004
  , 'expected #{this} to not throw #{exp}'
1530
- , desiredError
1531
- , err
2005
+ , (desiredError instanceof Error ? desiredError.toString() : desiredError)
2006
+ , (err instanceof Error ? err.toString() : err)
1532
2007
  );
1533
2008
 
2009
+ flag(this, 'object', err);
1534
2010
  return this;
1535
2011
  }
2012
+
1536
2013
  // next, check constructor
1537
2014
  if (constructor) {
1538
2015
  this.assert(
@@ -1540,11 +2017,15 @@ module.exports = function (chai, _) {
1540
2017
  , 'expected #{this} to throw #{exp} but #{act} was thrown'
1541
2018
  , 'expected #{this} to not throw #{exp} but #{act} was thrown'
1542
2019
  , name
1543
- , err
2020
+ , (err instanceof Error ? err.toString() : err)
1544
2021
  );
1545
2022
 
1546
- if (!errMsg) return this;
2023
+ if (!errMsg) {
2024
+ flag(this, 'object', err);
2025
+ return this;
2026
+ }
1547
2027
  }
2028
+
1548
2029
  // next, check message
1549
2030
  var message = 'object' === _.type(err) && "message" in err
1550
2031
  ? err.message
@@ -1559,6 +2040,7 @@ module.exports = function (chai, _) {
1559
2040
  , message
1560
2041
  );
1561
2042
 
2043
+ flag(this, 'object', err);
1562
2044
  return this;
1563
2045
  } else if ((message != null) && errMsg && 'string' === typeof errMsg) {
1564
2046
  this.assert(
@@ -1569,6 +2051,7 @@ module.exports = function (chai, _) {
1569
2051
  , message
1570
2052
  );
1571
2053
 
2054
+ flag(this, 'object', err);
1572
2055
  return this;
1573
2056
  } else {
1574
2057
  thrown = true;
@@ -1591,9 +2074,11 @@ module.exports = function (chai, _) {
1591
2074
  thrown === true
1592
2075
  , 'expected #{this} to throw ' + expectedThrown + actuallyGot
1593
2076
  , 'expected #{this} to not throw ' + expectedThrown + actuallyGot
1594
- , desiredError
1595
- , thrownError
2077
+ , (desiredError instanceof Error ? desiredError.toString() : desiredError)
2078
+ , (thrownError instanceof Error ? thrownError.toString() : thrownError)
1596
2079
  );
2080
+
2081
+ flag(this, 'object', thrownError);
1597
2082
  };
1598
2083
 
1599
2084
  Assertion.addMethod('throw', assertThrows);
@@ -1612,8 +2097,8 @@ module.exports = function (chai, _) {
1612
2097
  * To check if a constructor will respond to a static function,
1613
2098
  * set the `itself` flag.
1614
2099
  *
1615
- * Klass.baz = function(){};
1616
- * expect(Klass).itself.to.respondTo('baz');
2100
+ * Klass.baz = function(){};
2101
+ * expect(Klass).itself.to.respondTo('baz');
1617
2102
  *
1618
2103
  * @name respondTo
1619
2104
  * @param {String} method
@@ -1641,12 +2126,12 @@ module.exports = function (chai, _) {
1641
2126
  *
1642
2127
  * Sets the `itself` flag, later used by the `respondTo` assertion.
1643
2128
  *
1644
- * function Foo() {}
1645
- * Foo.bar = function() {}
1646
- * Foo.prototype.baz = function() {}
2129
+ * function Foo() {}
2130
+ * Foo.bar = function() {}
2131
+ * Foo.prototype.baz = function() {}
1647
2132
  *
1648
- * expect(Foo).itself.to.respondTo('bar');
1649
- * expect(Foo).itself.not.to.respondTo('baz');
2133
+ * expect(Foo).itself.to.respondTo('bar');
2134
+ * expect(Foo).itself.not.to.respondTo('baz');
1650
2135
  *
1651
2136
  * @name itself
1652
2137
  * @api public
@@ -1712,16 +2197,16 @@ module.exports = function (chai, _) {
1712
2197
  }
1713
2198
 
1714
2199
  /**
1715
- * ### .members
2200
+ * ### .members(set)
1716
2201
  *
1717
2202
  * Asserts that the target is a superset of `set`,
1718
2203
  * or that the target and `set` have the same members.
1719
2204
  *
1720
- * expect([1, 2, 3]).to.include.members([3, 2]);
1721
- * expect([1, 2, 3]).to.not.include.members([3, 2, 8]);
2205
+ * expect([1, 2, 3]).to.include.members([3, 2]);
2206
+ * expect([1, 2, 3]).to.not.include.members([3, 2, 8]);
1722
2207
  *
1723
- * expect([4, 2]).to.have.members([2, 4]);
1724
- * expect([5, 2]).to.not.have.members([5, 2, 1]);
2208
+ * expect([4, 2]).to.have.members([2, 4]);
2209
+ * expect([5, 2]).to.not.have.members([5, 2, 1]);
1725
2210
  *
1726
2211
  * @name members
1727
2212
  * @param {Array} set
@@ -1760,7 +2245,7 @@ module.exports = function (chai, _) {
1760
2245
  require.register("chai/lib/chai/interface/assert.js", function(exports, require, module){
1761
2246
  /*!
1762
2247
  * chai
1763
- * Copyright(c) 2011-2013 Jake Luer <jake@alogicalparadox.com>
2248
+ * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com>
1764
2249
  * MIT Licensed
1765
2250
  */
1766
2251
 
@@ -1815,13 +2300,12 @@ module.exports = function (chai, util) {
1815
2300
  */
1816
2301
 
1817
2302
  assert.fail = function (actual, expected, message, operator) {
1818
- throw new chai.AssertionError({
2303
+ message = message || 'assert.fail()';
2304
+ throw new chai.AssertionError(message, {
1819
2305
  actual: actual
1820
2306
  , expected: expected
1821
- , message: message
1822
2307
  , operator: operator
1823
- , stackStartFunction: assert.fail
1824
- });
2308
+ }, assert.fail);
1825
2309
  };
1826
2310
 
1827
2311
  /**
@@ -1842,6 +2326,24 @@ module.exports = function (chai, util) {
1842
2326
  new Assertion(val, msg).is.ok;
1843
2327
  };
1844
2328
 
2329
+ /**
2330
+ * ### .notOk(object, [message])
2331
+ *
2332
+ * Asserts that `object` is falsy.
2333
+ *
2334
+ * assert.notOk('everything', 'this will fail');
2335
+ * assert.notOk(false, 'this will pass');
2336
+ *
2337
+ * @name notOk
2338
+ * @param {Mixed} object to test
2339
+ * @param {String} message
2340
+ * @api public
2341
+ */
2342
+
2343
+ assert.notOk = function (val, msg) {
2344
+ new Assertion(val, msg).is.not.ok;
2345
+ };
2346
+
1845
2347
  /**
1846
2348
  * ### .equal(actual, expected, [message])
1847
2349
  *
@@ -2063,7 +2565,7 @@ module.exports = function (chai, util) {
2063
2565
  * var tea = 'cup of chai';
2064
2566
  * assert.isDefined(tea, 'tea has been defined');
2065
2567
  *
2066
- * @name isUndefined
2568
+ * @name isDefined
2067
2569
  * @param {Mixed} value
2068
2570
  * @param {String} message
2069
2571
  * @api public
@@ -2399,18 +2901,7 @@ module.exports = function (chai, util) {
2399
2901
  */
2400
2902
 
2401
2903
  assert.include = function (exp, inc, msg) {
2402
- var obj = new Assertion(exp, msg);
2403
-
2404
- if (Array.isArray(exp)) {
2405
- obj.to.include(inc);
2406
- } else if ('string' === typeof exp) {
2407
- obj.to.contain.string(inc);
2408
- } else {
2409
- throw new chai.AssertionError({
2410
- message: 'expected an array or string'
2411
- , stackStartFunction: assert.include
2412
- });
2413
- }
2904
+ new Assertion(exp, msg).include(inc);
2414
2905
  };
2415
2906
 
2416
2907
  /**
@@ -2430,18 +2921,7 @@ module.exports = function (chai, util) {
2430
2921
  */
2431
2922
 
2432
2923
  assert.notInclude = function (exp, inc, msg) {
2433
- var obj = new Assertion(exp, msg);
2434
-
2435
- if (Array.isArray(exp)) {
2436
- obj.to.not.include(inc);
2437
- } else if ('string' === typeof exp) {
2438
- obj.to.not.contain.string(inc);
2439
- } else {
2440
- throw new chai.AssertionError({
2441
- message: 'expected an array or string'
2442
- , stackStartFunction: assert.include
2443
- });
2444
- }
2924
+ new Assertion(exp, msg).not.include(inc);
2445
2925
  };
2446
2926
 
2447
2927
  /**
@@ -2685,7 +3165,8 @@ module.exports = function (chai, util) {
2685
3165
  errt = null;
2686
3166
  }
2687
3167
 
2688
- new Assertion(fn, msg).to.Throw(errt, errs);
3168
+ var assertErr = new Assertion(fn, msg).to.Throw(errt, errs);
3169
+ return flag(assertErr, 'object');
2689
3170
  };
2690
3171
 
2691
3172
  /**
@@ -2823,7 +3304,7 @@ module.exports = function (chai, util) {
2823
3304
  require.register("chai/lib/chai/interface/expect.js", function(exports, require, module){
2824
3305
  /*!
2825
3306
  * chai
2826
- * Copyright(c) 2011-2013 Jake Luer <jake@alogicalparadox.com>
3307
+ * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com>
2827
3308
  * MIT Licensed
2828
3309
  */
2829
3310
 
@@ -2838,7 +3319,7 @@ module.exports = function (chai, util) {
2838
3319
  require.register("chai/lib/chai/interface/should.js", function(exports, require, module){
2839
3320
  /*!
2840
3321
  * chai
2841
- * Copyright(c) 2011-2013 Jake Luer <jake@alogicalparadox.com>
3322
+ * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com>
2842
3323
  * MIT Licensed
2843
3324
  */
2844
3325
 
@@ -2917,7 +3398,7 @@ module.exports = function (chai, util) {
2917
3398
  require.register("chai/lib/chai/utils/addChainableMethod.js", function(exports, require, module){
2918
3399
  /*!
2919
3400
  * Chai - addChainingMethod utility
2920
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
3401
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
2921
3402
  * MIT Licensed
2922
3403
  */
2923
3404
 
@@ -2972,15 +3453,27 @@ var call = Function.prototype.call,
2972
3453
  */
2973
3454
 
2974
3455
  module.exports = function (ctx, name, method, chainingBehavior) {
2975
- if (typeof chainingBehavior !== 'function')
3456
+ if (typeof chainingBehavior !== 'function') {
2976
3457
  chainingBehavior = function () { };
3458
+ }
3459
+
3460
+ var chainableBehavior = {
3461
+ method: method
3462
+ , chainingBehavior: chainingBehavior
3463
+ };
3464
+
3465
+ // save the methods so we can overwrite them later, if we need to.
3466
+ if (!ctx.__methods) {
3467
+ ctx.__methods = {};
3468
+ }
3469
+ ctx.__methods[name] = chainableBehavior;
2977
3470
 
2978
3471
  Object.defineProperty(ctx, name,
2979
3472
  { get: function () {
2980
- chainingBehavior.call(this);
3473
+ chainableBehavior.chainingBehavior.call(this);
2981
3474
 
2982
3475
  var assert = function () {
2983
- var result = method.apply(this, arguments);
3476
+ var result = chainableBehavior.method.apply(this, arguments);
2984
3477
  return result === undefined ? this : result;
2985
3478
  };
2986
3479
 
@@ -3014,7 +3507,7 @@ module.exports = function (ctx, name, method, chainingBehavior) {
3014
3507
  require.register("chai/lib/chai/utils/addMethod.js", function(exports, require, module){
3015
3508
  /*!
3016
3509
  * Chai - addMethod utility
3017
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
3510
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
3018
3511
  * MIT Licensed
3019
3512
  */
3020
3513
 
@@ -3054,7 +3547,7 @@ module.exports = function (ctx, name, method) {
3054
3547
  require.register("chai/lib/chai/utils/addProperty.js", function(exports, require, module){
3055
3548
  /*!
3056
3549
  * Chai - addProperty utility
3057
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
3550
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
3058
3551
  * MIT Licensed
3059
3552
  */
3060
3553
 
@@ -3093,138 +3586,11 @@ module.exports = function (ctx, name, getter) {
3093
3586
  });
3094
3587
  };
3095
3588
 
3096
- });
3097
- require.register("chai/lib/chai/utils/eql.js", function(exports, require, module){
3098
- // This is (almost) directly from Node.js assert
3099
- // https://github.com/joyent/node/blob/f8c335d0caf47f16d31413f89aa28eda3878e3aa/lib/assert.js
3100
-
3101
- module.exports = _deepEqual;
3102
-
3103
- var getEnumerableProperties = require('./getEnumerableProperties');
3104
-
3105
- // for the browser
3106
- var Buffer;
3107
- try {
3108
- Buffer = require('buffer').Buffer;
3109
- } catch (ex) {
3110
- Buffer = {
3111
- isBuffer: function () { return false; }
3112
- };
3113
- }
3114
-
3115
- function _deepEqual(actual, expected, memos) {
3116
-
3117
- // 7.1. All identical values are equivalent, as determined by ===.
3118
- if (actual === expected) {
3119
- return true;
3120
-
3121
- } else if (Buffer.isBuffer(actual) && Buffer.isBuffer(expected)) {
3122
- if (actual.length != expected.length) return false;
3123
-
3124
- for (var i = 0; i < actual.length; i++) {
3125
- if (actual[i] !== expected[i]) return false;
3126
- }
3127
-
3128
- return true;
3129
-
3130
- // 7.2. If the expected value is a Date object, the actual value is
3131
- // equivalent if it is also a Date object that refers to the same time.
3132
- } else if (actual instanceof Date && expected instanceof Date) {
3133
- return actual.getTime() === expected.getTime();
3134
-
3135
- // 7.3. Other pairs that do not both pass typeof value == 'object',
3136
- // equivalence is determined by ==.
3137
- } else if (typeof actual != 'object' && typeof expected != 'object') {
3138
- return actual === expected;
3139
-
3140
- // 7.4. For all other Object pairs, including Array objects, equivalence is
3141
- // determined by having the same number of owned properties (as verified
3142
- // with Object.prototype.hasOwnProperty.call), the same set of keys
3143
- // (although not necessarily the same order), equivalent values for every
3144
- // corresponding key, and an identical 'prototype' property. Note: this
3145
- // accounts for both named and indexed properties on Arrays.
3146
- } else {
3147
- return objEquiv(actual, expected, memos);
3148
- }
3149
- }
3150
-
3151
- function isUndefinedOrNull(value) {
3152
- return value === null || value === undefined;
3153
- }
3154
-
3155
- function isArguments(object) {
3156
- return Object.prototype.toString.call(object) == '[object Arguments]';
3157
- }
3158
-
3159
- function objEquiv(a, b, memos) {
3160
- if (isUndefinedOrNull(a) || isUndefinedOrNull(b))
3161
- return false;
3162
-
3163
- // an identical 'prototype' property.
3164
- if (a.prototype !== b.prototype) return false;
3165
-
3166
- // check if we have already compared a and b
3167
- var i;
3168
- if (memos) {
3169
- for(i = 0; i < memos.length; i++) {
3170
- if ((memos[i][0] === a && memos[i][1] === b) ||
3171
- (memos[i][0] === b && memos[i][1] === a))
3172
- return true;
3173
- }
3174
- } else {
3175
- memos = [];
3176
- }
3177
-
3178
- //~~~I've managed to break Object.keys through screwy arguments passing.
3179
- // Converting to array solves the problem.
3180
- if (isArguments(a)) {
3181
- if (!isArguments(b)) {
3182
- return false;
3183
- }
3184
- a = pSlice.call(a);
3185
- b = pSlice.call(b);
3186
- return _deepEqual(a, b, memos);
3187
- }
3188
- try {
3189
- var ka = getEnumerableProperties(a),
3190
- kb = getEnumerableProperties(b),
3191
- key;
3192
- } catch (e) {//happens when one is a string literal and the other isn't
3193
- return false;
3194
- }
3195
-
3196
- // having the same number of owned properties (keys incorporates
3197
- // hasOwnProperty)
3198
- if (ka.length != kb.length)
3199
- return false;
3200
-
3201
- //the same set of keys (although not necessarily the same order),
3202
- ka.sort();
3203
- kb.sort();
3204
- //~~~cheap key test
3205
- for (i = ka.length - 1; i >= 0; i--) {
3206
- if (ka[i] != kb[i])
3207
- return false;
3208
- }
3209
-
3210
- // remember objects we have compared to guard against circular references
3211
- memos.push([ a, b ]);
3212
-
3213
- //equivalent values for every corresponding key, and
3214
- //~~~possibly expensive deep test
3215
- for (i = ka.length - 1; i >= 0; i--) {
3216
- key = ka[i];
3217
- if (!_deepEqual(a[key], b[key], memos)) return false;
3218
- }
3219
-
3220
- return true;
3221
- }
3222
-
3223
3589
  });
3224
3590
  require.register("chai/lib/chai/utils/flag.js", function(exports, require, module){
3225
3591
  /*!
3226
3592
  * Chai - flag utility
3227
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
3593
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
3228
3594
  * MIT Licensed
3229
3595
  */
3230
3596
 
@@ -3259,7 +3625,7 @@ module.exports = function (obj, key, value) {
3259
3625
  require.register("chai/lib/chai/utils/getActual.js", function(exports, require, module){
3260
3626
  /*!
3261
3627
  * Chai - getActual utility
3262
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
3628
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
3263
3629
  * MIT Licensed
3264
3630
  */
3265
3631
 
@@ -3281,7 +3647,7 @@ module.exports = function (obj, args) {
3281
3647
  require.register("chai/lib/chai/utils/getEnumerableProperties.js", function(exports, require, module){
3282
3648
  /*!
3283
3649
  * Chai - getEnumerableProperties utility
3284
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
3650
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
3285
3651
  * MIT Licensed
3286
3652
  */
3287
3653
 
@@ -3309,7 +3675,7 @@ module.exports = function getEnumerableProperties(object) {
3309
3675
  require.register("chai/lib/chai/utils/getMessage.js", function(exports, require, module){
3310
3676
  /*!
3311
3677
  * Chai - message composition utility
3312
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
3678
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
3313
3679
  * MIT Licensed
3314
3680
  */
3315
3681
 
@@ -3329,7 +3695,7 @@ var flag = require('./flag')
3329
3695
  * and template tags. Template tags will return
3330
3696
  * a stringified inspection of the object referenced.
3331
3697
  *
3332
- * Messsage template tags:
3698
+ * Message template tags:
3333
3699
  * - `#{this}` current asserted object
3334
3700
  * - `#{act}` actual value
3335
3701
  * - `#{exp}` expected value
@@ -3361,7 +3727,7 @@ module.exports = function (obj, args) {
3361
3727
  require.register("chai/lib/chai/utils/getName.js", function(exports, require, module){
3362
3728
  /*!
3363
3729
  * Chai - getName utility
3364
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
3730
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
3365
3731
  * MIT Licensed
3366
3732
  */
3367
3733
 
@@ -3384,7 +3750,7 @@ module.exports = function (func) {
3384
3750
  require.register("chai/lib/chai/utils/getPathValue.js", function(exports, require, module){
3385
3751
  /*!
3386
3752
  * Chai - getPathValue utility
3387
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
3753
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
3388
3754
  * @see https://github.com/logicalparadox/filtr
3389
3755
  * MIT Licensed
3390
3756
  */
@@ -3489,7 +3855,7 @@ function _getPathValue (parsed, obj) {
3489
3855
  require.register("chai/lib/chai/utils/getProperties.js", function(exports, require, module){
3490
3856
  /*!
3491
3857
  * Chai - getProperties utility
3492
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
3858
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
3493
3859
  * MIT Licensed
3494
3860
  */
3495
3861
 
@@ -3589,7 +3955,7 @@ exports.transferFlags = require('./transferFlags');
3589
3955
  * Deep equal utility
3590
3956
  */
3591
3957
 
3592
- exports.eql = require('./eql');
3958
+ exports.eql = require('deep-eql');
3593
3959
 
3594
3960
  /*!
3595
3961
  * Deep path value
@@ -3633,6 +3999,12 @@ exports.overwriteMethod = require('./overwriteMethod');
3633
3999
 
3634
4000
  exports.addChainableMethod = require('./addChainableMethod');
3635
4001
 
4002
+ /*!
4003
+ * Overwrite chainable method
4004
+ */
4005
+
4006
+ exports.overwriteChainableMethod = require('./overwriteChainableMethod');
4007
+
3636
4008
 
3637
4009
  });
3638
4010
  require.register("chai/lib/chai/utils/inspect.js", function(exports, require, module){
@@ -3703,7 +4075,11 @@ function formatValue(ctx, value, recurseTimes) {
3703
4075
  value.inspect !== exports.inspect &&
3704
4076
  // Also filter out any prototype objects using the circular check.
3705
4077
  !(value.constructor && value.constructor.prototype === value)) {
3706
- return value.inspect(recurseTimes);
4078
+ var ret = value.inspect(recurseTimes);
4079
+ if (typeof ret !== 'string') {
4080
+ ret = formatValue(ctx, ret, recurseTimes);
4081
+ }
4082
+ return ret;
3707
4083
  }
3708
4084
 
3709
4085
  // Primitive types cannot have properties
@@ -3957,7 +4333,7 @@ function objectToString(o) {
3957
4333
  require.register("chai/lib/chai/utils/objDisplay.js", function(exports, require, module){
3958
4334
  /*!
3959
4335
  * Chai - flag utility
3960
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
4336
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
3961
4337
  * MIT Licensed
3962
4338
  */
3963
4339
 
@@ -4008,7 +4384,7 @@ module.exports = function (obj) {
4008
4384
  require.register("chai/lib/chai/utils/overwriteMethod.js", function(exports, require, module){
4009
4385
  /*!
4010
4386
  * Chai - overwriteMethod utility
4011
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
4387
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
4012
4388
  * MIT Licensed
4013
4389
  */
4014
4390
 
@@ -4062,7 +4438,7 @@ module.exports = function (ctx, name, method) {
4062
4438
  require.register("chai/lib/chai/utils/overwriteProperty.js", function(exports, require, module){
4063
4439
  /*!
4064
4440
  * Chai - overwriteProperty utility
4065
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
4441
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
4066
4442
  * MIT Licensed
4067
4443
  */
4068
4444
 
@@ -4115,11 +4491,67 @@ module.exports = function (ctx, name, getter) {
4115
4491
  });
4116
4492
  };
4117
4493
 
4494
+ });
4495
+ require.register("chai/lib/chai/utils/overwriteChainableMethod.js", function(exports, require, module){
4496
+ /*!
4497
+ * Chai - overwriteChainableMethod utility
4498
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
4499
+ * MIT Licensed
4500
+ */
4501
+
4502
+ /**
4503
+ * ### overwriteChainableMethod (ctx, name, fn)
4504
+ *
4505
+ * Overwites an already existing chainable method
4506
+ * and provides access to the previous function or
4507
+ * property. Must return functions to be used for
4508
+ * name.
4509
+ *
4510
+ * utils.overwriteChainableMethod(chai.Assertion.prototype, 'length',
4511
+ * function (_super) {
4512
+ * }
4513
+ * , function (_super) {
4514
+ * }
4515
+ * );
4516
+ *
4517
+ * Can also be accessed directly from `chai.Assertion`.
4518
+ *
4519
+ * chai.Assertion.overwriteChainableMethod('foo', fn, fn);
4520
+ *
4521
+ * Then can be used as any other assertion.
4522
+ *
4523
+ * expect(myFoo).to.have.length(3);
4524
+ * expect(myFoo).to.have.length.above(3);
4525
+ *
4526
+ * @param {Object} ctx object whose method / property is to be overwritten
4527
+ * @param {String} name of method / property to overwrite
4528
+ * @param {Function} method function that returns a function to be used for name
4529
+ * @param {Function} chainingBehavior function that returns a function to be used for property
4530
+ * @name overwriteChainableMethod
4531
+ * @api public
4532
+ */
4533
+
4534
+ module.exports = function (ctx, name, method, chainingBehavior) {
4535
+ var chainableBehavior = ctx.__methods[name];
4536
+
4537
+ var _chainingBehavior = chainableBehavior.chainingBehavior;
4538
+ chainableBehavior.chainingBehavior = function () {
4539
+ var result = chainingBehavior(_chainingBehavior).call(this);
4540
+ return result === undefined ? this : result;
4541
+ };
4542
+
4543
+ var _method = chainableBehavior.method;
4544
+ chainableBehavior.method = function () {
4545
+ var result = method(_method).apply(this, arguments);
4546
+ return result === undefined ? this : result;
4547
+ };
4548
+ };
4549
+
4118
4550
  });
4119
4551
  require.register("chai/lib/chai/utils/test.js", function(exports, require, module){
4120
4552
  /*!
4121
4553
  * Chai - test utility
4122
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
4554
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
4123
4555
  * MIT Licensed
4124
4556
  */
4125
4557
 
@@ -4148,7 +4580,7 @@ module.exports = function (obj, args) {
4148
4580
  require.register("chai/lib/chai/utils/transferFlags.js", function(exports, require, module){
4149
4581
  /*!
4150
4582
  * Chai - transferFlags utility
4151
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
4583
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
4152
4584
  * MIT Licensed
4153
4585
  */
4154
4586
 
@@ -4195,7 +4627,7 @@ module.exports = function (assertion, object, includeAll) {
4195
4627
  require.register("chai/lib/chai/utils/type.js", function(exports, require, module){
4196
4628
  /*!
4197
4629
  * Chai - type utility
4198
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
4630
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
4199
4631
  * MIT Licensed
4200
4632
  */
4201
4633
 
@@ -4240,12 +4672,25 @@ module.exports = function (obj) {
4240
4672
  };
4241
4673
 
4242
4674
  });
4243
- require.alias("chai/index.js", "chai/index.js");
4244
4675
 
4245
- if (typeof exports == "object") {
4676
+
4677
+
4678
+
4679
+ require.alias("chaijs-assertion-error/index.js", "chai/deps/assertion-error/index.js");
4680
+ require.alias("chaijs-assertion-error/index.js", "chai/deps/assertion-error/index.js");
4681
+ require.alias("chaijs-assertion-error/index.js", "assertion-error/index.js");
4682
+ require.alias("chaijs-assertion-error/index.js", "chaijs-assertion-error/index.js");
4683
+ require.alias("chaijs-deep-eql/lib/eql.js", "chai/deps/deep-eql/lib/eql.js");
4684
+ require.alias("chaijs-deep-eql/lib/eql.js", "chai/deps/deep-eql/index.js");
4685
+ require.alias("chaijs-deep-eql/lib/eql.js", "deep-eql/index.js");
4686
+ require.alias("chaijs-type-detect/lib/type.js", "chaijs-deep-eql/deps/type-detect/lib/type.js");
4687
+ require.alias("chaijs-type-detect/lib/type.js", "chaijs-deep-eql/deps/type-detect/index.js");
4688
+ require.alias("chaijs-type-detect/lib/type.js", "chaijs-type-detect/index.js");
4689
+ require.alias("chaijs-deep-eql/lib/eql.js", "chaijs-deep-eql/index.js");
4690
+ require.alias("chai/index.js", "chai/index.js");if (typeof exports == "object") {
4246
4691
  module.exports = require("chai");
4247
4692
  } else if (typeof define == "function" && define.amd) {
4248
- define(function(){ return require("chai"); });
4693
+ define([], function(){ return require("chai"); });
4249
4694
  } else {
4250
4695
  this["chai"] = require("chai");
4251
4696
  }})();