Skip to content

Commit e8ca02a

Browse files
test: add skipPrototypeComparison tests for util.isDeepStrictEqual
1 parent 540097a commit e8ca02a

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed

test/parallel/test-util-isDeepStrictEqual.js

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ require('../common');
66

77
const assert = require('assert');
88
const util = require('util');
9+
const { test } = require('node:test');
910

1011
function utilIsDeepStrict(a, b) {
1112
assert.strictEqual(util.isDeepStrictEqual(a, b), true);
@@ -92,3 +93,66 @@ function notUtilIsDeepStrict(a, b) {
9293
boxedStringA[symbol1] = true;
9394
utilIsDeepStrict(a, b);
9495
}
96+
97+
// Handle `skipPrototypeComparison` option for isDeepStrictEqual
98+
{
99+
test('util.isDeepStrictEqual with skipPrototypeComparison option', () => {
100+
function ClassA(value) { this.value = value; }
101+
102+
function ClassB(value) { this.value = value; }
103+
104+
const objA = new ClassA(42);
105+
const objB = new ClassB(42);
106+
107+
assert.strictEqual(util.isDeepStrictEqual(objA, objB), false);
108+
assert.strictEqual(util.isDeepStrictEqual(objA, objB, { skipPrototypeComparison: true }), true);
109+
110+
const objC = new ClassB(99);
111+
assert.strictEqual(util.isDeepStrictEqual(objA, objC, { skipPrototypeComparison: true }), false);
112+
113+
const nestedA = { obj: new ClassA('test'), num: 123 };
114+
const nestedB = { obj: new ClassB('test'), num: 123 };
115+
116+
assert.strictEqual(util.isDeepStrictEqual(nestedA, nestedB), false);
117+
assert.strictEqual(util.isDeepStrictEqual(nestedA, nestedB, { skipPrototypeComparison: true }), true);
118+
119+
const uint8Array = new Uint8Array([1, 2, 3]);
120+
const buffer = Buffer.from([1, 2, 3]);
121+
122+
assert.strictEqual(util.isDeepStrictEqual(uint8Array, buffer), false);
123+
assert.strictEqual(util.isDeepStrictEqual(uint8Array, buffer, { skipPrototypeComparison: true }), true);
124+
});
125+
126+
test('util.isDeepStrictEqual skipPrototypeComparison with complex scenarios', () => {
127+
class Parent { constructor(x) { this.x = x; } }
128+
class Child extends Parent { constructor(x, y) { super(x); this.y = y; } }
129+
130+
function LegacyParent(x) { this.x = x; }
131+
132+
function LegacyChild(x, y) { this.x = x; this.y = y; }
133+
134+
const modernParent = new Parent(1);
135+
const legacyParent = new LegacyParent(1);
136+
137+
assert.strictEqual(util.isDeepStrictEqual(modernParent, legacyParent), false);
138+
assert.strictEqual(util.isDeepStrictEqual(modernParent, legacyParent, { skipPrototypeComparison: true }), true);
139+
140+
const modern = new Child(1, 2);
141+
const legacy = new LegacyChild(1, 2);
142+
143+
assert.strictEqual(util.isDeepStrictEqual(modern, legacy), false);
144+
assert.strictEqual(util.isDeepStrictEqual(modern, legacy, { skipPrototypeComparison: true }), true);
145+
146+
const literal = { name: 'test', values: [1, 2, 3] };
147+
function Constructor(name, values) { this.name = name; this.values = values; }
148+
const constructed = new Constructor('test', [1, 2, 3]);
149+
150+
assert.strictEqual(util.isDeepStrictEqual(literal, constructed), false);
151+
assert.strictEqual(util.isDeepStrictEqual(literal, constructed, { skipPrototypeComparison: true }), true);
152+
153+
assert.strictEqual(util.isDeepStrictEqual(literal, constructed, {}), false);
154+
assert.strictEqual(util.isDeepStrictEqual(literal, constructed, { skipPrototypeComparison: false }), false);
155+
assert.strictEqual(util.isDeepStrictEqual(literal, constructed, { skipPrototypeComparison: null }), false);
156+
assert.strictEqual(util.isDeepStrictEqual(literal, constructed, { skipPrototypeComparison: undefined }), false);
157+
});
158+
}

0 commit comments

Comments
 (0)