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; return true;
} }
// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness#Loose_equality_using
function findLooseMatchingPrimitives(prim) { function findLooseMatchingPrimitives(prim) {
var values, number;
switch (typeof prim) { switch (typeof prim) {
case 'number': case 'number':
values = ['' + prim]; if (prim === 0) {
if (prim === 1 || prim === 0) return ['', '0', false];
values.push(Boolean(prim));
return values;
case 'string':
number = +prim;
if ('' + number === prim) {
values = [number];
if (number === 1 || number === 0)
values.push(Boolean(number));
} }
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': case 'undefined':
return [null]; return [null];
case 'object': // Only pass in null as object! case 'object': // Only pass in null as object!
return [undefined]; return [undefined];
case 'boolean': case 'boolean':
number = +prim; if (prim === false) {
return [number, '' + number]; return ['', '0', 0];
}
return ['1', 1];
} }
} }

View File

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