assert: use SameValueZero in deepStrictEqual
Comparing NaN will not throw anymore. PR-URL: https://github.com/nodejs/node/pull/15036 Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Refael Ackermann <refack@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
This commit is contained in:
parent
1789dcfc87
commit
ea2e6363f2
@ -107,6 +107,9 @@ parameter is undefined, a default error message is assigned.
|
||||
<!-- YAML
|
||||
added: v1.2.0
|
||||
changes:
|
||||
- version: REPLACEME
|
||||
pr-url: https://github.com/nodejs/node/pull/15036
|
||||
description: NaN is now compared using the [SameValueZero][] comparison.
|
||||
- version: REPLACEME
|
||||
pr-url: https://github.com/nodejs/node/pull/15001
|
||||
description: Error names and messages are now properly compared
|
||||
@ -129,9 +132,10 @@ changes:
|
||||
|
||||
Generally identical to `assert.deepEqual()` with three exceptions:
|
||||
|
||||
1. Primitive values are compared using the [Strict Equality Comparison][]
|
||||
( `===` ). Set values and Map keys are compared using the [SameValueZero][]
|
||||
comparison. (Which means they are free of the [caveats][]).
|
||||
1. Primitive values besides `NaN` are compared using the [Strict Equality
|
||||
Comparison][] ( `===` ). Set and Map values, Map keys and `NaN` are compared
|
||||
using the [SameValueZero][] comparison (which means they are free of the
|
||||
[caveats][]).
|
||||
2. [`[[Prototype]]`][prototype-spec] of objects are compared using
|
||||
the [Strict Equality Comparison][] too.
|
||||
3. [Type tags][Object.prototype.toString()] of objects should be the same.
|
||||
@ -164,6 +168,8 @@ assert.deepEqual(date, fakeDate);
|
||||
assert.deepStrictEqual(date, fakeDate);
|
||||
// AssertionError: 2017-03-11T14:25:31.849Z deepStrictEqual Date {}
|
||||
// Different type tags
|
||||
assert.deepStrictEqual(NaN, NaN);
|
||||
// OK, because of the SameValueZero comparison
|
||||
```
|
||||
|
||||
If the values are not equal, an `AssertionError` is thrown with a `message`
|
||||
@ -412,6 +418,9 @@ parameter is undefined, a default error message is assigned.
|
||||
<!-- YAML
|
||||
added: v1.2.0
|
||||
changes:
|
||||
- version: REPLACEME
|
||||
pr-url: https://github.com/nodejs/node/pull/15036
|
||||
description: NaN is now compared using the [SameValueZero][] comparison.
|
||||
- version: REPLACEME
|
||||
pr-url: https://github.com/nodejs/node/pull/15001
|
||||
description: Error names and messages are now properly compared
|
||||
|
@ -167,8 +167,11 @@ function isObjectOrArrayTag(tag) {
|
||||
// a) The same built-in type tags
|
||||
// b) The same prototypes.
|
||||
function strictDeepEqual(actual, expected) {
|
||||
if (actual === null || expected === null ||
|
||||
typeof actual !== 'object' || typeof expected !== 'object') {
|
||||
if (typeof actual !== 'object') {
|
||||
return typeof actual === 'number' && Number.isNaN(actual) &&
|
||||
Number.isNaN(expected);
|
||||
}
|
||||
if (typeof expected !== 'object' || actual === null || expected === null) {
|
||||
return false;
|
||||
}
|
||||
const actualTag = objectToString(actual);
|
||||
|
@ -466,6 +466,7 @@ assertOnlyDeepEqual(
|
||||
assertDeepAndStrictEqual(m3, m4);
|
||||
}
|
||||
|
||||
// Handle sparse arrays
|
||||
assertDeepAndStrictEqual([1, , , 3], [1, , , 3]);
|
||||
assertOnlyDeepEqual([1, , , 3], [1, , , 3, , , ]);
|
||||
|
||||
@ -481,4 +482,11 @@ assertOnlyDeepEqual([1, , , 3], [1, , , 3, , , ]);
|
||||
assertOnlyDeepEqual(err1, {}, assert.AssertionError);
|
||||
}
|
||||
|
||||
// Handle NaN
|
||||
assert.throws(() => { assert.deepEqual(NaN, NaN); }, assert.AssertionError);
|
||||
assert.doesNotThrow(() => { assert.deepStrictEqual(NaN, NaN); });
|
||||
assert.doesNotThrow(() => { assert.deepStrictEqual({ a: NaN }, { a: NaN }); });
|
||||
assert.doesNotThrow(
|
||||
() => { assert.deepStrictEqual([ 1, 2, NaN, 4 ], [ 1, 2, NaN, 4 ]); });
|
||||
|
||||
/* eslint-enable */
|
||||
|
Loading…
x
Reference in New Issue
Block a user