assert: fix deepEqual inconsistencies

PR-URL: https://github.com/nodejs/node/pull/14491
Fixes: https://github.com/nodejs/node/issues/14441
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Khaidi Chu <i@2333.moe>
Reviewed-By: Tobias Nießen <tniessen@tnie.de>
This commit is contained in:
Ruben Bridgewater 2017-07-25 21:36:12 -03:00 committed by Tobias Nießen
parent 8a53897325
commit a8149c4799
3 changed files with 31 additions and 4 deletions

View File

@ -271,8 +271,15 @@ function innerDeepEqual(actual, expected, strict, memos) {
position: 0
};
} else {
if (memos.actual.has(actual)) {
return memos.actual.get(actual) === memos.expected.get(expected);
// We prevent up to two map.has(x) calls by directly retrieving the value
// and checking for undefined. The map can only contain numbers, so it is
// safe to check for undefined only.
const expectedMemoA = memos.actual.get(actual);
if (expectedMemoA !== undefined) {
const expectedMemoB = memos.expected.get(expected);
if (expectedMemoB !== undefined) {
return expectedMemoA === expectedMemoB;
}
}
memos.position++;
}

View File

@ -303,6 +303,26 @@ assertOnlyDeepEqual(
new Set([undefined])
);
// Circular structures
{
const a = {};
const b = {};
a.a = a;
b.a = {};
b.a.a = a;
assertDeepAndStrictEqual(a, b);
}
{
const a = new Set();
const b = new Set();
const c = new Set();
a.add(a);
b.add(b);
c.add(a);
assertDeepAndStrictEqual(b, c);
}
{
const values = [
123,

View File

@ -578,8 +578,8 @@ a.throws(makeBlock(thrower, TypeError), function(err) {
const h = { ref: g };
a.throws(makeBlock(a.deepEqual, f, h), /AssertionError/);
a.throws(makeBlock(a.deepStrictEqual, f, h), /AssertionError/);
a.doesNotThrow(makeBlock(a.deepEqual, f, h));
a.doesNotThrow(makeBlock(a.deepStrictEqual, f, h));
}
// GH-7178. Ensure reflexivity of deepEqual with `arguments` objects.
const args = (function() { return arguments; })();