@@ -6,6 +6,7 @@ require('../common');
66
77const assert = require ( 'assert' ) ;
88const util = require ( 'util' ) ;
9+ const { test } = require ( 'node:test' ) ;
910
1011function 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