konacha 3.0.0 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
  }})();