@@ -290,6 +290,68 @@ assert.strictEqual(util.format('%s', -Infinity), '-Infinity');
290
290
assert . strictEqual ( util . format ( '%s' , objectWithToPrimitive + '' ) , 'default context' ) ;
291
291
}
292
292
293
+ // built-in toPrimitive is the same behavior as inspect
294
+ {
295
+ const date = new Date ( '2023-10-01T00:00:00Z' ) ;
296
+ assert . strictEqual ( util . format ( '%s' , date ) , util . inspect ( date ) ) ;
297
+
298
+ const symbol = Symbol ( 'foo' ) ;
299
+ assert . strictEqual ( util . format ( '%s' , symbol ) , util . inspect ( symbol ) ) ;
300
+ }
301
+
302
+ // Prototype chain handling for toString
303
+ {
304
+ function hasToStringButNoToPrimitive ( ) { }
305
+
306
+ hasToStringButNoToPrimitive . prototype . toString = function ( ) {
307
+ return 'hasToStringButNoToPrimitive' ;
308
+ } ;
309
+
310
+ let obj = new hasToStringButNoToPrimitive ( ) ;
311
+ assert . strictEqual ( util . format ( '%s' , obj . toString ( ) ) , 'hasToStringButNoToPrimitive' ) ;
312
+
313
+ function inheritsFromHasToStringButNoToPrimitive ( ) { }
314
+ Object . setPrototypeOf ( inheritsFromHasToStringButNoToPrimitive . prototype ,
315
+ hasToStringButNoToPrimitive . prototype ) ;
316
+ obj = new inheritsFromHasToStringButNoToPrimitive ( ) ;
317
+ assert . strictEqual ( util . format ( '%s' , obj . toString ( ) ) , 'hasToStringButNoToPrimitive' ) ;
318
+ }
319
+
320
+ // Prototype chain handling for Symbol.toPrimitive
321
+ {
322
+ function hasToPrimitiveButNoToString ( ) { }
323
+
324
+ hasToPrimitiveButNoToString . prototype [ Symbol . toPrimitive ] = function ( ) {
325
+ return 'hasToPrimitiveButNoToString' ;
326
+ } ;
327
+
328
+ let obj = new hasToPrimitiveButNoToString ( ) ;
329
+ assert . strictEqual ( util . format ( '%s' , obj [ Symbol . toPrimitive ] ( ) ) , 'hasToPrimitiveButNoToString' ) ;
330
+ function inheritsFromHasToPrimitiveButNoToString ( ) { }
331
+ Object . setPrototypeOf ( inheritsFromHasToPrimitiveButNoToString . prototype ,
332
+ hasToPrimitiveButNoToString . prototype ) ;
333
+ obj = new inheritsFromHasToPrimitiveButNoToString ( ) ;
334
+ assert . strictEqual ( util . format ( '%s' , obj [ Symbol . toPrimitive ] ( ) ) , 'hasToPrimitiveButNoToString' ) ;
335
+ }
336
+
337
+ // Prototype chain handling for both toString and Symbol.toPrimitive
338
+ {
339
+ function hasBothToStringAndToPrimitive ( ) { }
340
+ hasBothToStringAndToPrimitive . prototype . toString = function ( ) {
341
+ return 'toString' ;
342
+ } ;
343
+ hasBothToStringAndToPrimitive . prototype [ Symbol . toPrimitive ] = function ( ) {
344
+ return 'toPrimitive' ;
345
+ } ;
346
+ let obj = new hasBothToStringAndToPrimitive ( ) ;
347
+ assert . strictEqual ( util . format ( '%s' , obj . toString ( ) ) , 'toString' ) ;
348
+ function inheritsFromHasBothToStringAndToPrimitive ( ) { }
349
+ Object . setPrototypeOf ( inheritsFromHasBothToStringAndToPrimitive . prototype ,
350
+ hasBothToStringAndToPrimitive . prototype ) ;
351
+ obj = new inheritsFromHasBothToStringAndToPrimitive ( ) ;
352
+ assert . strictEqual ( util . format ( '%s' , obj . toString ( ) ) , 'toString' ) ;
353
+ }
354
+
293
355
// JSON format specifier
294
356
assert . strictEqual ( util . format ( '%j' ) , '%j' ) ;
295
357
assert . strictEqual ( util . format ( '%j' , 42 ) , '42' ) ;
0 commit comments