konacha 2.0.0.beta2 → 2.0.0.beta3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,112 @@
1
+ require 'spec_helper'
2
+
3
+ describe Konacha::Reporter do
4
+ let(:formatter) { double('formatter').as_null_object }
5
+ subject { described_class.new(formatter) }
6
+
7
+ describe "#start" do
8
+ it "sets the start time to the current time" do
9
+ subject.start
10
+ subject.start_time.should be_within(1.second).of(Time.now)
11
+ end
12
+
13
+ it "processes the start event" do
14
+ subject.should_receive(:process_event).with(:start, nil)
15
+ subject.start
16
+ end
17
+ end
18
+
19
+ describe "#finish" do
20
+ it "calls #stop" do
21
+ subject.should_receive(:stop)
22
+ subject.finish
23
+ end
24
+
25
+ it "processes events" do
26
+ subject.stub(:stop)
27
+ subject.should_receive(:process_event).with(:start_dump).ordered
28
+ subject.should_receive(:process_event).with(:dump_pending).ordered
29
+ subject.should_receive(:process_event).with(:dump_failures).ordered
30
+ subject.should_receive(:process_event).with(:dump_summary, nil, 0, 0, 0).ordered
31
+ subject.should_receive(:process_event).with(:close).ordered
32
+ subject.finish
33
+ end
34
+ end
35
+
36
+ describe "#stop" do
37
+ it "calculates duration" do
38
+ subject.start
39
+ subject.stop
40
+ subject.duration.should_not be_nil
41
+ end
42
+
43
+ it "processes the stop event" do
44
+ subject.should_receive(:process_event).with(:stop)
45
+ subject.stop
46
+ end
47
+ end
48
+
49
+ describe "#process_mocha_event" do
50
+ it "creates the object" do
51
+ subject.stub(:process_event)
52
+ subject.should_receive(:update_or_create_object).with('data', 'type')
53
+ subject.process_mocha_event({'data' => 'data', 'type' => 'type'})
54
+ end
55
+
56
+ it "calls #process_event with the converted event name" do
57
+ object = double('test')
58
+ subject.stub(:update_or_create_object) { object }
59
+ subject.should_receive(:process_event).with(:example_started, object)
60
+ subject.process_mocha_event({'event' => 'test', 'type' => 'test'})
61
+ end
62
+ end
63
+
64
+ describe "#process_event" do
65
+ describe "increments counts" do
66
+ it "increments example count" do
67
+ subject.process_event(:example_started)
68
+ subject.example_count.should == 1
69
+ end
70
+
71
+ it "increments pending count" do
72
+ subject.process_event(:example_pending)
73
+ subject.pending_count.should == 1
74
+ end
75
+
76
+ it "increments failed count" do
77
+ subject.process_event(:example_failed)
78
+ subject.failure_count.should == 1
79
+ end
80
+ end
81
+
82
+ it "forwards the call on to the formatters" do
83
+ formatter.should_receive(:example_started).with('arg!')
84
+ subject.process_event(:example_started, 'arg!')
85
+ end
86
+ end
87
+
88
+ describe "#update_or_create_object" do
89
+ describe "creates the right type of object" do
90
+ it "creates example if test" do
91
+ subject.update_or_create_object({}, 'test').should be_a(Konacha::Reporter::Example)
92
+ end
93
+
94
+ it "creates example_group if suite" do
95
+ subject.update_or_create_object({}, 'suite').should be_a(Konacha::Reporter::ExampleGroup)
96
+ end
97
+ end
98
+
99
+ it "updates if the object with same fullTitle exists" do
100
+ data = {'fullTitle' => 'title'}
101
+ object = subject.update_or_create_object(data, 'test')
102
+ object.should_receive(:update_metadata).with(data)
103
+ subject.update_or_create_object(data, 'test').should == object
104
+ end
105
+
106
+ it "links up the parent correctly" do
107
+ suite = subject.update_or_create_object({'fullTitle' => 'suite'}, 'suite')
108
+ object = subject.update_or_create_object({'fullTitle' => 'suite awesome', 'parentFullTitle' => 'suite'}, 'test')
109
+ object.parent.should == suite
110
+ end
111
+ end
112
+ end
@@ -3,29 +3,98 @@ require 'spec_helper'
3
3
  describe Konacha::Runner do
