From 943cb6d201b1201d6efb0c8d2cf3c61c798366bc Mon Sep 17 00:00:00 2001 From: Giovanni Date: Wed, 11 Dec 2024 18:47:54 +0100 Subject: [PATCH] assert: make partialDeepStrictEqual work with urls and File prototypes --- lib/assert.js | 9 +++++++-- test/parallel/test-assert-objects.js | 25 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/lib/assert.js b/lib/assert.js index a2991a096ac081..ee982884b180f7 100644 --- a/lib/assert.js +++ b/lib/assert.js @@ -94,6 +94,7 @@ const CallTracker = require('internal/assert/calltracker'); const { validateFunction, } = require('internal/validators'); +const { isURL } = require('internal/url'); let isDeepEqual; let isDeepStrictEqual; @@ -382,7 +383,7 @@ function isSpecial(obj) { } const typesToCallDeepStrictEqualWith = [ - isKeyObject, isWeakSet, isWeakMap, Buffer.isBuffer, isSharedArrayBuffer, + isKeyObject, isWeakSet, isWeakMap, Buffer.isBuffer, isSharedArrayBuffer, isURL, ]; function partiallyCompareMaps(actual, expected, comparedObjects) { @@ -465,7 +466,7 @@ function partiallyCompareArrayBuffersOrViews(actual, expected) { } for (let i = 0; i < expectedViewLength; i++) { - if (actualView[i] !== expectedView[i]) { + if (!ObjectIs(actualView[i], expectedView[i])) { return false; } } @@ -555,6 +556,10 @@ function compareBranch( expected, comparedObjects, ) { + // Checking for the simplest case possible. + if (actual === expected) { + return true; + } // Check for Map object equality if (isMap(actual) && isMap(expected)) { return partiallyCompareMaps(actual, expected, comparedObjects); diff --git a/test/parallel/test-assert-objects.js b/test/parallel/test-assert-objects.js index 3f02ff3c274daa..7cfa8564a91b9a 100644 --- a/test/parallel/test-assert-objects.js +++ b/test/parallel/test-assert-objects.js @@ -271,6 +271,16 @@ describe('Object Comparison Tests', () => { actual: { dataView: new Uint8Array(3) }, expected: { dataView: new DataView(new ArrayBuffer(3)) }, }, + { + description: 'throws when comparing Float32Array([+0.0]) with Float32Array([-0.0])', + actual: new Float32Array([+0.0]), + expected: new Float32Array([-0.0]), + }, + { + description: 'throws when comparing two different urls', + actual: new URL('http://foo'), + expected: new URL('http://bar'), + }, { description: 'throws when comparing SharedArrayBuffers when expected has different elements actual', actual: (() => { @@ -728,6 +738,21 @@ describe('Object Comparison Tests', () => { actual: [1, 2, 3], expected: [2], }, + { + description: 'ensures that File extends Blob', + actual: Object.getPrototypeOf(File.prototype), + expected: Blob.prototype + }, + { + description: 'compares NaN with NaN', + actual: NaN, + expected: NaN, + }, + { + description: 'compares two identical urls', + actual: new URL('http://foo'), + expected: new URL('http://foo'), + }, ].forEach(({ description, actual, expected }) => { it(description, () => { assert.partialDeepStrictEqual(actual, expected);