assert: fix loose assert with map and set

There was an oversight when checking the possible loose comparisons.
This is now fixed by also accepting `''` instead of `0` or `false`.

PR-URL: https://github.com/nodejs/node/pull/22145
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
This commit is contained in:
Ruben Bridgewater 2018-08-06 01:19:01 +02:00
parent 1d859ef532
commit 85bfd71312
No known key found for this signature in database
GPG Key ID: F07496B3EB3C1762
2 changed files with 31 additions and 18 deletions

View File

@ -354,29 +354,38 @@ function setEquiv(a, b, strict, memo) {
return true;
}
// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness#Loose_equality_using
function findLooseMatchingPrimitives(prim) {
var values, number;
switch (typeof prim) {
case 'number':
values = ['' + prim];
if (prim === 1 || prim === 0)
values.push(Boolean(prim));
return values;
case 'string':
number = +prim;
if ('' + number === prim) {
values = [number];
if (number === 1 || number === 0)
values.push(Boolean(number));
if (prim === 0) {
return ['', '0', false];
}
return values;
if (prim === 1) {
return ['1', true];
}
return ['' + prim];
case 'string':
if (prim === '' || prim === '0') {
return [0, false];
}
if (prim === '1') {
return [1, true];
}
const number = +prim;
if ('' + number === prim) {
return [number];
}
return;
case 'undefined':
return [null];
case 'object': // Only pass in null as object!
return [undefined];
case 'boolean':
number = +prim;
return [number, '' + number];
if (prim === false) {
return ['', '0', 0];
}
return ['1', 1];
}
}

View File

@ -355,8 +355,8 @@ assertDeepAndStrictEqual(
new Map([[1, undefined]])
);
assertOnlyDeepEqual(
new Map([[1, null]]),
new Map([['1', undefined]])
new Map([[1, null], ['', '0']]),
new Map([['1', undefined], [false, 0]])
);
assertNotDeepOrStrict(
new Map([[1, undefined]]),
@ -373,8 +373,12 @@ assertOnlyDeepEqual(
new Map([[undefined, null]])
);
assertOnlyDeepEqual(
new Set([null]),
new Set([undefined])
new Set([null, '']),
new Set([undefined, 0])
);
assertNotDeepOrStrict(
new Set(['']),
new Set(['0'])
);
// GH-6416. Make sure circular refs don't throw.