Skip to content

Commit

Permalink
assert: make partialDeepStrictEqual work with urls and File prototypes
Browse files Browse the repository at this point in the history
PR-URL: #56231
Reviewed-By: Ruben Bridgewater <[email protected]>
Reviewed-By: James M Snell <[email protected]>
Reviewed-By: Xuguang Mei <[email protected]>
Reviewed-By: Pietro Marchini <[email protected]>
  • Loading branch information
puskin94 authored Jan 9, 2025
1 parent b8f6d84 commit 24ed8da
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 2 deletions.
9 changes: 7 additions & 2 deletions lib/assert.js
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ const CallTracker = require('internal/assert/calltracker');
const {
validateFunction,
} = require('internal/validators');
const { isURL } = require('internal/url');

let isDeepEqual;
let isDeepStrictEqual;
Expand Down Expand Up @@ -383,7 +384,7 @@ function isSpecial(obj) {
}

const typesToCallDeepStrictEqualWith = [
isKeyObject, isWeakSet, isWeakMap, Buffer.isBuffer, isSharedArrayBuffer,
isKeyObject, isWeakSet, isWeakMap, Buffer.isBuffer, isSharedArrayBuffer, isURL,
];

function partiallyCompareMaps(actual, expected, comparedObjects) {
Expand Down Expand Up @@ -466,7 +467,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;
}
}
Expand Down Expand Up @@ -586,6 +587,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);
Expand Down
25 changes: 25 additions & 0 deletions test/parallel/test-assert-objects.js
Original file line number Diff line number Diff line change
Expand Up @@ -306,6 +306,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: (() => {
Expand Down Expand Up @@ -778,6 +788,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);
Expand Down
5 changes: 5 additions & 0 deletions test/parallel/test-assert-typedarray-deepequal.js
Original file line number Diff line number Diff line change
Expand Up @@ -101,10 +101,15 @@ suite('notEqualArrayPairs', () => {
makeBlock(assert.deepStrictEqual, arrayPair[0], arrayPair[1]),
assert.AssertionError
);
// TODO(puskin94): remove emitWarning override once the partialDeepStrictEqual method is not experimental anymore
// Suppress warnings, necessary otherwise the tools/pseudo-tty.py runner will fail
const originalEmitWarning = process.emitWarning;
process.emitWarning = () => {};
assert.throws(
makeBlock(assert.partialDeepStrictEqual, arrayPair[0], arrayPair[1]),
assert.AssertionError
);
process.emitWarning = originalEmitWarning; // Restore original process.emitWarning
});
}
});

0 comments on commit 24ed8da

Please sign in to comment.