diff --git a/doc/api/assert.md b/doc/api/assert.md index 9d1a7fb7e169ea..05df0d448395d0 100644 --- a/doc/api/assert.md +++ b/doc/api/assert.md @@ -160,6 +160,10 @@ An alias of [`assert.ok()`][]. * `actual` {any} @@ -569,7 +579,8 @@ An alias of [`assert.strictEqual()`][]. > Stability: 0 - Deprecated: Use [`assert.strictEqual()`][] instead. Tests shallow, coercive equality between the `actual` and `expected` parameters -using the [Abstract Equality Comparison][] ( `==` ). +using the [Abstract Equality Comparison][] ( `==` ). `NaN` is special handled +and treated as being identical in case both sides are `NaN`. ```js const assert = require('assert'); @@ -578,6 +589,8 @@ assert.equal(1, 1); // OK, 1 == 1 assert.equal(1, '1'); // OK, 1 == '1' +assert.equal(NaN, NaN); +// OK assert.equal(1, 2); // AssertionError: 1 == 2 @@ -732,6 +745,10 @@ let err; * `actual` {any} @@ -868,7 +890,8 @@ An alias of [`assert.notStrictEqual()`][]. > Stability: 0 - Deprecated: Use [`assert.notStrictEqual()`][] instead. Tests shallow, coercive inequality with the [Abstract Equality Comparison][] -( `!=` ). +(`!=` ). `NaN` is special handled and treated as being identical in case both +sides are `NaN`. ```js const assert = require('assert'); diff --git a/lib/assert.js b/lib/assert.js index c3faba09053474..828a443ec9290a 100644 --- a/lib/assert.js +++ b/lib/assert.js @@ -25,6 +25,7 @@ const { ObjectIs, ObjectKeys, ObjectPrototypeIsPrototypeOf, + NumberIsNaN } = primordials; const { Buffer } = require('buffer'); @@ -398,7 +399,7 @@ assert.equal = function equal(actual, expected, message) { throw new ERR_MISSING_ARGS('actual', 'expected'); } // eslint-disable-next-line eqeqeq - if (actual != expected) { + if (actual != expected && (!NumberIsNaN(actual) || !NumberIsNaN(expected))) { innerFail({ actual, expected, @@ -416,7 +417,7 @@ assert.notEqual = function notEqual(actual, expected, message) { throw new ERR_MISSING_ARGS('actual', 'expected'); } // eslint-disable-next-line eqeqeq - if (actual == expected) { + if (actual == expected || (NumberIsNaN(actual) && NumberIsNaN(expected))) { innerFail({ actual, expected, diff --git a/lib/internal/util/comparisons.js b/lib/internal/util/comparisons.js index 734ecf6224a0bf..b26012923c80c5 100644 --- a/lib/internal/util/comparisons.js +++ b/lib/internal/util/comparisons.js @@ -180,7 +180,7 @@ function innerDeepEqual(val1, val2, strict, memos) { if (val1 === null || typeof val1 !== 'object') { if (val2 === null || typeof val2 !== 'object') { // eslint-disable-next-line eqeqeq - return val1 == val2; + return val1 == val2 || (NumberIsNaN(val1) && NumberIsNaN(val2)); } return false; } diff --git a/test/parallel/test-assert-deep.js b/test/parallel/test-assert-deep.js index 9d30f466f34928..f2a83492194977 100644 --- a/test/parallel/test-assert-deep.js +++ b/test/parallel/test-assert-deep.js @@ -590,10 +590,9 @@ assertNotDeepOrStrict( } // Handle NaN -assert.notDeepEqual(NaN, NaN); -assert.deepStrictEqual(NaN, NaN); -assert.deepStrictEqual({ a: NaN }, { a: NaN }); -assert.deepStrictEqual([ 1, 2, NaN, 4 ], [ 1, 2, NaN, 4 ]); +assertDeepAndStrictEqual(NaN, NaN); +assertDeepAndStrictEqual({ a: NaN }, { a: NaN }); +assertDeepAndStrictEqual([ 1, 2, NaN, 4 ], [ 1, 2, NaN, 4 ]); // Handle boxed primitives { diff --git a/test/parallel/test-assert.js b/test/parallel/test-assert.js index 48b44ce29b4979..3db63a816a5294 100644 --- a/test/parallel/test-assert.js +++ b/test/parallel/test-assert.js @@ -501,6 +501,12 @@ assert.throws( } ); +a.equal(NaN, NaN); +a.throws( + () => a.notEqual(NaN, NaN), + a.AssertionError +); + // Test strict assert. { const a = require('assert');