@@ -290,6 +290,68 @@ assert.strictEqual(util.format('%s', -Infinity), '-Infinity');
290290 assert . strictEqual ( util . format ( '%s' , objectWithToPrimitive + '' ) , 'default context' ) ;
291291}
292292
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+
293355// JSON format specifier
294356assert . strictEqual ( util . format ( '%j' ) , '%j' ) ;
295357assert . strictEqual ( util . format ( '%j' , 42 ) , '42' ) ;
0 commit comments