konacha 1.2.0 → 1.2.1

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.
data/History.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # master
2
2
 
3
+ # 1.2.1
4
+
5
+ * Update chai (1.0.1)
6
+
3
7
  # 1.2.0
4
8
 
5
9
  * Update mocha (1.0.3) and chai (1.0.0)
@@ -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 = "1.2.0"
20
+ gem.version = "1.2.1"
21
21
 
22
22
  gem.add_dependency "rails", "~> 3.1"
23
23
  gem.add_dependency "capybara"
@@ -204,10 +204,10 @@ Object.defineProperty(Assertion.prototype, '_obj',
204
204
  *
205
205
  * Negates any of assertions following in the chain.
206
206
  *
207
- * expect(foo).to.not.equal('bar');
208
- * expect(goodFn).to.not.throw(Error);
209
- * expect({ foo: 'baz' }).to.have.property('foo')
210
- * .and.not.equal('bar');
207
+ * expect(foo).to.not.equal('bar');
208
+ * expect(goodFn).to.not.throw(Error);
209
+ * expect({ foo: 'baz' }).to.have.property('foo')
210
+ * .and.not.equal('bar');
211
211
  *
212
212
  * @name not
213
213
  * @api public
@@ -221,16 +221,40 @@ Object.defineProperty(Assertion.prototype, 'not',
221
221
  , configurable: true
222
222
  });
223
223
 
224
+ /**
225
+ * ### .deep
226
+ *
227
+ * Sets the `deep` flag, later used by the `equal` and
228
+ * `property` assertions.
229
+ *
230
+ * expect(foo).to.deep.equal({ bar: 'baz' });
231
+ * expect({ foo: { bar: { baz: 'quux' } } })
232
+ * .to.have.deep.property('foo.bar.baz', 'quux');
233
+ *
234
+ * @name deep
235
+ * @api public
236
+ */
237
+
238
+ Object.defineProperty(Assertion.prototype, 'deep',
239
+ { get: function () {
240
+ flag(this, 'deep', true);
241
+ return this;
242
+ }
243
+ , configurable: true
244
+ });
245
+
224
246
  /**
225
247
  * ### .a(type)
226
248
  *
227
249
  * The `a` and `an` assertions are aliases that can be
228
- * used either as property languague chains or to assert
229
- * typeof.
250
+ * used either as language chains or to assert a value's
251
+ * type (as revealed by `Object.prototype.toString`).
230
252
  *
231
253
  * // typeof
232
254
  * expect('test').to.be.a('string');
233
255
  * expect({ foo: 'bar' }).to.be.an('object');
256
+ * expect(null).to.be.a('null');
257
+ * expect(undefined).to.be.an('undefined');
234
258
  *
235
259
  * // language chain
236
260
  * expect(foo).to.be.an.instanceof(Foo);
@@ -244,12 +268,14 @@ Object.defineProperty(Assertion.prototype, 'not',
244
268
  var an = function () {
245
269
  var assert = function(type) {
246
270
  var obj = flag(this, 'object')
247
- , klass = type.charAt(0).toUpperCase() + type.slice(1);
271
+ , klassStart = type.charAt(0).toUpperCase()
272
+ , klass = klassStart + type.slice(1)
273
+ , article = ~[ 'A', 'E', 'I', 'O', 'U' ].indexOf(klassStart) ? 'an ' : 'a ';
248
274
 
249
275
  this.assert(
250
276
  '[object ' + klass + ']' === toString.call(obj)
251
- , 'expected #{this} to be a ' + type
252
- , 'expected #{this} not to be a ' + type
277
+ , 'expected #{this} to be ' + article + type
278
+ , 'expected #{this} not to be ' + article + type
253
279
  , '[object ' + klass + ']'
254
280
  , toString.call(obj)
255
281
  );
@@ -274,10 +300,10 @@ Object.defineProperty(Assertion.prototype, 'a',
274
300
  /**
275
301
  * ### .include(value)
276
302
  *
277
- * The `include` and `contain` assertions can be used as either a property
278
- * based language chain or as a method to assert the inclusion of an object
279
- * in an Array or substring in string. When used as a property langugae chain,
280
- * it toggles the `contain` flag for the `keys` assertion.
303
+ * The `include` and `contain` assertions can be used as either property
304
+ * based language chains or as methods to assert the inclusion of an object
305
+ * in an array or a substring in a string. When used as language chains,
306
+ * they toggle the `contain` flag for the `keys` assertion.
281
307
  *
282
308
  * expect([1,2,3]).to.include(2);
283
309
  * expect('foobar').to.contain('foo');
@@ -319,7 +345,7 @@ Object.defineProperty(Assertion.prototype, 'include',
319
345
  /**
320
346
  * ### .ok
321
347
  *
322
- * Assert object truthiness.
348
+ * Asserts that the target is truthy.
323
349
  *
324
350
  * expect('everthing').to.be.ok;
325
351
  * expect(1).to.be.ok;
@@ -346,7 +372,7 @@ Object.defineProperty(Assertion.prototype, 'ok',
346
372
  /**
347
373
  * ### .true
348
374
  *
349
- * Assert object is true
375
+ * Asserts that the target is `true`.
350
376
  *
351
377
  * expect(true).to.be.true;
352
378
  * expect(1).to.not.be.true;
@@ -372,7 +398,7 @@ Object.defineProperty(Assertion.prototype, 'true',
372
398
  /**
373
399
  * ### .false
374
400
  *
375
- * Assert object is false
401
+ * Asserts that the target is `false`.
376
402
  *
377
403
  * expect(false).to.be.false;
378
404
  * expect(0).to.not.be.false;
@@ -398,7 +424,7 @@ Object.defineProperty(Assertion.prototype, 'false',
398
424
  /**
399
425
  * ### .null
400
426
  *
401
- * Assert object is null
427
+ * Asserts that the target is `null`.
402
428
  *
403
429
  * expect(null).to.be.null;
404
430
  * expect(undefined).not.to.be.null;
@@ -424,7 +450,7 @@ Object.defineProperty(Assertion.prototype, 'null',
424
450
  /**
425
451
  * ### .undefined
426
452
  *
427
- * Assert object is undefined
453
+ * Asserts that the target is `undefined`.
428
454
  *
429
455
  * expect(undefined).to.be.undefined;
430
456
  * expect(null).to.not.be.undefined;
@@ -450,13 +476,15 @@ Object.defineProperty(Assertion.prototype, 'undefined',
450
476
  /**
451
477
  * ### .exist
452
478
  *
453
- * Assert object exists (null).
479
+ * Asserts that the target is neither `null` nor `undefined`.
454
480
  *
455
481
  * var foo = 'hi'
456
- * , bar;
482
+ * , bar = null
483
+ * , baz;
457
484
  *
458
485
  * expect(foo).to.exist;
459
486
  * expect(bar).to.not.exist;
487
+ * expect(baz).to.not.exist;
460
488
  *
461
489
  * @name exist
462
490
  * @api public
@@ -478,8 +506,8 @@ Object.defineProperty(Assertion.prototype, 'exist',
478
506
  /**
479
507
  * ### .empty
480
508
  *
481
- * Assert object's length to be `0`. For arrays, it check
482
- * the length property. For objects it gets the count of
509
+ * Asserts that the target's length is `0`. For arrays, it checks
510
+ * the `length` property. For objects, it gets the count of
483
511
  * enumerable keys.
484
512
  *
485
513
  * expect([]).to.be.empty;
@@ -514,7 +542,7 @@ Object.defineProperty(Assertion.prototype, 'empty',
514
542
  /**
515
543
  * ### .arguments
516
544
  *
517
- * Assert object is an instanceof arguments.
545
+ * Asserts that the target is an arguments object.
518
546
  *
519
547
  * function test () {
520
548
  * expect(arguments).to.be.arguments;
@@ -543,11 +571,15 @@ Object.defineProperty(Assertion.prototype, 'arguments',
543
571
  /**
544
572
  * ### .equal(value)
545
573
  *
546
- * Assert strict equality (===).
574
+ * Asserts that the target is strictly equal (`===`) to `value`.
575
+ * Alternately, if the `deep` flag is set, asserts that
576
+ * the target is deeply equal to `value`.
547
577
  *
548
578
  * expect('hello').to.equal('hello');
549
579
  * expect(42).to.equal(42);
550
580
  * expect(1).to.not.equal(true);
581
+ * expect({ foo: 'bar' }).to.not.equal({ foo: 'bar' });
582
+ * expect({ foo: 'bar' }).to.deep.equal({ foo: 'bar' });
551
583
  *
552
584
  * @name equal
553
585
  * @param {Mixed} value
@@ -555,11 +587,16 @@ Object.defineProperty(Assertion.prototype, 'arguments',
555
587
  */
