@@ -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