4
4
  before do
5
5
  Konacha.mode = :runner
6
- Konacha.config.driver = :selenium_with_firebug
6
+ STDOUT.stub(:puts)
7
7
  end
8
8
 
9
- let(:runner) { Konacha::Runner.new(:output => buffer) }
10
- let(:buffer) { StringIO.new }
9
+ describe ".new" do
10
+ before do
11
+ class TestFormatter
12
+ def initialize(io)
13
+ end
14
+ end
15
+ ENV['FORMAT'] = 'Konacha::Formatter,TestFormatter'
16
+ end
17
+
18
+ after do
19
+ Object.send(:remove_const, :TestFormatter)
20
+ ENV.delete('FORMAT')
21
+ end
22
+
23
+ it "initializes a reporter with formatters named by the FORMAT environment variable" do
24
+ Konacha::Reporter.should_receive(:new).with(instance_of(Konacha::Formatter), instance_of(TestFormatter))
25
+ described_class.new
26
+ end
27
+ end
11
28
 
12
29
  describe "#run" do
13
- before { runner.run }
14
-
15
- it "prints results to the output" do
16
- buffer.rewind
17
- results = buffer.read
18
- # Strip colors
19
- results.gsub!(/\e\[([0-9]{1,2}(;[0-9]{1,2})*)?[m|K]/, '')
20
- # Failure output present?
21
- results.should include 'F'
22
- results.should include 'expected 4 to equal 5'
23
- # Pending output present?
24
- results.should include 'P'
25
- results.should include 'is pending'
26
- # Summary and dots
27
- results.should include "#{runner.examples.length} examples, 1 failures, 1 pending"
28
- results.should match /^[.FP]{#{runner.examples.length}}$/
30
+ let(:suite) do
31
+ {'event' => 'suite',
32
+ 'type' => 'suite',
33
+ 'data' => {
34
+ 'title' => 'failure',
35
+ 'fullTitle' => 'failure'
36
+ }}
37
+ end
38
+
39
+ let(:suite_end) do
40
+ {'event' => 'suite end',
41
+ 'type' => 'suite',
42
+ 'data' => {
43
+ 'title' => 'failure',
44
+ 'fullTitle' => 'failure'
45
+ }}
46
+ end
47
+
48
+ let(:test) do
49
+ {'event' => 'test',
50
+ 'type' => 'test',
51
+ 'data' => {
52
+ 'title' => 'fails',
53
+ 'fullTitle' => 'failure fails',
54
+ 'parentFullTitle' => 'failure'}}
55
+ end
56
+
57
+ let(:failure) do
58
+ {'event' => 'fail',
59
+ 'type' => 'test',
60
+ 'data' => {
61
+ 'title' => 'fails',
62
+ 'fullTitle' => 'failure fails',
63
+ 'parentFullTitle' => 'failure',
64
+ 'status' => 'failed',
65
+ 'error' => {'message' => 'expected 4 to equal 5', 'expected' => 5}}}
66
+ end
67
+
68
+ let(:pass) do
69
+ {'event' => 'pass',
70
+ 'type' => 'test',
71
+ 'data' => {
72
+ 'title' => 'is empty',
73
+ 'fullTitle' => 'the body#konacha element is empty',
74
+ 'parentFullTitle' => 'the body#konacha element',
75
+ 'status' => 'passed',
76
+ 'duration' => anything}}
77
+ end
78
+
79
+ let(:pending) do
80
+ {'event' => 'pending',
81
+ 'type' => 'test',
82
+ 'data' => {
83
+ 'title' => 'is pending',
84
+ 'fullTitle' => 'pending test is pending',
85
+ 'parentFullTitle' => 'pending test',
86
+ 'status' => 'pending'}}
87
+ end
88
+
89
+ it "passes along the right events" do
90
+ subject.reporter.should_receive(:process_mocha_event).with(suite)
91
+ subject.reporter.should_receive(:process_mocha_event).with(suite_end)
92
+ subject.reporter.should_receive(:process_mocha_event).with(test)
93
+ subject.reporter.should_receive(:process_mocha_event).with(failure)
94
+ subject.reporter.should_receive(:process_mocha_event).with(pass)
95
+ subject.reporter.should_receive(:process_mocha_event).with(pending)
96
+ subject.reporter.should_receive(:process_mocha_event).any_number_of_times
97
+ subject.run
29
98
  end
30
99
  end
31
100
  end
@@ -74,7 +74,7 @@
74
74
  * Chai version
75
75
  */
76
76
 
77
- exports.version = '1.2.0';
77
+ exports.version = '1.3.0';
78
78
 
79
79
  /*!
80
80
  * Primary `Assertion` prototype
@@ -393,10 +393,12 @@
393
393
  * @name a
394
394
  * @alias an
395
395
  * @param {String} type
396
+ * @param {String} message _optional_
396
397
  * @api public
397
398
  */
398
399
 
399
- function an(type) {
400
+ function an(type, msg) {
401
+ if (msg) flag(this, 'message', msg);
400
402
  var obj = flag(this, 'object')
401
403
  , klassStart = type.charAt(0).toUpperCase()
402
404
  , klass = klassStart + type.slice(1)
@@ -427,6 +429,7 @@
427
429
  * @name include
428
430
  * @alias contain
429
431
  * @param {Object|String|Number} obj
432
+ * @param {String} message _optional_
430
433
  * @api public
431
434
  */
432
435
 
@@ -434,7 +437,8 @@
434
437
  flag(this, 'contains', true);
435
438
  }
436
439
 
437
- function include (val) {
440
+ function include (val, msg) {
441
+ if (msg) flag(this, 'message', msg);
438
442
  var obj = flag(this, 'object')
439
443
  this.assert(
440
444
  ~obj.indexOf(val)
@@ -652,10 +656,12 @@
652
656
  * @alias eq
653
657
  * @alias deep.equal
654
658
  * @param {Mixed} value
659
+ * @param {String} message _optional_
655
660
  * @api public
656
661
  */
657
662
 
658
- function assertEqual (val) {
663
+ function assertEqual (val, msg) {
664
+ if (msg) flag(this, 'message', msg);
659
665
  var obj = flag(this, 'object');
660
666
  if (flag(this, 'deep')) {
661
667
  return this.eql(val);
@@ -683,10 +689,12 @@
683
689
  *
684
690
  * @name eql
685
691
  * @param {Mixed} value
692
+ * @param {String} message _optional_
686
693
  * @api public
687
694
  */
688
695
 
689
- Assertion.addMethod('eql', function (obj) {
696
+ Assertion.addMethod('eql', function (obj, msg) {
697
+ if (msg) flag(this, 'message', msg);
690
698
  this.assert(
691
699
  _.eql(obj, flag(this, 'object'))
692
700
  , 'expected #{this} to deeply equal #{exp}'
@@ -714,13 +722,15 @@
714
722
  * @alias gt
715
723
  * @alias greaterThan
716
724
  * @param {Number} value
725
+ * @param {String} message _optional_
717
726
  * @api public
718
727
  */
719
728
 
720
- function assertAbove (n) {
729
+ function assertAbove (n, msg) {
730
+ if (msg) flag(this, 'message', msg);
721
731
  var obj = flag(this, 'object');
722
732
  if (flag(this, 'doLength')) {
723
- new Assertion(obj).to.have.property('length');
733
+ new Assertion(obj, msg).to.have.property('length');
724
734
  var len = obj.length;
725
735
  this.assert(
726
736
  len > n
@@ -761,13 +771,15 @@
761
771
  * @alias lt
762
772
  * @alias lessThan
763
773
  * @param {Number} value
774
+ * @param {String} message _optional_
764
775
  * @api public
765
776
  */
766
777
 
767
- function assertBelow (n) {
778
+ function assertBelow (n, msg) {
779
+ if (msg) flag(this, 'message', msg);
768
780
  var obj = flag(this, 'object');
769
781
  if (flag(this, 'doLength')) {
770
- new Assertion(obj).to.have.property('length');
782
+ new Assertion(obj, msg).to.have.property('length');
771
783
  var len = obj.length;
772
784
  this.assert(
773
785
  len < n
@@ -807,14 +819,16 @@
807
819
  * @name within
808
820
  * @param {Number} start lowerbound inclusive
809
821
  * @param {Number} finish upperbound inclusive
822
+ * @param {String} message _optional_
810
823
  * @api public
811
824
  */
812
825
 
813
- Assertion.addMethod('within', function (start, finish) {
826
+ Assertion.addMethod('within', function (start, finish, msg) {
827
+ if (msg) flag(this, 'message', msg);
814
828
  var obj = flag(this, 'object')
815
829
  , range = start + '..' + finish;
816
830
  if (flag(this, 'doLength')) {
817
- new Assertion(obj).to.have.property('length');
831
+ new Assertion(obj, msg).to.have.property('length');
818
832
  var len = obj.length;
819
833
  this.assert(
820
834
  len >= start && len <= finish
@@ -843,11 +857,13 @@
843
857
  *
844
858
  * @name instanceof
845
859
  * @param {Constructor} constructor
860
+ * @param {String} message _optional_
846
861
  * @alias instanceOf
847
862
  * @api public
848
863
  */
849
864
 
850
- function assertInstanceOf (constructor) {
865
+ function assertInstanceOf (constructor, msg) {
866
+ if (msg) flag(this, 'message', msg);
851
867
  var name = _.getName(constructor);
852
868
  this.assert(
853
869
  flag(this, 'object') instanceof constructor
@@ -913,11 +929,14 @@
913
929
  * @alias deep.property
914
930
  * @param {String} name
915
931
  * @param {Mixed} value (optional)
932
+ * @param {String} message _optional_
916
933
  * @returns value of property for chaining
917
934
  * @api public
918
935
  */
919
936
 
920
- Assertion.addMethod('property', function (name, val) {
937
+ Assertion.addMethod('property', function (name, val, msg) {
938
+ if (msg) flag(this, 'message', msg);
939
+
921
940
  var descriptor = flag(this, 'deep') ? 'deep property ' : 'property '
922
941
  , negate = flag(this, 'negate')
923
942
  , obj = flag(this, 'object')
@@ -927,7 +946,8 @@
927
946
 
928
947
  if (negate && undefined !== val) {
929
948
  if (undefined === value) {
930
- throw new Error(_.inspect(obj) + ' has no ' + descriptor + _.inspect(name));
949
+ msg = (msg != null) ? msg + ': ' : '';
950
+ throw new Error(msg + _.inspect(obj) + ' has no ' + descriptor + _.inspect(name));
931
951
  }
932
952
  } else {
933
953
  this.assert(
@@ -960,10 +980,12 @@
960
980
  * @name ownProperty
961
981
  * @alias haveOwnProperty
962
982
  * @param {String} name
983
+ * @param {String} message _optional_
963
984
  * @api public
964
985
  */
965
986
 
966
- function assertOwnProperty (name) {
987
+ function assertOwnProperty (name, msg) {
988
+ if (msg) flag(this, 'message', msg);
967
989
  var obj = flag(this, 'object');
968
990
  this.assert(
969
991
  obj.hasOwnProperty(name)
@@ -997,6 +1019,7 @@
997
1019
  * @name length
998
1020
  * @alias lengthOf
999
1021
  * @param {Number} length
1022
+ * @param {String} message _optional_
1000
1023
  * @api public
1001
1024
  */
1002
1025
 
@@ -1004,9 +1027,10 @@
1004
1027
  flag(this, 'doLength', true);
1005
1028
  }
1006
1029
 
1007
- function assertLength (n) {
1030
+ function assertLength (n, msg) {
1031
+ if (msg) flag(this, 'message', msg);
1008
1032
  var obj = flag(this, 'object');
1009
- new Assertion(obj).to.have.property('length');
1033
+ new Assertion(obj, msg).to.have.property('length');
1010
1034
  var len = obj.length;
1011
1035
 
1012
1036
  this.assert(
@@ -1030,10 +1054,12 @@
1030
1054
  *
1031
1055
  * @name match
1032
1056
  * @param {RegExp} RegularExpression
1057
+ * @param {String} message _optional_
1033
1058
  * @api public
1034
1059
  */
1035
1060
 
1036
- Assertion.addMethod('match', function (re) {
1061
+ Assertion.addMethod('match', function (re, msg) {
1062
+ if (msg) flag(this, 'message', msg);
1037
1063
  var obj = flag(this, 'object');
1038
1064
  this.assert(
1039
1065
  re.exec(obj)
@@ -1051,12 +1077,14 @@
1051
1077
  *
1052
1078
  * @name string
1053
1079
  * @param {String} string
1080
+ * @param {String} message _optional_
1054
1081
  * @api public
1055
1082
  */
1056
1083
 
1057
- Assertion.addMethod('string', function (str) {
1084
+ Assertion.addMethod('string', function (str, msg) {
1085
+ if (msg) flag(this, 'message', msg);
1058
1086
  var obj = flag(this, 'object');
1059
- new Assertion(obj).is.a('string');
1087
+ new Assertion(obj, msg).is.a('string');
1060
1088
 
1061
1089
  this.assert(
1062
1090
  ~obj.indexOf(str)
@@ -1163,28 +1191,32 @@
1163
1191
  * @alias throws
1164
1192
  * @alias Throw
1165
1193
  * @param {ErrorConstructor} constructor
1194
+ * @param {String|RegExp} expected error message
1195
+ * @param {String} message _optional_
1166
1196
  * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types
1167
1197
  * @api public
1168
1198
  */
1169
1199
 
1170
- function assertThrows (constructor, msg) {
1200
+ function assertThrows (constructor, errMsg, msg) {
1201
+ if (msg) flag(this, 'message', msg);
1171
1202
  var obj = flag(this, 'object');
1172
- new Assertion(obj).is.a('function');
1203
+ new Assertion(obj, msg).is.a('function');
1173
1204
 
1174
1205
  var thrown = false
1175
1206
  , desiredError = null
1176
- , name = null;
1207
+ , name = null
1208
+ , thrownError = null;
1177
1209
 
1178
1210
  if (arguments.length === 0) {
1179
- msg = null;
1211
+ errMsg = null;
1180
1212
  constructor = null;
1181
1213
  } else if (constructor && (constructor instanceof RegExp || 'string' === typeof constructor)) {
1182
- msg = constructor;
1214
+ errMsg = constructor;
1183
1215
  constructor = null;
1184
1216
  } else if (constructor && constructor instanceof Error) {
1185
1217
  desiredError = constructor;
1186
1218
  constructor = null;
1187
- msg = null;
1219
+ errMsg = null;
1188
1220
  } else if (typeof constructor === 'function') {
1189
1221
  name = (new constructor()).name;
1190
1222
  } else {
@@ -1207,38 +1239,43 @@
1207
1239
  if (constructor) {
1208
1240
  this.assert(
1209
1241
  err instanceof constructor
1210
- , 'expected #{this} to throw ' + name + ' but a ' + err.name + ' was thrown'
1211
- , 'expected #{this} to not throw ' + name );
1212
- if (!msg) return this;
1242
+ , 'expected #{this} to throw ' + name + ' but ' + _.inspect(err) + ' was thrown'
1243
+ , 'expected #{this} to not throw ' + name + ' but ' + _.inspect(err) + ' was thrown');
1244
+ if (!errMsg) return this;
1213
1245
  }
1214
1246
  // next, check message
1215
- if (err.message && msg && msg instanceof RegExp) {
1247
+ if (err.message && errMsg && errMsg instanceof RegExp) {
1216
1248
  this.assert(
1217
- msg.exec(err.message)
1218
- , 'expected #{this} to throw error matching ' + msg + ' but got ' + _.inspect(err.message)
1219
- , 'expected #{this} to throw error not matching ' + msg
1249
+ errMsg.exec(err.message)
1250
+ , 'expected #{this} to throw error matching ' + errMsg + ' but got ' + _.inspect(err.message)
1251
+ , 'expected #{this} to throw error not matching ' + errMsg
1220
1252
  );
1221
1253
  return this;
1222
- } else if (err.message && msg && 'string' === typeof msg) {
1254
+ } else if (err.message && errMsg && 'string' === typeof errMsg) {
1223
1255
  this.assert(
1224
- ~err.message.indexOf(msg)
1256
+ ~err.message.indexOf(errMsg)
1225
1257
  , 'expected #{this} to throw error including #{exp} but got #{act}'
1226
1258
  , 'expected #{this} to throw error not including #{act}'
1227
- , msg
1259
+ , errMsg
1228
1260
  , err.message
1229
1261
  );
1230
1262
  return this;
1231
1263
  } else {
1232
1264
  thrown = true;
1265
+ thrownError = err;
1233
1266
  }
1234
1267
  }
1235
1268
 
1236
1269
  var expectedThrown = name ? name : desiredError ? _.inspect(desiredError) : 'an error';
1270
+ var actuallyGot = ''
1271
+ if (thrown) {
1272
+ actuallyGot = ' but ' + _.inspect(thrownError) + ' was thrown'
1273
+ }
1237
1274
 
1238
1275
  this.assert(
1239
1276
  thrown === true
1240
- , 'expected #{this} to throw ' + expectedThrown
1241
- , 'expected #{this} to not throw ' + expectedThrown
1277
+ , 'expected #{this} to throw ' + expectedThrown + actuallyGot
1278
+ , 'expected #{this} to not throw ' + expectedThrown + actuallyGot
1242
1279
  );
1243
1280
  };
1244
1281
 
@@ -1263,10 +1300,12 @@
1263
1300
  *
1264
1301
  * @name respondTo
1265
1302
  * @param {String} method
1303
+ * @param {String} message _optional_
1266
1304
  * @api public
1267
1305
  */
1268
1306
 
1269
- Assertion.addMethod('respondTo', function (method) {
1307
+ Assertion.addMethod('respondTo', function (method, msg) {
1308
+ if (msg) flag(this, 'message', msg);
1270
1309
  var obj = flag(this, 'object')
1271
1310
  , itself = flag(this, 'itself')
1272
1311
  , context = ('function' === typeof obj && !itself)
@@ -1309,10 +1348,12 @@
1309
1348
  *
1310
1349
  * @name satisfy
1311
1350
  * @param {Function} matcher
1351
+ * @param {String} message _optional_
1312
1352
  * @api public
1313
1353
  */
1314
1354
 
1315
- Assertion.addMethod('satisfy', function (matcher) {
1355
+ Assertion.addMethod('satisfy', function (matcher, msg) {
1356
+ if (msg) flag(this, 'message', msg);
1316
1357
  var obj = flag(this, 'object');
1317
1358
  this.assert(
1318
1359
  matcher(obj)
@@ -1333,10 +1374,12 @@
1333
1374
  * @name closeTo
1334
1375
  * @param {Number} expected
1335
1376
  * @param {Number} delta
1377
+ * @param {String} message _optional_
1336
1378
  * @api public
1337
1379
  */
1338
1380
 
1339
- Assertion.addMethod('closeTo', function (expected, delta) {
1381
+ Assertion.addMethod('closeTo', function (expected, delta, msg) {
1382
+ if (msg) flag(this, 'message', msg);
1340
1383
  var obj = flag(this, 'object');
1341
1384
  this.assert(
1342
1385
  Math.abs(obj - expected) <= delta
@@ -2364,7 +2407,21 @@
2364
2407
  function loadShould () {
2365
2408
  // modify Object.prototype to have `should`
2366
2409
  Object.defineProperty(Object.prototype, 'should',
2367
- { set: function () {}
2410
+ {
2411
+ set: function (value) {
2412
+ // See https://github.com/chaijs/chai/issues/86: this makes
2413
+ // `whatever.should = someValue` actually set `someValue`, which is
2414
+ // especially useful for `global.should = require('chai').should()`.
2415
+ //
2416
+ // Note that we have to use [[DefineProperty]] instead of [[Put]]
2417
+ // since otherwise we would trigger this very setter!
2418
+ Object.defineProperty(this, 'should', {
2419
+ value: value,
2420
+ enumerable: true,
2421
+ configurable: true,
2422
+ writable: true
2423
+ });
2424
+ }
2368
2425
  , get: function(){
2369
2426
  if (this instanceof String || this instanceof Number) {
2370
2427
  return new Assertion(this.constructor(this));
@@ -2378,31 +2435,31 @@
2378
2435
 
2379
2436
  var should = {};
2380
2437
 
2381
- should.equal = function (val1, val2) {
2382
- new Assertion(val1).to.equal(val2);
2438
+ should.equal = function (val1, val2, msg) {
2439
+ new Assertion(val1, msg).to.equal(val2);
2383
2440
  };
2384
2441
 
2385
- should.Throw = function (fn, errt, errs) {
2386
- new Assertion(fn).to.Throw(errt, errs);
2442
+ should.Throw = function (fn, errt, errs, msg) {
2443
+ new Assertion(fn, msg).to.Throw(errt, errs);
2387
2444
  };
2388
2445
 
2389
- should.exist = function (val) {
2390
- new Assertion(val).to.exist;
2446
+ should.exist = function (val, msg) {
2447
+ new Assertion(val, msg).to.exist;
2391
2448
  }
2392
2449
 
2393
2450
  // negation
2394
2451
  should.not = {}
2395
2452
 
2396
- should.not.equal = function (val1, val2) {
2397
- new Assertion(val1).to.not.equal(val2);
2453
+ should.not.equal = function (val1, val2, msg) {
2454
+ new Assertion(val1, msg).to.not.equal(val2);
2398
2455
  };
2399
2456
 
2400
- should.not.Throw = function (fn, errt, errs) {
2401
- new Assertion(fn).to.not.Throw(errt, errs);
2457
+ should.not.Throw = function (fn, errt, errs, msg) {
2458
+ new Assertion(fn, msg).to.not.Throw(errt, errs);
2402
2459
  };
2403
2460
 
2404
- should.not.exist = function (val) {
2405
- new Assertion(val).to.not.exist;
2461
+ should.not.exist = function (val, msg) {
2462
+ new Assertion(val, msg).to.not.exist;
2406
2463
  }
2407
2464
 
2408
2465
  should['throw'] = should['Throw'];
@@ -2577,22 +2634,23 @@
2577
2634
  }); // module: chai/utils/addProperty.js
2578
2635
 
2579
2636
  require.register("chai/utils/eql.js", function(module, exports, require){
2580
- // This is directly from Node.js assert
2637
+ // This is (almost) directly from Node.js assert
2581
2638
  // https://github.com/joyent/node/blob/f8c335d0caf47f16d31413f89aa28eda3878e3aa/lib/assert.js
2582
2639
 
2583
-
2584
2640
  module.exports = _deepEqual;
2585
2641
 
2586
- // For browser implementation
2587
- if (!Buffer) {
2588
- var Buffer = {
2589
- isBuffer: function () {
2590
- return false;
2591
- }
2642
+ // for the browser
2643
+ var Buffer;
2644
+ try {
2645
+ Buffer = require('buffer').Buffer;
2646
+ } catch (ex) {
2647
+ Buffer = {
2648
+ isBuffer: function () { return false; }
2592
2649
  };
2593
2650
  }
2594
2651
 
2595
2652
  function _deepEqual(actual, expected) {
2653
+
2596
2654
  // 7.1. All identical values are equivalent, as determined by ===.
2597
2655
  if (actual === expected) {
2598
2656
  return true;
@@ -2677,6 +2735,7 @@
2677
2735
  }
2678
2736
  return true;
2679
2737
  }
2738
+
2680
2739
  }); // module: chai/utils/eql.js
2681
2740
 
2682
2741
  require.register("chai/utils/flag.js", function(module, exports, require){