556
588
 
557
589
  Assertion.prototype.equal = function (val) {
558
- this.assert(
559
- val === flag(this, 'object')
560
- , 'expected #{this} to equal #{exp}'
561
- , 'expected #{this} to not equal #{exp}'
562
- , val );
590
+ var obj = flag(this, 'object');
591
+ if (flag(this, 'deep')) {
592
+ new Assertion(obj).to.eql(val);
593
+ } else {
594
+ this.assert(
595
+ val === obj
596
+ , 'expected #{this} to equal #{exp}'
597
+ , 'expected #{this} to not equal #{exp}'
598
+ , val);
599
+ }
563
600
 
564
601
  return this;
565
602
  };
@@ -567,13 +604,13 @@ Assertion.prototype.equal = function (val) {
567
604
  /**
568
605
  * ### .eql(value)
569
606
  *
570
- * Assert deep equality.
607
+ * Asserts that the target is deeply equal to `value`.
571
608
  *
572
609
  * expect({ foo: 'bar' }).to.eql({ foo: 'bar' });
573
610
  * expect([ 1, 2, 3 ]).to.eql([ 1, 2, 3 ]);
574
611
  *
575
612
  * @name eql
576
- * @param {*} value
613
+ * @param {Mixed} value
577
614
  * @api public
578
615
  */
579
616
 
@@ -590,7 +627,7 @@ Assertion.prototype.eql = function (obj) {
590
627
  /**
591
628
  * ### .above(value)
592
629
  *
593
- * Assert greater than `value`.
630
+ * Asserts that the target is greater than `value`.
594
631
  *
595
632
  * expect(10).to.be.above(5);
596
633
  *
@@ -612,7 +649,7 @@ Assertion.prototype.above = function (val) {
612
649
  /**
613
650
  * ### .below(value)
614
651
  *
615
- * Assert less than `value`.
652
+ * Asserts that the target is less than `value`.
616
653
  *
617
654
  * expect(5).to.be.below(10);
618
655
  *
@@ -634,7 +671,7 @@ Assertion.prototype.below = function (val) {
634
671
  /**
635
672
  * ### .within(start, finish)
636
673
  *
637
- * Assert that a number is within a range.
674
+ * Asserts that the target is within a range.
638
675
  *
639
676
  * expect(7).to.be.within(5,10);
640
677
  *
@@ -659,7 +696,7 @@ Assertion.prototype.within = function (start, finish) {
659
696
  /**
660
697
  * ### .instanceof(constructor)
661
698
  *
662
- * Assert instanceof.
699
+ * Asserts that the target is an instance of `constructor`.
663
700
  *
664
701
  * var Tea = function (name) { this.name = name; }
665
702
  * , Chai = new Tea('chai');
@@ -668,7 +705,7 @@ Assertion.prototype.within = function (start, finish) {
668
705
  * expect([ 1, 2, 3 ]).to.be.instanceof(Array);
669
706
  *
670
707
  * @name instanceof
671
- * @param {Constructor}
708
+ * @param {Constructor} constructor
672
709
  * @alias instanceOf
673
710
  * @api public
674
711
  */
@@ -686,11 +723,13 @@ Assertion.prototype.instanceOf = function (constructor) {
686
723
  /**
687
724
  * ### .property(name, [value])
688
725
  *
689
- * Assert that property of `name` exists, optionally with `value`.
690
- * Can use dot-notation for deep reference.
726
+ * Asserts that the target has a property `name`, optionally asserting that
727
+ * the value of that property is strictly equal to `value`.
728
+ * If the `deep` flag is set, you can use dot- and bracket-notation for deep
729
+ * references into objects and arrays.
691
730
  *
692
- * // legacy / simple referencing
693
- * var obj = { foo: 'bar' }
731
+ * // simple referencing
732
+ * var obj = { foo: 'bar' };
694
733
  * expect(obj).to.have.property('foo');
695
734
  * expect(obj).to.have.property('foo', 'bar');
696
735
  * expect(obj).to.have.property('foo').to.be.a('string');
@@ -701,9 +740,9 @@ Assertion.prototype.instanceOf = function (constructor) {
701
740
  * , teas: [ 'chai', 'matcha', { tea: 'konacha' } ]
702
741
  * };
703
742
 
704
- * expect(deepObj).to.have.property('green.tea', 'matcha');
705
- * expect(deepObj).to.have.property('teas[1]', 'matcha');
706
- * expect(deepObj).to.have.property('teas[2].tea', 'konacha');
743
+ * expect(deepObj).to.have.deep.property('green.tea', 'matcha');
744
+ * expect(deepObj).to.have.deep.property('teas[1]', 'matcha');
745
+ * expect(deepObj).to.have.deep.property('teas[2].tea', 'konacha');
707
746
  *
708
747
  * @name property
709
748
  * @param {String} name
@@ -714,25 +753,26 @@ Assertion.prototype.instanceOf = function (constructor) {
714
753
 
715
754
  Assertion.prototype.property = function (name, val) {
716
755
  var obj = flag(this, 'object')
717
- , value = util.getPathValue(name, obj)
756
+ , value = flag(this, 'deep') ? util.getPathValue(name, obj) : obj[name]
757
+ , descriptor = flag(this, 'deep') ? 'deep property ' : 'property '
718
758
  , negate = flag(this, 'negate');
719
759
 
720
760
  if (negate && undefined !== val) {
721
761
  if (undefined === value) {
722
- throw new Error(util.inspect(obj) + ' has no property ' + util.inspect(name));
762
+ throw new Error(util.inspect(obj) + ' has no ' + descriptor + util.inspect(name));
723
763
  }
724
764
  } else {
725
765
  this.assert(
726
766
  undefined !== value
727
- , 'expected #{this} to have a property ' + util.inspect(name)
728
- , 'expected #{this} to not have property ' + util.inspect(name));
767
+ , 'expected #{this} to have a ' + descriptor + util.inspect(name)
768
+ , 'expected #{this} to not have ' + descriptor + util.inspect(name));
729
769
  }
730
770
 
731
771
  if (undefined !== val) {
732
772
  this.assert(
733
773
  val === value
734
- , 'expected #{this} to have a property ' + util.inspect(name) + ' of #{exp}, but got #{act}'
735
- , 'expected #{this} to not have a property ' + util.inspect(name) + ' of #{act}'
774
+ , 'expected #{this} to have a ' + descriptor + util.inspect(name) + ' of #{exp}, but got #{act}'
775
+ , 'expected #{this} to not have a ' + descriptor + util.inspect(name) + ' of #{act}'
736
776
  , val
737
777
  , value
738
778
  );
@@ -745,7 +785,7 @@ Assertion.prototype.property = function (name, val) {
745
785
  /**
746
786
  * ### .ownProperty(name)
747
787
  *
748
- * Assert that has own property by `name`.
788
+ * Asserts that the target has an own property `name`.
749
789
  *
750
790
  * expect('test').to.have.ownProperty('length');
751
791
  *
@@ -765,9 +805,9 @@ Assertion.prototype.ownProperty = function (name) {
765
805
  };
766
806
 
767
807
  /**
768
- * ### .length(val)
808
+ * ### .length(value)
769
809
  *
770
- * Assert that object has expected length.
810
+ * Asserts that the target's `length` property has the expected value.
771
811
  *
772
812
  * expect([1,2,3]).to.have.length(3);
773
813
  * expect('foobar').to.have.length(6);
@@ -797,7 +837,7 @@ Assertion.prototype.length = function (n) {
797
837
  /**
798
838
  * ### .match(regexp)
799
839
  *
800
- * Assert that matches regular expression.
840
+ * Asserts that the target matches a regular expression.
801
841
  *
802
842
  * expect('foobar').to.match(/^foo/);
803
843
  *
@@ -820,7 +860,7 @@ Assertion.prototype.match = function (re) {
820
860
  /**
821
861
  * ### .string(string)
822
862
  *
823
- * Assert inclusion of string in string.
863
+ * Asserts that the string target contains another string.
824
864
  *
825
865
  * expect('foobar').to.have.string('bar');
826
866
  *
@@ -844,15 +884,16 @@ Assertion.prototype.string = function (str) {
844
884
  /**
845
885
  * ### .keys(key1, [key2], [...])
846
886
  *
847
- * Assert exact keys or the inclusing of keys
848
- * using the `include` or `contain` modifier.
887
+ * Asserts that the target has exactly the given keys, or
888
+ * asserts the inclusion of some keys when using the
889
+ * `include` or `contain` modifiers.
849
890
  *
850
891
  * expect({ foo: 1, bar: 2 }).to.have.keys(['foo', 'bar']);
851
892
  * expect({ foo: 1, bar: 2, baz: 3 }).to.contain.keys('foo', 'bar');
852
893
  *
853
894
  * @name keys
854
895
  * @alias key
855
- * @param {String|Array} Keys
896
+ * @param {String...|Array} keys
856
897
  * @api public
857
898
  */
858
899
 
@@ -912,7 +953,7 @@ Assertion.prototype.keys = function(keys) {
912
953
  /**
913
954
  * ### .throw(constructor)
914
955
  *
915
- * Assert that a function will throw a specific type of error, or specific type of error
956
+ * Asserts that the function target will throw a specific error, or specific type of error
916
957
  * (as determined using `instanceof`), optionally with a RegExp or string inclusion test
917
958
  * for the error's message.
918
959
  *
@@ -1021,7 +1062,7 @@ Assertion.prototype.Throw = function (constructor, msg) {
1021
1062
  /**
1022
1063
  * ### .respondTo(method)
1023
1064
  *
1024
- * Assert that object/class will respond to a method.
1065
+ * Asserts that the object or class target will respond to a method.
1025
1066
  *
1026
1067
  * expect(Klass).to.respondTo('bar');
1027
1068
  * expect(obj).to.respondTo('bar');
@@ -1051,7 +1092,7 @@ Assertion.prototype.respondTo = function (method) {
1051
1092
  /**
1052
1093
  * ### .satisfy(method)
1053
1094
  *
1054
- * Assert that passes a truth test.
1095
+ * Asserts that the target passes a given truth test.
1055
1096
  *
1056
1097
  * expect(1).to.satisfy(function(num) { return num > 0; });
1057
1098
  *
@@ -1076,7 +1117,7 @@ Assertion.prototype.satisfy = function (matcher) {
1076
1117
  /**
1077
1118
  * ### .closeTo(expected, delta)
1078
1119
  *
1079
- * Assert that actual is equal to +/- delta.
1120
+ * Asserts that the target is equal `expected`, to within a +/- `delta` range.
1080
1121
  *
1081
1122
  * expect(1.5).to.be.closeTo(1, 0.5);
1082
1123
  *
@@ -1164,7 +1205,7 @@ var used = []
1164
1205
  * Chai version
1165
1206
  */
1166
1207
 
1167
- exports.version = '1.0.0';
1208
+ exports.version = '1.0.1';
1168
1209
 
1169
1210
  /*!
1170
1211
  * Primary `Assertion` prototype
@@ -1248,11 +1289,14 @@ module.exports = function (chai, util) {
1248
1289
  */
1249
1290
 
1250
1291
  /**
1251
- * ### assert(expressions, errorMessage)
1292
+ * ### assert(expression, message)
1252
1293
  *
1253
1294
  * Write your own test expressions.
1254
1295
  *
1255
- * @param {Mixed} expression to test for truthiness.
1296
+ * assert('foo' !== 'bar', 'foo is not bar');
1297
+ * assert(Array.isArray([]), 'empty arrays are arrays');
1298
+ *
1299
+ * @param {Mixed} expression to test for truthiness
1256
1300
  * @param {String} message to display on error
1257
1301
  * @name assert
1258
1302
  * @api public
@@ -1268,13 +1312,13 @@ module.exports = function (chai, util) {
1268
1312
  };
1269
1313
 
1270
1314
  /**
1271
- * ### .fail(actual, expect, msg, operator)
1315
+ * ### .fail(actual, expected, [message], [operator])
1272
1316
  *
1273
- * Throw a failure. Node.js compatible.
1317
+ * Throw a failure. Node.js `assert` module-compatible.
1274
1318
  *
1275
1319
  * @name fail
1276
- * @param {*} actual value
1277
- * @param {*} expected value
1320
+ * @param {Mixed} actual
1321
+ * @param {Mixed} expected
1278
1322
  * @param {String} message
1279
1323
  * @param {String} operator
1280
1324
  * @api public
@@ -1293,13 +1337,13 @@ module.exports = function (chai, util) {
1293
1337
  /**
1294
1338
  * ### .ok(object, [message])
1295
1339
  *
1296
- * Assert object is truthy.
1340
+ * Asserts that `object` is truthy.
1297
1341
  *
1298
- * assert.ok('everthing', 'everything is ok');
1299
- * assert.ok(false, 'this will fail');
1342
+ * assert.ok('everything', 'everything is ok');
1343
+ * assert.ok(false, 'this will fail');
1300
1344
  *
1301
1345
  * @name ok
1302
- * @param {*} object to test
1346
+ * @param {Mixed} object to test
1303
1347
  * @param {String} message
1304
1348
  * @api public
1305
1349
  */
@@ -1311,13 +1355,13 @@ module.exports = function (chai, util) {
1311
1355
  /**
1312
1356
  * ### .equal(actual, expected, [message])
1313
1357
  *
1314
- * Assert non-strict equality (==).
1358
+ * Asserts non-strict equality (`==`) of `actual` and `expected`.
1315
1359
  *
1316
- * assert.equal(3, 3, 'these numbers are equal');
1360
+ * assert.equal(3, '3', '== coerces values to strings');
1317
1361
  *
1318
1362
  * @name equal
1319
- * @param {*} actual
1320
- * @param {*} expected
1363
+ * @param {Mixed} actual
1364
+ * @param {Mixed} expected
1321
1365
  * @param {String} message
1322
1366
  * @api public
1323
1367
  */
@@ -1337,13 +1381,13 @@ module.exports = function (chai, util) {
1337
1381
  /**
1338
1382
  * ### .notEqual(actual, expected, [message])
1339
1383
  *
1340
- * Assert non-strict inequality (!=).
1384
+ * Asserts non-strict inequality (`!=`) of `actual` and `expected`.
1341
1385
  *
1342
- * assert.notEqual(3, 4, 'these numbers are not equal');
1386
+ * assert.notEqual(3, 4, 'these numbers are not equal');
1343
1387
  *
1344
1388
  * @name notEqual
1345
- * @param {*} actual
1346
- * @param {*} expected
1389
+ * @param {Mixed} actual
1390
+ * @param {Mixed} expected
1347
1391
  * @param {String} message
1348
1392
  * @api public
1349
1393
  */
@@ -1363,13 +1407,13 @@ module.exports = function (chai, util) {
1363
1407
  /**
1364
1408
  * ### .strictEqual(actual, expected, [message])
1365
1409
  *
1366
- * Assert strict equality (===).
1410
+ * Asserts strict equality (`===`) of `actual` and `expected`.
1367
1411
  *
1368
- * assert.strictEqual(true, true, 'these booleans are strictly equal');
1412
+ * assert.strictEqual(true, true, 'these booleans are strictly equal');
1369
1413
  *
1370
1414
  * @name strictEqual
1371
- * @param {*} actual
1372
- * @param {*} expected
1415
+ * @param {Mixed} actual
1416
+ * @param {Mixed} expected
1373
1417
  * @param {String} message
1374
1418
  * @api public
1375
1419
  */
@@ -1381,13 +1425,13 @@ module.exports = function (chai, util) {
1381
1425
  /**
1382
1426
  * ### .notStrictEqual(actual, expected, [message])
1383
1427
  *
1384
- * Assert strict inequality (!==).
1428
+ * Asserts strict inequality (`!==`) of `actual` and `expected`.
1385
1429
  *
1386
- * assert.notStrictEqual(1, true, 'these booleans are not strictly equal');
1430
+ * assert.notStrictEqual(3, '3', 'no coercion for strict equality');
1387
1431
  *
1388
1432
  * @name notStrictEqual
1389
- * @param {*} actual
1390
- * @param {*} expected
1433
+ * @param {Mixed} actual
1434
+ * @param {Mixed} expected
1391
1435
  * @param {String} message
1392
1436
  * @api public
1393
1437
  */
@@ -1399,13 +1443,13 @@ module.exports = function (chai, util) {
1399
1443
  /**
1400
1444
  * ### .deepEqual(actual, expected, [message])
1401
1445
  *
1402
- * Assert not deep equality.
1446
+ * Asserts that `actual` is deeply equal to `expected`.
1403
1447
  *
1404
- * assert.deepEqual({ tea: 'green' }, { tea: 'green' });
1448
+ * assert.deepEqual({ tea: 'green' }, { tea: 'green' });
1405
1449
  *
1406
1450
  * @name deepEqual
1407
- * @param {*} actual
1408
- * @param {*} expected
1451
+ * @param {Mixed} actual
1452
+ * @param {Mixed} expected
1409
1453
  * @param {String} message
1410
1454
  * @api public
1411
1455
  */
@@ -1417,13 +1461,13 @@ module.exports = function (chai, util) {
1417
1461
  /**
1418
1462
  * ### .notDeepEqual(actual, expected, [message])
1419
1463
  *
1420
- * Assert not deep equality.
1464
+ * Assert that `actual` is not deeply equal to `expected`.
1421
1465
  *
1422
- * assert.notDeepEqual({ tea: 'green' }, { tea: 'jasmine' });
1466
+ * assert.notDeepEqual({ tea: 'green' }, { tea: 'jasmine' });
1423
1467
  *
1424
1468
  * @name notDeepEqual
1425
- * @param {*} actual
1426
- * @param {*} expected
1469
+ * @param {Mixed} actual
1470
+ * @param {Mixed} expected
1427
1471
  * @param {String} message
1428
1472
  * @api public
1429
1473
  */
@@ -1435,13 +1479,13 @@ module.exports = function (chai, util) {
1435
1479
  /**
1436
1480
  * ### .isTrue(value, [message])
1437
1481
  *
1438
- * Assert `value` is true.
1482
+ * Asserts that `value` is true.
1439
1483
  *
1440
- * var tea_served = true;
1441
- * assert.isTrue(tea_served, 'the tea has been served');
1484
+ * var teaServed = true;
1485
+ * assert.isTrue(teaServed, 'the tea has been served');
1442
1486
  *
1443
1487
  * @name isTrue
1444
- * @param {Boolean} value
1488
+ * @param {Mixed} value
1445
1489
  * @param {String} message
1446
1490
  * @api public
1447
1491
  */
@@ -1453,13 +1497,13 @@ module.exports = function (chai, util) {
1453
1497
  /**
1454
1498
  * ### .isFalse(value, [message])
1455
1499
  *
1456
- * Assert `value` is false.
1500
+ * Asserts that `value` is false.
1457
1501
  *
1458
- * var tea_served = false;
1459
- * assert.isFalse(tea_served, 'no tea yet? hmm...');
1502
+ * var teaServed = false;
1503
+ * assert.isFalse(teaServed, 'no tea yet? hmm...');
1460
1504
  *
1461
1505
  * @name isFalse
1462
- * @param {Boolean} value
1506
+ * @param {Mixed} value
1463
1507
  * @param {String} message
1464
1508
  * @api public
1465
1509
  */
@@ -1471,12 +1515,12 @@ module.exports = function (chai, util) {
1471
1515
  /**
1472
1516
  * ### .isNull(value, [message])
1473
1517
  *
1474
- * Assert `value` is null.
1518
+ * Asserts that `value` is null.
1475
1519
  *
1476
- * assert.isNull(err, 'no errors');
1520
+ * assert.isNull(err, 'there was no error');
1477
1521
  *
1478
1522
  * @name isNull
1479
- * @param {*} value
1523
+ * @param {Mixed} value
1480
1524
  * @param {String} message
1481
1525
  * @api public
1482
1526
  */
@@ -1488,13 +1532,13 @@ module.exports = function (chai, util) {
1488
1532
  /**
1489
1533
  * ### .isNotNull(value, [message])
1490
1534
  *
1491
- * Assert `value` is not null.
1535
+ * Asserts that `value` is not null.
1492
1536
  *
1493
- * var tea = 'tasty chai';
1494
- * assert.isNotNull(tea, 'great, time for tea!');
1537
+ * var tea = 'tasty chai';
1538
+ * assert.isNotNull(tea, 'great, time for tea!');
1495
1539
  *
1496
1540
  * @name isNotNull
1497
- * @param {*} value
1541
+ * @param {Mixed} value
1498
1542
  * @param {String} message
1499
1543
  * @api public
1500
1544
  */
@@ -1506,12 +1550,13 @@ module.exports = function (chai, util) {
1506
1550
  /**
1507
1551
  * ### .isUndefined(value, [message])
1508
1552
  *
1509
- * Assert `value` is undefined.
1553
+ * Asserts that `value` is `undefined`.
1510
1554
  *
1511
- * assert.isUndefined(tea, 'no tea defined');
1555
+ * var tea;
1556
+ * assert.isUndefined(tea, 'no tea defined');
1512
1557
  *
1513
1558
  * @name isUndefined
1514
- * @param {*} value
1559
+ * @param {Mixed} value
1515
1560
  * @param {String} message
1516
1561
  * @api public
1517
1562
  */
@@ -1523,13 +1568,13 @@ module.exports = function (chai, util) {
1523
1568
  /**
1524
1569
  * ### .isDefined(value, [message])
1525
1570
  *
1526
- * Assert `value` is not undefined.
1571
+ * Asserts that `value` is not `undefined`.
1527
1572
  *
1528
- * var tea = 'cup of chai';
1529
- * assert.isDefined(tea, 'no tea defined');
1573
+ * var tea = 'cup of chai';
1574
+ * assert.isDefined(tea, 'tea has been defined');
1530
1575
  *
1531
1576
  * @name isUndefined
1532
- * @param {*} value
1577
+ * @param {Mixed} value
1533
1578
  * @param {String} message
1534
1579
  * @api public
1535
1580
  */
@@ -1541,13 +1586,13 @@ module.exports = function (chai, util) {
1541
1586
  /**
1542
1587
  * ### .isFunction(value, [message])
1543
1588
  *
1544
- * Assert `value` is a function.
1589
+ * Asserts that `value` is a function.
1545
1590
  *
1546
- * var serve_tea = function () { return 'cup of tea'; };
1547
- * assert.isFunction(serve_tea, 'great, we can have tea now');
1591
+ * function serveTea() { return 'cup of tea'; };
1592
+ * assert.isFunction(serveTea, 'great, we can have tea now');
1548
1593
  *
1549
1594
  * @name isFunction
1550
- * @param {Function} value
1595
+ * @param {Mixed} value
1551
1596
  * @param {String} message
1552
1597
  * @api public
1553
1598
  */
@@ -1559,10 +1604,10 @@ module.exports = function (chai, util) {
1559
1604
  /**
1560
1605
  * ### .isNotFunction(value, [message])
1561
1606
  *
1562
- * Assert `value` is NOT a function.
1607
+ * Asserts that `value` is _not_ a function.
1563
1608
  *
1564
- * var serve_tea = [ 'heat', 'pour', 'sip' ];
1565
- * assert.isNotFunction(serve_tea, 'great, we can have tea now');
1609
+ * var serveTea = [ 'heat', 'pour', 'sip' ];
1610
+ * assert.isNotFunction(serveTea, 'great, we have listed the steps');
1566
1611
  *
1567
1612
  * @name isNotFunction
1568
1613
  * @param {Mixed} value
@@ -1577,13 +1622,14 @@ module.exports = function (chai, util) {
1577
1622
  /**
1578
1623
  * ### .isObject(value, [message])
1579
1624
  *
1580
- * Assert `value` is an object.
1625
+ * Asserts that `value` is an object (as revealed by
1626
+ * `Object.prototype.toString`).
1581
1627
  *
1582
- * var selection = { name: 'Chai', serve: 'with spices' };
1583
- * assert.isObject(selection, 'tea selection is an object');
1628
+ * var selection = { name: 'Chai', serve: 'with spices' };
1629
+ * assert.isObject(selection, 'tea selection is an object');
1584
1630
  *
1585
1631
  * @name isObject
1586
- * @param {Object} value
1632
+ * @param {Mixed} value
1587
1633
  * @param {String} message
1588
1634
  * @api public
1589
1635
  */
@@ -1595,10 +1641,11 @@ module.exports = function (chai, util) {
1595
1641
  /**
1596
1642
  * ### .isNotObject(value, [message])
1597
1643
  *
1598
- * Assert `value` is NOT an object.
1644
+ * Asserts that `value` is _not_ an object.
1599
1645
  *
1600
- * var selection = 'chai'
1601
- * assert.isObject(selection, 'tea selection is not an object');
1646
+ * var selection = 'chai'
1647
+ * assert.isObject(selection, 'tea selection is not an object');
1648
+ * assert.isObject(null, 'null is not an object');
1602
1649
  *
1603
1650
  * @name isNotObject
1604
1651
  * @param {Mixed} value
@@ -1613,10 +1660,10 @@ module.exports = function (chai, util) {
1613
1660
  /**
1614
1661
  * ### .isArray(value, [message])
1615
1662
  *
1616
- * Assert `value` is an instance of Array.
1663
+ * Asserts that `value` is an array.
1617
1664
  *
1618
- * var menu = [ 'green', 'chai', 'oolong' ];
1619
- * assert.isArray(menu, 'what kind of tea do we want?');
1665
+ * var menu = [ 'green', 'chai', 'oolong' ];
1666
+ * assert.isArray(menu, 'what kind of tea do we want?');
1620
1667
  *
1621
1668
  * @name isArray
1622
1669
  * @param {Mixed} value
@@ -1625,16 +1672,16 @@ module.exports = function (chai, util) {
1625
1672
  */
1626
1673
 
1627
1674
  assert.isArray = function (val, msg) {
1628
- new Assertion(val, msg).to.be.instanceOf(Array);
1675
+ new Assertion(val, msg).to.be.an('array');
1629
1676
  };
1630
1677
 
1631
1678
  /**
1632
- * ### .isArray(value, [message])
1679
+ * ### .isNotArray(value, [message])
1633
1680
  *
1634
- * Assert `value` is NOT an instance of Array.
1681
+ * Asserts that `value` is _not_ an array.
1635
1682
  *
1636
- * var menu = 'green|chai|oolong';
1637
- * assert.isNotArray(menu, 'what kind of tea do we want?');
1683
+ * var menu = 'green|chai|oolong';
1684
+ * assert.isNotArray(menu, 'what kind of tea do we want?');
1638
1685
  *
1639
1686
  * @name isNotArray
1640
1687
  * @param {Mixed} value
@@ -1643,19 +1690,19 @@ module.exports = function (chai, util) {
1643
1690
  */
1644
1691
 
1645
1692
  assert.isNotArray = function (val, msg) {
1646
- new Assertion(val, msg).to.not.be.instanceOf(Array);
1693
+ new Assertion(val, msg).to.not.be.an('array');
1647
1694
  };
1648
1695
 
1649
1696
  /**
1650
1697
  * ### .isString(value, [message])
1651
1698
  *
1652
- * Assert `value` is a string.
1699
+ * Asserts that `value` is a string.
1653
1700
  *
1654
- * var teaorder = 'chai';
1655
- * assert.isString(tea_order, 'order placed');
1701
+ * var teaOrder = 'chai';
1702
+ * assert.isString(teaOrder, 'order placed');
1656
1703
  *
1657
1704
  * @name isString
1658
- * @param {String} value
1705
+ * @param {Mixed} value
1659
1706
  * @param {String} message
1660
1707
  * @api public
1661
1708
  */
@@ -1667,10 +1714,10 @@ module.exports = function (chai, util) {
1667
1714
  /**
1668
1715
  * ### .isNotString(value, [message])
1669
1716
  *
1670
- * Assert `value` is NOT a string.
1717
+ * Asserts that `value` is _not_ a string.
1671
1718
  *
1672
- * var teaorder = 4;
1673
- * assert.isNotString(tea_order, 'order placed');
1719
+ * var teaOrder = 4;
1720
+ * assert.isNotString(teaOrder, 'order placed');
1674
1721
  *
1675
1722
  * @name isNotString
1676
1723
  * @param {Mixed} value
@@ -1685,10 +1732,10 @@ module.exports = function (chai, util) {
1685
1732
  /**
1686
1733
  * ### .isNumber(value, [message])
1687
1734
  *
1688
- * Assert `value` is a number
1735
+ * Asserts that `value` is a number.
1689
1736
  *
1690
- * var cups = 2;
1691
- * assert.isNumber(cups, 'how many cups');
1737
+ * var cups = 2;
1738
+ * assert.isNumber(cups, 'how many cups');
1692
1739
  *
1693
1740
  * @name isNumber
1694
1741
  * @param {Number} value
@@ -1703,10 +1750,10 @@ module.exports = function (chai, util) {
1703
1750
  /**
1704
1751
  * ### .isNotNumber(value, [message])
1705
1752
  *
1706
- * Assert `value` NOT is a number
1753
+ * Asserts that `value` is _not_ a number.
1707
1754
  *
1708
- * var cups = '2 cups please';
1709
- * assert.isNotNumber(cups, 'how many cups');
1755
+ * var cups = '2 cups please';
1756
+ * assert.isNotNumber(cups, 'how many cups');
1710
1757
  *
1711
1758
  * @name isNotNumber
1712
1759
  * @param {Mixed} value
@@ -1721,13 +1768,13 @@ module.exports = function (chai, util) {
1721
1768
  /**
1722
1769
  * ### .isBoolean(value, [message])
1723
1770
  *
1724
- * Assert `value` is a boolean
1771
+ * Asserts that `value` is a boolean.
1725
1772
  *
1726
- * var teaready = true
1727
- * , teaserved = false;
1773
+ * var teaReady = true
1774
+ * , teaServed = false;
1728
1775
  *
1729
- * assert.isBoolean(tea_ready, 'is the tea ready');
1730
- * assert.isBoolean(tea_served, 'has tea been served');
1776
+ * assert.isBoolean(teaReady, 'is the tea ready');
1777
+ * assert.isBoolean(teaServed, 'has tea been served');
1731
1778
  *
1732
1779
  * @name isBoolean
1733
1780
  * @param {Mixed} value
@@ -1742,13 +1789,13 @@ module.exports = function (chai, util) {
1742
1789
  /**
1743
1790
  * ### .isNotBoolean(value, [message])
1744
1791
  *
1745
- * Assert `value` is NOT a boolean
1792
+ * Asserts that `value` is _not_ a boolean.
1746
1793
  *
1747
- * var teaready = 'yep'
1748
- * , teaserved = 'nope';
1794
+ * var teaReady = 'yep'
1795
+ * , teaServed = 'nope';
1749
1796
  *
1750
- * assert.isNotBoolean(tea_ready, 'is the tea ready');
1751
- * assert.isNotBoolean(tea_served, 'has tea been served');
1797
+ * assert.isNotBoolean(teaReady, 'is the tea ready');
1798
+ * assert.isNotBoolean(teaServed, 'has tea been served');
1752
1799
  *
1753
1800
  * @name isNotBoolean
1754
1801
  * @param {Mixed} value
@@ -1763,13 +1810,19 @@ module.exports = function (chai, util) {
1763
1810
  /**
1764
1811
  * ### .typeOf(value, name, [message])
1765
1812
  *
1766
- * Assert typeof `value` is `name`.
1813
+ * Asserts that `value`'s type is `name`, as determined by
1814
+ * `Object.prototype.toString`.
1767
1815
  *
1768
- * assert.typeOf('tea', 'string', 'we have a string');
1816
+ * assert.typeOf({ tea: 'chai' }, 'object', 'we have an object');
1817
+ * assert.typeOf(['chai', 'jasmine'], 'array', 'we have an array');
1818
+ * assert.typeOf('tea', 'string', 'we have a string');
1819
+ * assert.typeOf(/tea/, 'regexp', 'we have a regular expression');
1820
+ * assert.typeOf(null, 'null', 'we have a null');
1821
+ * assert.typeOf(undefined, 'undefined', 'we have an undefined');
1769
1822
  *
1770
1823
  * @name typeOf
1771
1824
  * @param {Mixed} value
1772
- * @param {String} typeof name
1825
+ * @param {String} name
1773
1826
  * @param {String} message
1774
1827
  * @api public
1775
1828
  */
@@ -1781,9 +1834,10 @@ module.exports = function (chai, util) {
1781
1834
  /**
1782
1835
  * ### .notTypeOf(value, name, [message])
1783
1836
  *
1784
- * Assert typeof `value` is NOT `name`.
1837
+ * Asserts that `value`'s type is _not_ `name`, as determined by
1838
+ * `Object.prototype.toString`.
1785
1839
  *
1786
- * assert.notTypeOf('tea', 'string', 'we have a string');
1840
+ * assert.notTypeOf('tea', 'number', 'strings are not numbers');
1787
1841
  *
1788
1842
  * @name notTypeOf
1789
1843
  * @param {Mixed} value
@@ -1799,12 +1853,12 @@ module.exports = function (chai, util) {
1799
1853
  /**
1800
1854
  * ### .instanceOf(object, constructor, [message])
1801
1855
  *
1802
- * Assert `value` is instanceof `constructor`.
1856
+ * Asserts that `value` is an instance of `constructor`.
1803
1857
  *
1804
- * var Tea = function (name) { this.name = name; }
1805
- * , Chai = new Tea('chai');
1858
+ * var Tea = function (name) { this.name = name; }
1859
+ * , chai = new Tea('chai');
1806
1860
  *
1807
- * assert.instanceOf(Chai, Tea, 'chai is an instance of tea');
1861
+ * assert.instanceOf(chai, Tea, 'chai is an instance of tea');
1808
1862
  *
1809
1863
  * @name instanceOf
1810
1864
  * @param {Object} object
@@ -1820,12 +1874,12 @@ module.exports = function (chai, util) {
1820
1874
  /**
1821
1875
  * ### .notInstanceOf(object, constructor, [message])
1822
1876
  *
1823
- * Assert `value` is NOT instanceof `constructor`.
1877
+ * Asserts `value` is not an instance of `constructor`.
1824
1878
  *
1825
- * var Tea = function (name) { this.name = name; }
1826
- * , Chai = new String('chai');
1879
+ * var Tea = function (name) { this.name = name; }
1880
+ * , chai = new String('chai');
1827
1881
  *
1828
- * assert.notInstanceOf(Chai, Tea, 'chai is an instance of tea');
1882
+ * assert.notInstanceOf(chai, Tea, 'chai is not an instance of tea');
1829
1883
  *
1830
1884
  * @name notInstanceOf
1831
1885
  * @param {Object} object
@@ -1839,17 +1893,17 @@ module.exports = function (chai, util) {
1839
1893
  };
1840
1894
 
1841
1895
  /**
1842
- * ### .include(value, includes, [message])
1896
+ * ### .include(haystack, needle, [message])
1843
1897
  *
1844
- * Assert the inclusion of an object in another. Works
1898
+ * Asserts that `haystack` includes `needle`. Works
1845
1899
  * for strings and arrays.
1846
1900
  *
1847
- * assert.include('foobar', 'bar', 'foobar contains string `var`);
1848
- * assert.include([ 1, 2, 3], 3, 'array contains value);
1901
+ * assert.include('foobar', 'bar', 'foobar contains string "bar"');
1902
+ * assert.include([ 1, 2, 3 ], 3, 'array contains value');
1849
1903
  *
1850
1904
  * @name include
1851
- * @param {Array|String} value
1852
- * @param {*} includes
1905
+ * @param {Array|String} haystack
1906
+ * @param {Mixed} needle
1853
1907
  * @param {String} message
1854
1908
  * @api public
1855
1909
  */
@@ -1865,15 +1919,15 @@ module.exports = function (chai, util) {
1865
1919
  };
1866
1920
 
1867
1921
  /**
1868
- * ### .match(value, regex, [message])
1922
+ * ### .match(value, regexp, [message])
1869
1923
  *
1870
- * Assert that `value` matches regular expression.
1924
+ * Asserts that `value` matches the regular expression `regexp`.
1871
1925
  *
1872
- * assert.match('foobar', /^foo/, 'Regexp matches');
1926
+ * assert.match('foobar', /^foo/, 'regexp matches');
1873
1927
  *
1874
1928
  * @name match
1875
- * @param {*} value
1876
- * @param {RegExp} RegularExpression
1929
+ * @param {Mixed} value
1930
+ * @param {RegExp} regexp
1877
1931
  * @param {String} message
1878
1932
  * @api public
1879
1933
  */
@@ -1883,15 +1937,15 @@ module.exports = function (chai, util) {
1883
1937
  };
1884
1938
 
1885
1939
  /**
1886
- * ### .notMatch(value, regex, [message])
1940
+ * ### .notMatch(value, regexp, [message])
1887
1941
  *
1888
- * Assert that `value` does not match regular expression.
1942
+ * Asserts that `value` does not match the regular expression `regexp`.
1889
1943
  *
1890
- * assert.notMatch('foobar', /^foo/, 'Regexp matches');
1944
+ * assert.notMatch('foobar', /^foo/, 'regexp does not match');
1891
1945
  *
1892
1946
  * @name notMatch
1893
- * @param {*} value
1894
- * @param {RegExp} RegularExpression
1947
+ * @param {Mixed} value
1948
+ * @param {RegExp} regexp
1895
1949
  * @param {String} message
1896
1950
  * @api public
1897
1951
  */
@@ -1903,13 +1957,13 @@ module.exports = function (chai, util) {
1903
1957
  /**
1904
1958
  * ### .property(object, property, [message])
1905
1959
  *
1906
- * Assert that `object` has property. Can use dot-notation for deep reference.
1960
+ * Asserts that `object` has a property named by `property`.
1907
1961
  *
1908
- * assert.property({ tea: { green: 'matcha' }}, 'tea.green');
1962
+ * assert.property({ tea: { green: 'matcha' }}, 'tea');
1909
1963
  *
1910
1964
  * @name property
1911
1965
  * @param {Object} object
1912
- * @param {String} Property address
1966
+ * @param {String} property
1913
1967
  * @param {String} message
1914
1968
  * @api public
1915
1969
  */
@@ -1919,15 +1973,15 @@ module.exports = function (chai, util) {
1919
1973
  };
1920
1974
 
1921
1975
  /**
1922
- * ### .notOwnProperty(object, property, [message])
1976
+ * ### .notProperty(object, property, [message])
1923
1977
  *
1924
- * Assert that `object` does not have property. Can use dot-notation for deep reference.
1978
+ * Asserts that `object` does _not_ have a property named by `property`.
1925
1979
  *
1926
- * assert.ownProperty({ tea: { green: 'matcha' }}, 'tea.oolong');
1980
+ * assert.notProperty({ tea: { green: 'matcha' }}, 'coffee');
1927
1981
  *
1928
- * @name notOwnProperty
1982
+ * @name notProperty
1929
1983
  * @param {Object} object
1930
- * @param {String} property address
1984
+ * @param {String} property
1931
1985
  * @param {String} message
1932
1986
  * @api public
1933
1987
  */
@@ -1936,17 +1990,55 @@ module.exports = function (chai, util) {
1936
1990
  new Assertion(obj, msg).to.not.have.property(prop);
1937
1991
  };
1938
1992
 
1993
+ /**
1994
+ * ### .deepProperty(object, property, [message])
1995
+ *
1996
+ * Asserts that `object` has a property named by `property`, which can be a
1997
+ * string using dot- and bracket-notation for deep reference.
1998
+ *
1999
+ * assert.deepProperty({ tea: { green: 'matcha' }}, 'tea.green');
2000
+ *
2001
+ * @name deepProperty
2002
+ * @param {Object} object
2003
+ * @param {String} property
2004
+ * @param {String} message
2005
+ * @api public
2006
+ */
2007
+
2008
+ assert.deepProperty = function (obj, prop, msg) {
2009
+ new Assertion(obj, msg).to.have.deep.property(prop);
2010
+ };
2011
+
2012
+ /**
2013
+ * ### .notDeepProperty(object, property, [message])
2014
+ *
2015
+ * Asserts that `object` does _not_ have a property named by `property`, which
2016
+ * can be a string using dot- and bracket-notation for deep reference.
2017
+ *
2018
+ * assert.notDeepProperty({ tea: { green: 'matcha' }}, 'tea.oolong');
2019
+ *
2020
+ * @name notDeepProperty
2021
+ * @param {Object} object
2022
+ * @param {String} property
2023
+ * @param {String} message
2024
+ * @api public
2025
+ */
2026
+
2027
+ assert.notDeepProperty = function (obj, prop, msg) {
2028
+ new Assertion(obj, msg).to.not.have.deep.property(prop);
2029
+ };
2030
+
1939
2031
  /**
1940
2032
  * ### .propertyVal(object, property, value, [message])
1941
2033
  *
1942
- * Assert that `object` has property with `value`.
1943
- * Can use dot-notation for deep reference.
2034
+ * Asserts that `object` has a property named by `property` with value given
2035
+ * by `value`.
1944
2036
  *
1945
- * assert.propertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'matcha');
2037
+ * assert.propertyVal({ tea: 'is good' }, 'tea', 'is good');
1946
2038
  *
1947
2039
  * @name propertyVal
1948
2040
  * @param {Object} object
1949
- * @param {String} property address
2041
+ * @param {String} property
1950
2042
  * @param {Mixed} value
1951
2043
  * @param {String} message
1952
2044
  * @api public
@@ -1959,32 +2051,75 @@ module.exports = function (chai, util) {
1959
2051
  /**
1960
2052
  * ### .propertyNotVal(object, property, value, [message])
1961
2053
  *
1962
- * Assert that `object` has property but `value`
1963
- * does not equal `value`. Can use dot-notation for deep reference.
2054
+ * Asserts that `object` has a property named by `property`, but with a value
2055
+ * different from that given by `value`.
1964
2056
  *
1965
- * assert.propertyNotVal({ tea: { green: 'matcha' }}, 'tea.green', 'konacha');
2057
+ * assert.propertyNotVal({ tea: 'is good' }, 'tea', 'is bad');
1966
2058
  *
1967
2059
  * @name propertyNotVal
1968
2060
  * @param {Object} object
1969
- * @param {String} property address
2061
+ * @param {String} property
1970
2062
  * @param {Mixed} value
1971
2063
  * @param {String} message
1972
2064
  * @api public
1973
2065
  */
2066
+
1974
2067
  assert.propertyNotVal = function (obj, prop, val, msg) {
1975
2068
  new Assertion(obj, msg).to.not.have.property(prop, val);
1976
2069
  };
1977
2070
 
2071
+ /**
2072
+ * ### .deepPropertyVal(object, property, value, [message])
2073
+ *
2074
+ * Asserts that `object` has a property named by `property` with value given
2075
+ * by `value`. `property` can use dot- and bracket-notation for deep
2076
+ * reference.
2077
+ *
2078
+ * assert.deepPropertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'matcha');
2079
+ *
2080
+ * @name deepPropertyVal
2081
+ * @param {Object} object
2082
+ * @param {String} property
2083
+ * @param {Mixed} value
2084
+ * @param {String} message
2085
+ * @api public
2086
+ */
2087
+
2088
+ assert.deepPropertyVal = function (obj, prop, val, msg) {
2089
+ new Assertion(obj, msg).to.have.deep.property(prop, val);
2090
+ };
2091
+
2092
+ /**
2093
+ * ### .deepPropertyNotVal(object, property, value, [message])
2094
+ *
2095
+ * Asserts that `object` has a property named by `property`, but with a value
2096
+ * different from that given by `value`. `property` can use dot- and
2097
+ * bracket-notation for deep reference.
2098
+ *
2099
+ * assert.deepPropertyNotVal({ tea: { green: 'matcha' }}, 'tea.green', 'konacha');
2100
+ *
2101
+ * @name deepPropertyNotVal
2102
+ * @param {Object} object
2103
+ * @param {String} property
2104
+ * @param {Mixed} value
2105
+ * @param {String} message
2106
+ * @api public
2107
+ */
2108
+
2109
+ assert.deepPropertyNotVal = function (obj, prop, val, msg) {
2110
+ new Assertion(obj, msg).to.not.have.deep.property(prop, val);
2111
+ };
2112
+
1978
2113
  /**
1979
2114
  * ### .lengthOf(object, length, [message])
1980
2115
  *
1981
- * Assert that object has expected length.
2116
+ * Asserts that `object` has a `length` property with the expected value.
1982
2117
  *
1983
- * assert.lengthOf([1,2,3], 3, 'Array has length of 3');
1984
- * assert.lengthOf('foobar', 5, 'String has length of 6');
2118
+ * assert.lengthOf([1,2,3], 3, 'array has length of 3');
2119
+ * assert.lengthOf('foobar', 5, 'string has length of 6');
1985
2120
  *
1986
- * @name length
1987
- * @param {*} value
2121
+ * @name lengthOf
2122
+ * @param {Mixed} object
1988
2123
  * @param {Number} length
1989
2124
  * @param {String} message
1990
2125
  * @api public
@@ -1997,21 +2132,24 @@ module.exports = function (chai, util) {
1997
2132
  /**
1998
2133
  * ### .throws(function, [constructor/regexp], [message])
1999
2134
  *
2000
- * Assert that a function will throw a specific
2001
- * type of error.
2135
+ * Asserts that `function` will throw an error that is an instance of
2136
+ * `constructor`, or alternately that it will throw an error with message
2137
+ * matching `regexp`.
2002
2138
  *
2003
- * assert.throw(fn, ReferenceError, 'function throw reference error');
2139
+ * assert.throw(fn, ReferenceError, 'function throws a reference error');
2004
2140
  *
2005
2141
  * @name throws
2006
2142
  * @alias throw
2007
- * @param {Function} function to test
2143
+ * @alias Throw
2144
+ * @param {Function} function
2008
2145
  * @param {ErrorConstructor} constructor
2146
+ * @param {RegExp} regexp
2009
2147
  * @param {String} message
2010
2148
  * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types
2011
2149
  * @api public
2012
2150
  */
2013
2151
 
2014
- assert.throws = function (fn, type, msg) {
2152
+ assert.Throw = function (fn, type, msg) {
2015
2153
  if ('string' === typeof type) {
2016
2154
  msg = type;
2017
2155
  type = null;
@@ -2023,15 +2161,16 @@ module.exports = function (chai, util) {
2023
2161
  /**
2024
2162
  * ### .doesNotThrow(function, [constructor/regexp], [message])
2025
2163
  *
2026
- * Assert that a function will throw a specific
2027
- * type of error.
2164
+ * Asserts that `function` will _not_ throw an error that is an instance of
2165
+ * `constructor`, or alternately that it will not throw an error with message
2166
+ * matching `regexp`.
2028
2167
  *
2029
- * var fn = function (err) { if (err) throw Error(err) };
2030
- * assert.doesNotThrow(fn, Error, 'function throw reference error');
2168
+ * assert.doesNotThrow(fn, Error, 'function does not throw');
2031
2169
  *
2032
2170
  * @name doesNotThrow
2033
- * @param {Function} function to test
2171
+ * @param {Function} function
2034
2172
  * @param {ErrorConstructor} constructor
2173
+ * @param {RegExp} regexp
2035
2174
  * @param {String} message
2036
2175
  * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types
2037
2176
  * @api public
@@ -2047,17 +2186,17 @@ module.exports = function (chai, util) {
2047
2186
  };
2048
2187
 
2049
2188
  /**
2050
- * ### .operator(val, operator, val2, [message])
2189
+ * ### .operator(val1, operator, val2, [message])
2051
2190
  *
2052
- * Compare two values using operator.
2191
+ * Compares two values using `operator`.
2053
2192
  *
2054
- * assert.operator(1, '<', 2, 'everything is ok');
2055
- * assert.operator(1, '>', 2, 'this will fail');
2193
+ * assert.operator(1, '<', 2, 'everything is ok');
2194
+ * assert.operator(1, '>', 2, 'this will fail');
2056
2195
  *
2057
2196
  * @name operator
2058
- * @param {*} object to test
2197
+ * @param {Mixed} val1
2059
2198
  * @param {String} operator
2060
- * @param {*} second object
2199
+ * @param {Mixed} val2
2061
2200
  * @param {String} message
2062
2201
  * @api public
2063
2202
  */
@@ -2089,7 +2228,8 @@ module.exports = function (chai, util) {
2089
2228
  assert[as] = assert[name];
2090
2229
  return alias;
2091
2230
  })
2092
- ('throws', 'throw');
2231
+ ('Throw', 'throw')
2232
+ ('Throw', 'throws');
2093
2233
  };
2094
2234
 
2095
2235
  }); // module: interface/assert.js