Skip to content

Commit 27f683a

Browse files
committed
added assert.deepInclude
1 parent 7c9b21d commit 27f683a

File tree

3 files changed

+95
-1
lines changed

3 files changed

+95
-1
lines changed

lib/assert/macros.js

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
var assert = require('assert');
1+
var assert = require('assert'),
2+
utils = require('assert/utils');
23

34
var messages = {
45
'equal' : "expected {expected},\n\tgot\t {actual} ({operator})",
@@ -77,6 +78,16 @@ assert.include = function (actual, expected, message) {
7778
};
7879
assert.includes = assert.include;
7980

81+
assert.deepInclude = function (actual, expected, message) {
82+
if (!isArray(actual)) {
83+
return assert.include(actual, expected, message);
84+
}
85+
if (!actual.some(function (item) { return utils.deepEqual(item, expected) })) {
86+
assert.fail(actual, expected, message || "expected {actual} to include {expected}", "include", assert.deepInclude);
87+
}
88+
};
89+
assert.deepIncludes = assert.deepInclude;
90+
8091
//
8192
// Length
8293
//
@@ -146,6 +157,7 @@ assert.instanceOf = function (actual, expected, message) {
146157
//
147158
// Utility functions
148159
//
160+
149161
function assertTypeOf(actual, expected, message, caller) {
150162
if (typeOf(actual) !== expected) {
151163
assert.fail(actual, expected, message || "expected {actual} to be of type {expected}", "typeOf", caller);

lib/assert/utils.js

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
2+
// Taken from node/lib/assert.js
3+
exports.deepEqual = function (actual, expected) {
4+
if (actual === expected) {
5+
return true;
6+
7+
} else if (Buffer.isBuffer(actual) && Buffer.isBuffer(expected)) {
8+
if (actual.length != expected.length) return false;
9+
10+
for (var i = 0; i < actual.length; i++) {
11+
if (actual[i] !== expected[i]) return false;
12+
}
13+
return true;
14+
15+
} else if (actual instanceof Date && expected instanceof Date) {
16+
return actual.getTime() === expected.getTime();
17+
18+
} else if (typeof actual != 'object' && typeof expected != 'object') {
19+
return actual == expected;
20+
21+
} else {
22+
return objEquiv(actual, expected);
23+
}
24+
}
25+
26+
// Taken from node/lib/assert.js
27+
exports.notDeepEqual = function (actual, expected, message) {
28+
if (exports.deepEqual(actual, expected)) {
29+
fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);
30+
}
31+
}
32+
33+
// Taken from node/lib/assert.js
34+
function isUndefinedOrNull(value) {
35+
return value === null || value === undefined;
36+
}
37+
38+
// Taken from node/lib/assert.js
39+
function isArguments(object) {
40+
return Object.prototype.toString.call(object) == '[object Arguments]';
41+
}
42+
43+
// Taken from node/lib/assert.js
44+
function objEquiv(a, b) {
45+
if (isUndefinedOrNull(a) || isUndefinedOrNull(b))
46+
return false;
47+
if (a.prototype !== b.prototype) return false;
48+
if (isArguments(a)) {
49+
if (!isArguments(b)) {
50+
return false;
51+
}
52+
a = pSlice.call(a);
53+
b = pSlice.call(b);
54+
return exports.deepEqual(a, b);
55+
}
56+
try {
57+
var ka = Object.keys(a),
58+
kb = Object.keys(b),
59+
key, i;
60+
} catch (e) {
61+
return false;
62+
}
63+
if (ka.length != kb.length)
64+
return false;
65+
ka.sort();
66+
kb.sort();
67+
for (i = ka.length - 1; i >= 0; i--) {
68+
if (ka[i] != kb[i])
69+
return false;
70+
}
71+
for (i = ka.length - 1; i >= 0; i--) {
72+
key = ka[i];
73+
if (!exports.deepEqual(a[key], b[key])) return false;
74+
}
75+
return true;
76+
}
77+

test/assert-test.js

+5
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ vows.describe('vows/assert').addBatch({
2121
assert.include([0, 42, 0], 42);
2222
assert.include({goo:true}, 'goo');
2323
},
24+
"`deepInclude`": function (assert) {
25+
assert.deepInclude([{a:'b'},{c:'d'}], {a:'b'});
26+
assert.deepInclude("hello world", "world");
27+
assert.deepInclude({goo:true}, 'goo');
28+
},
2429
"`typeOf`": function (assert) {
2530
assert.typeOf('goo', 'string');
2631
assert.typeOf(42, 'number');

0 commit comments

Comments
 (0)