1 2 3 4 5 package fmt_test 6 7 import ( 8 "bytes" 9 . "fmt" 10 "internal/race" 11 "io" 12 "math" 13 "reflect" 14 "strings" 15 "testing" 16 "time" 17 "unicode" 18 ) 19 20 type ( 21 renamedBool bool 22 renamedInt int 23 renamedInt8 int8 24 renamedInt16 int16 25 renamedInt32 int32 26 renamedInt64 int64 27 renamedUint uint 28 renamedUint8 uint8 29 renamedUint16 uint16 30 renamedUint32 uint32 31 renamedUint64 uint64 32 renamedUintptr uintptr 33 renamedString string 34 renamedBytes []byte 35 renamedFloat32 float32 36 renamedFloat64 float64 37 renamedComplex64 complex64 38 renamedComplex128 complex128 39 ) 40 41 func TestFmtInterface(t *testing.T) { 42 var i1 any 43 i1 = "abc" 44 s := Sprintf("%s", i1) 45 if s != "abc" { 46 t.Errorf(`Sprintf("%%s", empty("abc")) = %q want %q`, s, "abc") 47 } 48 } 49 50 var ( 51 NaN = math.NaN() 52 posInf = math.Inf(1) 53 negInf = math.Inf(-1) 54 55 intVar = 0 56 57 array = [5]int{1, 2, 3, 4, 5} 58 iarray = [4]any{1, "hello", 2.5, nil} 59 slice = array[:] 60 islice = iarray[:] 61 ) 62 63 type A struct { 64 i int 65 j uint 66 s string 67 x []int 68 } 69 70 type I int 71 72 func (i I) String() string { return Sprintf("<%d>", int(i)) } 73 74 type B struct { 75 I I 76 j int 77 } 78 79 type C struct { 80 i int 81 B 82 } 83 84 type F int 85 86 func (f F) Format(s State, c rune) { 87 Fprintf(s, "<%c=F(%d)>", c, int(f)) 88 } 89 90 type G int 91 92 func (g G) GoString() string { 93 return Sprintf("GoString(%d)", int(g)) 94 } 95 96 type S struct { 97 F F 98 G G 99 } 100 101 type SI struct { 102 I any 103 } 104 105 106 type P int 107 108 var pValue P 109 110 func (p *P) String() string { 111 return "String(p)" 112 } 113 114 115 type Fn func() int 116 117 func (fn Fn) String() string { return "String(fn)" } 118 119 var fnValue Fn 120 121 122 type U struct { 123 u func() string 124 fn Fn 125 } 126 127 var barray = [5]renamedUint8{1, 2, 3, 4, 5} 128 var bslice = barray[:] 129 130 type byteStringer byte 131 132 func (byteStringer) String() string { 133 return "X" 134 } 135 136 var byteStringerSlice = []byteStringer{'h', 'e', 'l', 'l', 'o'} 137 138 type byteFormatter byte 139 140 func (byteFormatter) Format(f State, _ rune) { 141 Fprint(f, "X") 142 } 143 144 var byteFormatterSlice = []byteFormatter{'h', 'e', 'l', 'l', 'o'} 145 146 type writeStringFormatter string 147 148 func (sf writeStringFormatter) Format(f State, c rune) { 149 if sw, ok := f.(io.StringWriter); ok { 150 sw.WriteString("***" + string(sf) + "***") 151 } 152 } 153 154 var fmtTests = []struct { 155 fmt string 156 val any 157 out string 158 }{ 159 {"%d", 12345, "12345"}, 160 {"%v", 12345, "12345"}, 161 {"%t", true, "true"}, 162 163 164 {"%s", "abc", "abc"}, 165 {"%q", "abc", `"abc"`}, 166 {"%x", "abc", "616263"}, 167 {"%x", "\xff\xf0\x0f\xff", "fff00fff"}, 168 {"%X", "\xff\xf0\x0f\xff", "FFF00FFF"}, 169 {"%x", "", ""}, 170 {"% x", "", ""}, 171 {"%#x", "", ""}, 172 {"%# x", "", ""}, 173 {"%x", "xyz", "78797a"}, 174 {"%X", "xyz", "78797A"}, 175 {"% x", "xyz", "78 79 7a"}, 176 {"% X", "xyz", "78 79 7A"}, 177 {"%#x", "xyz", "0x78797a"}, 178 {"%#X", "xyz", "0X78797A"}, 179 {"%# x", "xyz", "0x78 0x79 0x7a"}, 180 {"%# X", "xyz", "0X78 0X79 0X7A"}, 181 182 183 {"%s", []byte("abc"), "abc"}, 184 {"%s", [3]byte{'a', 'b', 'c'}, "abc"}, 185 {"%s", &[3]byte{'a', 'b', 'c'}, "&abc"}, 186 {"%q", []byte("abc"), `"abc"`}, 187 {"%x", []byte("abc"), "616263"}, 188 {"%x", []byte("\xff\xf0\x0f\xff"), "fff00fff"}, 189 {"%X", []byte("\xff\xf0\x0f\xff"), "FFF00FFF"}, 190 {"%x", []byte(""), ""}, 191 {"% x", []byte(""), ""}, 192 {"%#x", []byte(""), ""}, 193 {"%# x", []byte(""), ""}, 194 {"%x", []byte("xyz"), "78797a"}, 195 {"%X", []byte("xyz"), "78797A"}, 196 {"% x", []byte("xyz"), "78 79 7a"}, 197 {"% X", []byte("xyz"), "78 79 7A"}, 198 {"%#x", []byte("xyz"), "0x78797a"}, 199 {"%#X", []byte("xyz"), "0X78797A"}, 200 {"%# x", []byte("xyz"), "0x78 0x79 0x7a"}, 201 {"%# X", []byte("xyz"), "0X78 0X79 0X7A"}, 202 203 204 {"%q", "", `""`}, 205 {"%#q", "", "``"}, 206 {"%q", "\"", `"\""`}, 207 {"%#q", "\"", "`\"`"}, 208 {"%q", "`", `"` + "`" + `"`}, 209 {"%#q", "`", `"` + "`" + `"`}, 210 {"%q", "\n", `"\n"`}, 211 {"%#q", "\n", `"\n"`}, 212 {"%q", `\n`, `"\\n"`}, 213 {"%#q", `\n`, "`\\n`"}, 214 {"%q", "abc", `"abc"`}, 215 {"%#q", "abc", "`abc`"}, 216 {"%q", "日本語", `"日本語"`}, 217 {"%+q", "日本語", `"\u65e5\u672c\u8a9e"`}, 218 {"%#q", "日本語", "`日本語`"}, 219 {"%#+q", "日本語", "`日本語`"}, 220 {"%q", "\a\b\f\n\r\t\v\"\\", `"\a\b\f\n\r\t\v\"\\"`}, 221 {"%+q", "\a\b\f\n\r\t\v\"\\", `"\a\b\f\n\r\t\v\"\\"`}, 222 {"%#q", "\a\b\f\n\r\t\v\"\\", `"\a\b\f\n\r\t\v\"\\"`}, 223 {"%#+q", "\a\b\f\n\r\t\v\"\\", `"\a\b\f\n\r\t\v\"\\"`}, 224 {"%q", "☺", `"☺"`}, 225 {"% q", "☺", `"☺"`}, 226 {"%+q", "☺", `"\u263a"`}, 227 {"%#q", "☺", "`☺`"}, 228 {"%#+q", "☺", "`☺`"}, 229 {"%10q", "⌘", ` "⌘"`}, 230 {"%+10q", "⌘", ` "\u2318"`}, 231 {"%-10q", "⌘", `"⌘" `}, 232 {"%+-10q", "⌘", `"\u2318" `}, 233 {"%010q", "⌘", `0000000"⌘"`}, 234 {"%+010q", "⌘", `00"\u2318"`}, 235 {"%-010q", "⌘", `"⌘" `}, 236 {"%+-010q", "⌘", `"\u2318" `}, 237 {"%#8q", "\n", ` "\n"`}, 238 {"%#+8q", "\r", ` "\r"`}, 239 {"%#-8q", "\t", "` ` "}, 240 {"%#+-8q", "\b", `"\b" `}, 241 {"%q", "abc\xffdef", `"abc\xffdef"`}, 242 {"%+q", "abc\xffdef", `"abc\xffdef"`}, 243 {"%#q", "abc\xffdef", `"abc\xffdef"`}, 244 {"%#+q", "abc\xffdef", `"abc\xffdef"`}, 245 246 {"%q", "\U0010ffff", `"\U0010ffff"`}, 247 {"%+q", "\U0010ffff", `"\U0010ffff"`}, 248 {"%#q", "\U0010ffff", "``"}, 249 {"%#+q", "\U0010ffff", "``"}, 250 251 {"%q", string(rune(0x110000)), `"�"`}, 252 {"%+q", string(rune(0x110000)), `"\ufffd"`}, 253 {"%#q", string(rune(0x110000)), "`�`"}, 254 {"%#+q", string(rune(0x110000)), "`�`"}, 255 256 257 {"%c", uint('x'), "x"}, 258 {"%c", 0xe4, "ä"}, 259 {"%c", 0x672c, "本"}, 260 {"%c", '日', "日"}, 261 {"%.0c", '⌘', "⌘"}, 262 {"%3c", '⌘', " ⌘"}, 263 {"%-3c", '⌘', "⌘ "}, 264 {"%c", uint64(0x100000000), "\ufffd"}, 265 266 {"%c", '\U00000e00', "\u0e00"}, 267 {"%c", '\U0010ffff', "\U0010ffff"}, 268 269 {"%c", -1, "�"}, 270 {"%c", 0xDC80, "�"}, 271 {"%c", rune(0x110000), "�"}, 272 {"%c", int64(0xFFFFFFFFF), "�"}, 273 {"%c", uint64(0xFFFFFFFFF), "�"}, 274 275 276 {"%q", uint(0), `'\x00'`}, 277 {"%+q", uint(0), `'\x00'`}, 278 {"%q", '"', `'"'`}, 279 {"%+q", '"', `'"'`}, 280 {"%q", '\'', `'\''`}, 281 {"%+q", '\'', `'\''`}, 282 {"%q", '`', "'`'"}, 283 {"%+q", '`', "'`'"}, 284 {"%q", 'x', `'x'`}, 285 {"%+q", 'x', `'x'`}, 286 {"%q", 'ÿ', `'ÿ'`}, 287 {"%+q", 'ÿ', `'\u00ff'`}, 288 {"%q", '\n', `'\n'`}, 289 {"%+q", '\n', `'\n'`}, 290 {"%q", '☺', `'☺'`}, 291 {"%+q", '☺', `'\u263a'`}, 292 {"% q", '☺', `'☺'`}, 293 {"%.0q", '☺', `'☺'`}, 294 {"%10q", '⌘', ` '⌘'`}, 295 {"%+10q", '⌘', ` '\u2318'`}, 296 {"%-10q", '⌘', `'⌘' `}, 297 {"%+-10q", '⌘', `'\u2318' `}, 298 {"%010q", '⌘', `0000000'⌘'`}, 299 {"%+010q", '⌘', `00'\u2318'`}, 300 {"%-010q", '⌘', `'⌘' `}, 301 {"%+-010q", '⌘', `'\u2318' `}, 302 303 {"%q", '\U00000e00', `'\u0e00'`}, 304 {"%q", '\U0010ffff', `'\U0010ffff'`}, 305 306 {"%q", int32(-1), `'�'`}, 307 {"%q", 0xDC80, `'�'`}, 308 {"%q", rune(0x110000), `'�'`}, 309 {"%q", int64(0xFFFFFFFFF), `'�'`}, 310 {"%q", uint64(0xFFFFFFFFF), `'�'`}, 311 312 313 {"%5s", "abc", " abc"}, 314 {"%5s", []byte("abc"), " abc"}, 315 {"%2s", "\u263a", " ☺"}, 316 {"%2s", []byte("\u263a"), " ☺"}, 317 {"%-5s", "abc", "abc "}, 318 {"%-5s", []byte("abc"), "abc "}, 319 {"%05s", "abc", "00abc"}, 320 {"%05s", []byte("abc"), "00abc"}, 321 {"%5s", "abcdefghijklmnopqrstuvwxyz", "abcdefghijklmnopqrstuvwxyz"}, 322 {"%5s", []byte("abcdefghijklmnopqrstuvwxyz"), "abcdefghijklmnopqrstuvwxyz"}, 323 {"%.5s", "abcdefghijklmnopqrstuvwxyz", "abcde"}, 324 {"%.5s", []byte("abcdefghijklmnopqrstuvwxyz"), "abcde"}, 325 {"%.0s", "日本語日本語", ""}, 326 {"%.0s", []byte("日本語日本語"), ""}, 327 {"%.5s", "日本語日本語", "日本語日本"}, 328 {"%.5s", []byte("日本語日本語"), "日本語日本"}, 329 {"%.10s", "日本語日本語", "日本語日本語"}, 330 {"%.10s", []byte("日本語日本語"), "日本語日本語"}, 331 {"%08q", "abc", `000"abc"`}, 332 {"%08q", []byte("abc"), `000"abc"`}, 333 {"%-8q", "abc", `"abc" `}, 334 {"%-8q", []byte("abc"), `"abc" `}, 335 {"%.5q", "abcdefghijklmnopqrstuvwxyz", `"abcde"`}, 336 {"%.5q", []byte("abcdefghijklmnopqrstuvwxyz"), `"abcde"`}, 337 {"%.5x", "abcdefghijklmnopqrstuvwxyz", "6162636465"}, 338 {"%.5x", []byte("abcdefghijklmnopqrstuvwxyz"), "6162636465"}, 339 {"%.3q", "日本語日本語", `"日本語"`}, 340 {"%.3q", []byte("日本語日本語"), `"日本語"`}, 341 {"%.1q", "日本語", `"日"`}, 342 {"%.1q", []byte("日本語"), `"日"`}, 343 {"%.1x", "日本語", "e6"}, 344 {"%.1X", []byte("日本語"), "E6"}, 345 {"%10.1q", "日本語日本語", ` "日"`}, 346 {"%10.1q", []byte("日本語日本語"), ` "日"`}, 347 {"%10v", nil, " <nil>"}, 348 {"%-10v", nil, "<nil> "}, 349 350 351 {"%d", uint(12345), "12345"}, 352 {"%d", int(-12345), "-12345"}, 353 {"%d", ^uint8(0), "255"}, 354 {"%d", ^uint16(0), "65535"}, 355 {"%d", ^uint32(0), "4294967295"}, 356 {"%d", ^uint64(0), "18446744073709551615"}, 357 {"%d", int8(-1 << 7), "-128"}, 358 {"%d", int16(-1 << 15), "-32768"}, 359 {"%d", int32(-1 << 31), "-2147483648"}, 360 {"%d", int64(-1 << 63), "-9223372036854775808"}, 361 {"%.d", 0, ""}, 362 {"%.0d", 0, ""}, 363 {"%6.0d", 0, " "}, 364 {"%06.0d", 0, " "}, 365 {"% d", 12345, " 12345"}, 366 {"%+d", 12345, "+12345"}, 367 {"%+d", -12345, "-12345"}, 368 {"%b", 7, "111"}, 369 {"%b", -6, "-110"}, 370 {"%#b", 7, "0b111"}, 371 {"%#b", -6, "-0b110"}, 372 {"%b", ^uint32(0), "11111111111111111111111111111111"}, 373 {"%b", ^uint64(0), "1111111111111111111111111111111111111111111111111111111111111111"}, 374 {"%b", int64(-1 << 63), zeroFill("-1", 63, "")}, 375 {"%o", 01234, "1234"}, 376 {"%o", -01234, "-1234"}, 377 {"%#o", 01234, "01234"}, 378 {"%#o", -01234, "-01234"}, 379 {"%O", 01234, "0o1234"}, 380 {"%O", -01234, "-0o1234"}, 381 {"%o", ^uint32(0), "37777777777"}, 382 {"%o", ^uint64(0), "1777777777777777777777"}, 383 {"%#X", 0, "0X0"}, 384 {"%x", 0x12abcdef, "12abcdef"}, 385 {"%X", 0x12abcdef, "12ABCDEF"}, 386 {"%x", ^uint32(0), "ffffffff"}, 387 {"%X", ^uint64(0), "FFFFFFFFFFFFFFFF"}, 388 {"%.20b", 7, "00000000000000000111"}, 389 {"%10d", 12345, " 12345"}, 390 {"%10d", -12345, " -12345"}, 391 {"%+10d", 12345, " +12345"}, 392 {"%010d", 12345, "0000012345"}, 393 {"%010d", -12345, "-000012345"}, 394 {"%20.8d", 1234, " 00001234"}, 395 {"%20.8d", -1234, " -00001234"}, 396 {"%020.8d", 1234, " 00001234"}, 397 {"%020.8d", -1234, " -00001234"}, 398 {"%-20.8d", 1234, "00001234 "}, 399 {"%-20.8d", -1234, "-00001234 "}, 400 {"%-#20.8x", 0x1234abc, "0x01234abc "}, 401 {"%-#20.8X", 0x1234abc, "0X01234ABC "}, 402 {"%-#20.8o", 01234, "00001234 "}, 403 404 405 {"%068d", 1, zeroFill("", 68, "1")}, 406 {"%068d", -1, zeroFill("-", 67, "1")}, 407 {"%#.68x", 42, zeroFill("0x", 68, "2a")}, 408 {"%.68d", -42, zeroFill("-", 68, "42")}, 409 {"%+.68d", 42, zeroFill("+", 68, "42")}, 410 {"% .68d", 42, zeroFill(" ", 68, "42")}, 411 {"% +.68d", 42, zeroFill("+", 68, "42")}, 412 413 414 {"%U", 0, "U+0000"}, 415 {"%U", -1, "U+FFFFFFFFFFFFFFFF"}, 416 {"%U", '\n', `U+000A`}, 417 {"%#U", '\n', `U+000A`}, 418 {"%+U", 'x', `U+0078`}, 419 {"%# U", 'x', `U+0078 'x'`}, 420 {"%#.2U", 'x', `U+0078 'x'`}, 421 {"%U", '\u263a', `U+263A`}, 422 {"%#U", '\u263a', `U+263A '☺'`}, 423 {"%U", '\U0001D6C2', `U+1D6C2`}, 424 {"%#U", '\U0001D6C2', `U+1D6C2 '𝛂'`}, 425 {"%#14.6U", '⌘', " U+002318 '⌘'"}, 426 {"%#-14.6U", '⌘', "U+002318 '⌘' "}, 427 {"%#014.6U", '⌘', " U+002318 '⌘'"}, 428 {"%#-014.6U", '⌘', "U+002318 '⌘' "}, 429 {"%.68U", uint(42), zeroFill("U+", 68, "2A")}, 430 {"%#.68U", '日', zeroFill("U+", 68, "65E5") + " '日'"}, 431 432 433 {"%+.3e", 0.0, "+0.000e+00"}, 434 {"%+.3e", 1.0, "+1.000e+00"}, 435 {"%+.3x", 0.0, "+0x0.000p+00"}, 436 {"%+.3x", 1.0, "+0x1.000p+00"}, 437 {"%+.3f", -1.0, "-1.000"}, 438 {"%+.3F", -1.0, "-1.000"}, 439 {"%+.3F", float32(-1.0), "-1.000"}, 440 {"%+07.2f", 1.0, "+001.00"}, 441 {"%+07.2f", -1.0, "-001.00"}, 442 {"%-07.2f", 1.0, "1.00 "}, 443 {"%-07.2f", -1.0, "-1.00 "}, 444 {"%+-07.2f", 1.0, "+1.00 "}, 445 {"%+-07.2f", -1.0, "-1.00 "}, 446 {"%-+07.2f", 1.0, "+1.00 "}, 447 {"%-+07.2f", -1.0, "-1.00 "}, 448 {"%+10.2f", +1.0, " +1.00"}, 449 {"%+10.2f", -1.0, " -1.00"}, 450 {"% .3E", -1.0, "-1.000E+00"}, 451 {"% .3e", 1.0, " 1.000e+00"}, 452 {"% .3X", -1.0, "-0X1.000P+00"}, 453 {"% .3x", 1.0, " 0x1.000p+00"}, 454 {"%+.3g", 0.0, "+0"}, 455 {"%+.3g", 1.0, "+1"}, 456 {"%+.3g", -1.0, "-1"}, 457 {"% .3g", -1.0, "-1"}, 458 {"% .3g", 1.0, " 1"}, 459 {"%b", float32(1.0), "8388608p-23"}, 460 {"%b", 1.0, "4503599627370496p-52"}, 461 462 {"%#g", 1e-323, "1.00000e-323"}, 463 {"%#g", -1.0, "-1.00000"}, 464 {"%#g", 1.1, "1.10000"}, 465 {"%#g", 123456.0, "123456."}, 466 {"%#g", 1234567.0, "1.234567e+06"}, 467 {"%#g", 1230000.0, "1.23000e+06"}, 468 {"%#g", 1000000.0, "1.00000e+06"}, 469 {"%#.0f", 1.0, "1."}, 470 {"%#.0e", 1.0, "1.e+00"}, 471 {"%#.0x", 1.0, "0x1.p+00"}, 472 {"%#.0g", 1.0, "1."}, 473 {"%#.0g", 1100000.0, "1.e+06"}, 474 {"%#.4f", 1.0, "1.0000"}, 475 {"%#.4e", 1.0, "1.0000e+00"}, 476 {"%#.4x", 1.0, "0x1.0000p+00"}, 477 {"%#.4g", 1.0, "1.000"}, 478 {"%#.4g", 100000.0, "1.000e+05"}, 479 {"%#.4g", 1.234, "1.234"}, 480 {"%#.4g", 0.1234, "0.1234"}, 481 {"%#.4g", 1.23, "1.230"}, 482 {"%#.4g", 0.123, "0.1230"}, 483 {"%#.4g", 1.2, "1.200"}, 484 {"%#.4g", 0.12, "0.1200"}, 485 {"%#.4g", 10.2, "10.20"}, 486 {"%#.4g", 0.0, "0.000"}, 487 {"%#.4g", 0.012, "0.01200"}, 488 {"%#.0f", 123.0, "123."}, 489 {"%#.0e", 123.0, "1.e+02"}, 490 {"%#.0x", 123.0, "0x1.p+07"}, 491 {"%#.0g", 123.0, "1.e+02"}, 492 {"%#.4f", 123.0, "123.0000"}, 493 {"%#.4e", 123.0, "1.2300e+02"}, 494 {"%#.4x", 123.0, "0x1.ec00p+06"}, 495 {"%#.4g", 123.0, "123.0"}, 496 {"%#.4g", 123000.0, "1.230e+05"}, 497 {"%#9.4g", 1.0, " 1.000"}, 498 499 {"%#b", 1.0, "4503599627370496p-52"}, 500 501 {"%.4b", float32(1.0), "8388608p-23"}, 502 {"%.4b", -1.0, "-4503599627370496p-52"}, 503 504 {"%.68f", 1.0, zeroFill("1.", 68, "")}, 505 {"%.68f", -1.0, zeroFill("-1.", 68, "")}, 506 507 {"%f", posInf, "+Inf"}, 508 {"%.1f", negInf, "-Inf"}, 509 {"% f", NaN, " NaN"}, 510 {"%20f", posInf, " +Inf"}, 511 {"% 20F", posInf, " Inf"}, 512 {"% 20e", negInf, " -Inf"}, 513 {"% 20x", negInf, " -Inf"}, 514 {"%+20E", negInf, " -Inf"}, 515 {"%+20X", negInf, " -Inf"}, 516 {"% +20g", negInf, " -Inf"}, 517 {"%+-20G", posInf, "+Inf "}, 518 {"%20e", NaN, " NaN"}, 519 {"%20x", NaN, " NaN"}, 520 {"% +20E", NaN, " +NaN"}, 521 {"% +20X", NaN, " +NaN"}, 522 {"% -20g", NaN, " NaN "}, 523 {"%+-20G", NaN, "+NaN "}, 524 525 {"%+020e", posInf, " +Inf"}, 526 {"%+020x", posInf, " +Inf"}, 527 {"%-020f", negInf, "-Inf "}, 528 {"%-020E", NaN, "NaN "}, 529 {"%-020X", NaN, "NaN "}, 530 531 532 {"%.f", 0i, "(0+0i)"}, 533 {"% .f", 0i, "( 0+0i)"}, 534 {"%+.f", 0i, "(+0+0i)"}, 535 {"% +.f", 0i, "(+0+0i)"}, 536 {"%+.3e", 0i, "(+0.000e+00+0.000e+00i)"}, 537 {"%+.3x", 0i, "(+0x0.000p+00+0x0.000p+00i)"}, 538 {"%+.3f", 0i, "(+0.000+0.000i)"}, 539 {"%+.3g", 0i, "(+0+0i)"}, 540 {"%+.3e", 1 + 2i, "(+1.000e+00+2.000e+00i)"}, 541 {"%+.3x", 1 + 2i, "(+0x1.000p+00+0x1.000p+01i)"}, 542 {"%+.3f", 1 + 2i, "(+1.000+2.000i)"}, 543 {"%+.3g", 1 + 2i, "(+1+2i)"}, 544 {"%.3e", 0i, "(0.000e+00+0.000e+00i)"}, 545 {"%.3x", 0i, "(0x0.000p+00+0x0.000p+00i)"}, 546 {"%.3f", 0i, "(0.000+0.000i)"}, 547 {"%.3F", 0i, "(0.000+0.000i)"}, 548 {"%.3F", complex64(0i), "(0.000+0.000i)"}, 549 {"%.3g", 0i, "(0+0i)"}, 550 {"%.3e", 1 + 2i, "(1.000e+00+2.000e+00i)"}, 551 {"%.3x", 1 + 2i, "(0x1.000p+00+0x1.000p+01i)"}, 552 {"%.3f", 1 + 2i, "(1.000+2.000i)"}, 553 {"%.3g", 1 + 2i, "(1+2i)"}, 554 {"%.3e", -1 - 2i, "(-1.000e+00-2.000e+00i)"}, 555 {"%.3x", -1 - 2i, "(-0x1.000p+00-0x1.000p+01i)"}, 556 {"%.3f", -1 - 2i, "(-1.000-2.000i)"}, 557 {"%.3g", -1 - 2i, "(-1-2i)"}, 558 {"% .3E", -1 - 2i, "(-1.000E+00-2.000E+00i)"}, 559 {"% .3X", -1 - 2i, "(-0X1.000P+00-0X1.000P+01i)"}, 560 {"%+.3g", 1 + 2i, "(+1+2i)"}, 561 {"%+.3g", complex64(1 + 2i), "(+1+2i)"}, 562 {"%#g", 1 + 2i, "(1.00000+2.00000i)"}, 563 {"%#g", 123456 + 789012i, "(123456.+789012.i)"}, 564 {"%#g", 1e-10i, "(0.00000+1.00000e-10i)"}, 565 {"%#g", -1e10 - 1.11e100i, "(-1.00000e+10-1.11000e+100i)"}, 566 {"%#.0f", 1.23 + 1.0i, "(1.+1.i)"}, 567 {"%#.0e", 1.23 + 1.0i, "(1.e+00+1.e+00i)"}, 568 {"%#.0x", 1.23 + 1.0i, "(0x1.p+00+0x1.p+00i)"}, 569 {"%#.0g", 1.23 + 1.0i, "(1.+1.i)"}, 570 {"%#.0g", 0 + 100000i, "(0.+1.e+05i)"}, 571 {"%#.0g", 1230000 + 0i, "(1.e+06+0.i)"}, 572 {"%#.4f", 1 + 1.23i, "(1.0000+1.2300i)"}, 573 {"%#.4e", 123 + 1i, "(1.2300e+02+1.0000e+00i)"}, 574 {"%#.4x", 123 + 1i, "(0x1.ec00p+06+0x1.0000p+00i)"}, 575 {"%#.4g", 123 + 1.23i, "(123.0+1.230i)"}, 576 {"%#12.5g", 0 + 100000i, "( 0.0000 +1.0000e+05i)"}, 577 {"%#12.5g", 1230000 - 0i, "( 1.2300e+06 +0.0000i)"}, 578 {"%b", 1 + 2i, "(4503599627370496p-52+4503599627370496p-51i)"}, 579 {"%b", complex64(1 + 2i), "(8388608p-23+8388608p-22i)"}, 580 581 {"%#b", 1 + 2i, "(4503599627370496p-52+4503599627370496p-51i)"}, 582 583 {"%.4b", 1 + 2i, "(4503599627370496p-52+4503599627370496p-51i)"}, 584 {"%.4b", complex64(1 + 2i), "(8388608p-23+8388608p-22i)"}, 585 586 {"%f", complex(posInf, posInf), "(+Inf+Infi)"}, 587 {"%f", complex(negInf, negInf), "(-Inf-Infi)"}, 588 {"%f", complex(NaN, NaN), "(NaN+NaNi)"}, 589 {"%.1f", complex(posInf, posInf), "(+Inf+Infi)"}, 590 {"% f", complex(posInf, posInf), "( Inf+Infi)"}, 591 {"% f", complex(negInf, negInf), "(-Inf-Infi)"}, 592 {"% f", complex(NaN, NaN), "( NaN+NaNi)"}, 593 {"%8e", complex(posInf, posInf), "( +Inf +Infi)"}, 594 {"%8x", complex(posInf, posInf), "( +Inf +Infi)"}, 595 {"% 8E", complex(posInf, posInf), "( Inf +Infi)"}, 596 {"% 8X", complex(posInf, posInf), "( Inf +Infi)"}, 597 {"%+8f", complex(negInf, negInf), "( -Inf -Infi)"}, 598 {"% +8g", complex(negInf, negInf), "( -Inf -Infi)"}, 599 {"% -8G", complex(NaN, NaN), "( NaN +NaN i)"}, 600 {"%+-8b", complex(NaN, NaN), "(+NaN +NaN i)"}, 601 602 {"%08f", complex(posInf, posInf), "( +Inf +Infi)"}, 603 {"%-08g", complex(negInf, negInf), "(-Inf -Inf i)"}, 604 {"%-08G", complex(NaN, NaN), "(NaN +NaN i)"}, 605 606 607 {"%e", 1.0, "1.000000e+00"}, 608 {"%e", 1234.5678e3, "1.234568e+06"}, 609 {"%e", 1234.5678e-8, "1.234568e-05"}, 610 {"%e", -7.0, "-7.000000e+00"}, 611 {"%e", -1e-9, "-1.000000e-09"}, 612 {"%f", 1234.5678e3, "1234567.800000"}, 613 {"%f", 1234.5678e-8, "0.000012"}, 614 {"%f", -7.0, "-7.000000"}, 615 {"%f", -1e-9, "-0.000000"}, 616 {"%g", 1234.5678e3, "1.2345678e+06"}, 617 {"%g", float32(1234.5678e3), "1.2345678e+06"}, 618 {"%g", 1234.5678e-8, "1.2345678e-05"}, 619 {"%g", -7.0, "-7"}, 620 {"%g", -1e-9, "-1e-09"}, 621 {"%g", float32(-1e-9), "-1e-09"}, 622 {"%E", 1.0, "1.000000E+00"}, 623 {"%E", 1234.5678e3, "1.234568E+06"}, 624 {"%E", 1234.5678e-8, "1.234568E-05"}, 625 {"%E", -7.0, "-7.000000E+00"}, 626 {"%E", -1e-9, "-1.000000E-09"}, 627 {"%G", 1234.5678e3, "1.2345678E+06"}, 628 {"%G", float32(1234.5678e3), "1.2345678E+06"}, 629 {"%G", 1234.5678e-8, "1.2345678E-05"}, 630 {"%G", -7.0, "-7"}, 631 {"%G", -1e-9, "-1E-09"}, 632 {"%G", float32(-1e-9), "-1E-09"}, 633 {"%20.5s", "qwertyuiop", " qwert"}, 634 {"%.5s", "qwertyuiop", "qwert"}, 635 {"%-20.5s", "qwertyuiop", "qwert "}, 636 {"%20c", 'x', " x"}, 637 {"%-20c", 'x', "x "}, 638 {"%20.6e", 1.2345e3, " 1.234500e+03"}, 639 {"%20.6e", 1.2345e-3, " 1.234500e-03"}, 640 {"%20e", 1.2345e3, " 1.234500e+03"}, 641 {"%20e", 1.2345e-3, " 1.234500e-03"}, 642 {"%20.8e", 1.2345e3, " 1.23450000e+03"}, 643 {"%20f", 1.23456789e3, " 1234.567890"}, 644 {"%20f", 1.23456789e-3, " 0.001235"}, 645 {"%20f", 12345678901.23456789, " 12345678901.234568"}, 646 {"%-20f", 1.23456789e3, "1234.567890 "}, 647 {"%20.8f", 1.23456789e3, " 1234.56789000"}, 648 {"%20.8f", 1.23456789e-3, " 0.00123457"}, 649 {"%g", 1.23456789e3, "1234.56789"}, 650 {"%g", 1.23456789e-3, "0.00123456789"}, 651 {"%g", 1.23456789e20, "1.23456789e+20"}, 652 653 654 {"%v", array, "[1 2 3 4 5]"}, 655 {"%v", iarray, "[1 hello 2.5 <nil>]"}, 656 {"%v", barray, "[1 2 3 4 5]"}, 657 {"%v", &array, "&[1 2 3 4 5]"}, 658 {"%v", &iarray, "&[1 hello 2.5 <nil>]"}, 659 {"%v", &barray, "&[1 2 3 4 5]"}, 660 661 662 {"%v", slice, "[1 2 3 4 5]"}, 663 {"%v", islice, "[1 hello 2.5 <nil>]"}, 664 {"%v", bslice, "[1 2 3 4 5]"}, 665 {"%v", &slice, "&[1 2 3 4 5]"}, 666 {"%v", &islice, "&[1 hello 2.5 <nil>]"}, 667 {"%v", &bslice, "&[1 2 3 4 5]"}, 668 669 670 {"%b", [3]byte{65, 66, 67}, "[1000001 1000010 1000011]"}, 671 {"%c", [3]byte{65, 66, 67}, "[A B C]"}, 672 {"%d", [3]byte{65, 66, 67}, "[65 66 67]"}, 673 {"%o", [3]byte{65, 66, 67}, "[101 102 103]"}, 674 {"%U", [3]byte{65, 66, 67}, "[U+0041 U+0042 U+0043]"}, 675 {"%v", [3]byte{65, 66, 67}, "[65 66 67]"}, 676 {"%v", [1]byte{123}, "[123]"}, 677 {"%012v", []byte{}, "[]"}, 678 {"%#012v", []byte{}, "[]byte{}"}, 679 {"%6v", []byte{1, 11, 111}, "[ 1 11 111]"}, 680 {"%06v", []byte{1, 11, 111}, "[000001 000011 000111]"}, 681 {"%-6v", []byte{1, 11, 111}, "[1 11 111 ]"}, 682 {"%-06v", []byte{1, 11, 111}, "[1 11 111 ]"}, 683 {"%#v", []byte{1, 11, 111}, "[]byte{0x1, 0xb, 0x6f}"}, 684 {"%#6v", []byte{1, 11, 111}, "[]byte{ 0x1, 0xb, 0x6f}"}, 685 {"%#06v", []byte{1, 11, 111}, "[]byte{0x000001, 0x00000b, 0x00006f}"}, 686 {"%#-6v", []byte{1, 11, 111}, "[]byte{0x1 , 0xb , 0x6f }"}, 687 {"%#-06v", []byte{1, 11, 111}, "[]byte{0x1 , 0xb , 0x6f }"}, 688 689 {"% v", []byte{1, 11, 111}, "[ 1 11 111]"}, 690 {"%+v", [3]byte{1, 11, 111}, "[1 11 111]"}, 691 {"%# -6v", []byte{1, 11, 111}, "[]byte{ 0x1 , 0xb , 0x6f }"}, 692 {"%#+-6v", [3]byte{1, 11, 111}, "[3]uint8{0x1 , 0xb , 0x6f }"}, 693 694 {"% d", []byte{1, 11, 111}, "[ 1 11 111]"}, 695 {"%+d", [3]byte{1, 11, 111}, "[+1 +11 +111]"}, 696 {"%# -6d", []byte{1, 11, 111}, "[ 1 11 111 ]"}, 697 {"%#+-6d", [3]byte{1, 11, 111}, "[+1 +11 +111 ]"}, 698 699 700 {"%v", 1.2345678, "1.2345678"}, 701 {"%v", float32(1.2345678), "1.2345678"}, 702 703 704 {"%v", 1 + 2i, "(1+2i)"}, 705 {"%v", complex64(1 + 2i), "(1+2i)"}, 706 707 708 {"%v", A{1, 2, "a", []int{1, 2}}, `{1 2 a [1 2]}`}, 709 {"%+v", A{1, 2, "a", []int{1, 2}}, `{i:1 j:2 s:a x:[1 2]}`}, 710 711 712 {"%+v", B{1, 2}, `{I:<1> j:2}`}, 713 {"%+v", C{1, B{2, 3}}, `{i:1 B:{I:<2> j:3}}`}, 714 715 716 {"%s", I(23), `<23>`}, 717 {"%q", I(23), `"<23>"`}, 718 {"%x", I(23), `3c32333e`}, 719 {"%#x", I(23), `0x3c32333e`}, 720 {"%# x", I(23), `0x3c 0x32 0x33 0x3e`}, 721 722 {"%d", I(23), `23`}, 723 724 {"%s", reflect.ValueOf(I(23)), `<23>`}, 725 726 727 {"%#v", A{1, 2, "a", []int{1, 2}}, `fmt_test.A{i:1, j:0x2, s:"a", x:[]int{1, 2}}`}, 728 {"%#v", new(byte), "(*uint8)(0xPTR)"}, 729 {"%#v", make(chan int), "(chan int)(0xPTR)"}, 730 {"%#v", uint64(1<<64 - 1), "0xffffffffffffffff"}, 731 {"%#v", 1000000000, "1000000000"}, 732 {"%#v", map[string]int{"a": 1}, `map[string]int{"a":1}`}, 733 {"%#v", map[string]B{"a": {1, 2}}, `map[string]fmt_test.B{"a":fmt_test.B{I:1, j:2}}`}, 734 {"%#v", []string{"a", "b"}, `[]string{"a", "b"}`}, 735 {"%#v", SI{}, `fmt_test.SI{I:interface {}(nil)}`}, 736 {"%#v", []int(nil), `[]int(nil)`}, 737 {"%#v", []int{}, `[]int{}`}, 738 {"%#v", array, `[5]int{1, 2, 3, 4, 5}`}, 739 {"%#v", &array, `&[5]int{1, 2, 3, 4, 5}`}, 740 {"%#v", iarray, `[4]interface {}{1, "hello", 2.5, interface {}(nil)}`}, 741 {"%#v", &iarray, `&[4]interface {}{1, "hello", 2.5, interface {}(nil)}`}, 742 {"%#v", map[int]byte(nil), `map[int]uint8(nil)`}, 743 {"%#v", map[int]byte{}, `map[int]uint8{}`}, 744 {"%#v", "foo", `"foo"`}, 745 {"%#v", barray, `[5]fmt_test.renamedUint8{0x1, 0x2, 0x3, 0x4, 0x5}`}, 746 {"%#v", bslice, `[]fmt_test.renamedUint8{0x1, 0x2, 0x3, 0x4, 0x5}`}, 747 {"%#v", []int32(nil), "[]int32(nil)"}, 748 {"%#v", 1.2345678, "1.2345678"}, 749 {"%#v", float32(1.2345678), "1.2345678"}, 750 751 752 {"%v", TestFmtInterface, "0xPTR"}, 753 {"%v", reflect.ValueOf(TestFmtInterface), "0xPTR"}, 754 {"%v", G.GoString, "0xPTR"}, 755 {"%v", reflect.ValueOf(G.GoString), "0xPTR"}, 756 {"%v", G(23).GoString, "0xPTR"}, 757 {"%v", reflect.ValueOf(G(23).GoString), "0xPTR"}, 758 {"%v", reflect.ValueOf(G(23)).Method(0), "0xPTR"}, 759 {"%v", Fn.String, "0xPTR"}, 760 {"%v", reflect.ValueOf(Fn.String), "0xPTR"}, 761 {"%v", fnValue, "String(fn)"}, 762 {"%v", reflect.ValueOf(fnValue), "String(fn)"}, 763 {"%v", [1]Fn{fnValue}, "[String(fn)]"}, 764 {"%v", reflect.ValueOf([1]Fn{fnValue}), "[String(fn)]"}, 765 {"%v", fnValue.String, "0xPTR"}, 766 {"%v", reflect.ValueOf(fnValue.String), "0xPTR"}, 767 {"%v", reflect.ValueOf(fnValue).Method(0), "0xPTR"}, 768 {"%v", U{}.u, "<nil>"}, 769 {"%v", reflect.ValueOf(U{}.u), "<nil>"}, 770 {"%v", reflect.ValueOf(U{}).Field(0), "<nil>"}, 771 {"%v", U{fn: fnValue}.fn, "String(fn)"}, 772 {"%v", reflect.ValueOf(U{fn: fnValue}.fn), "String(fn)"}, 773 {"%v", reflect.ValueOf(U{fn: fnValue}).Field(1), "<nil>"}, 774 775 776 {"%#v", TestFmtInterface, "(func(*testing.T))(0xPTR)"}, 777 {"%#v", reflect.ValueOf(TestFmtInterface), "(func(*testing.T))(0xPTR)"}, 778 {"%#v", G.GoString, "(func(fmt_test.G) string)(0xPTR)"}, 779 {"%#v", reflect.ValueOf(G.GoString), "(func(fmt_test.G) string)(0xPTR)"}, 780 {"%#v", G(23).GoString, "(func() string)(0xPTR)"}, 781 {"%#v", reflect.ValueOf(G(23).GoString), "(func() string)(0xPTR)"}, 782 {"%#v", reflect.ValueOf(G(23)).Method(0), "(func() string)(0xPTR)"}, 783 {"%#v", Fn.String, "(func(fmt_test.Fn) string)(0xPTR)"}, 784 {"%#v", reflect.ValueOf(Fn.String), "(func(fmt_test.Fn) string)(0xPTR)"}, 785 {"%#v", fnValue, "(fmt_test.Fn)(nil)"}, 786 {"%#v", reflect.ValueOf(fnValue), "(fmt_test.Fn)(nil)"}, 787 {"%#v", [1]Fn{fnValue}, "[1]fmt_test.Fn{(fmt_test.Fn)(nil)}"}, 788 {"%#v", reflect.ValueOf([1]Fn{fnValue}), "[1]fmt_test.Fn{(fmt_test.Fn)(nil)}"}, 789 {"%#v", fnValue.String, "(func() string)(0xPTR)"}, 790 {"%#v", reflect.ValueOf(fnValue.String), "(func() string)(0xPTR)"}, 791 {"%#v", reflect.ValueOf(fnValue).Method(0), "(func() string)(0xPTR)"}, 792 {"%#v", U{}.u, "(func() string)(nil)"}, 793 {"%#v", reflect.ValueOf(U{}.u), "(func() string)(nil)"}, 794 {"%#v", reflect.ValueOf(U{}).Field(0), "(func() string)(nil)"}, 795 {"%#v", U{fn: fnValue}.fn, "(fmt_test.Fn)(nil)"}, 796 {"%#v", reflect.ValueOf(U{fn: fnValue}.fn), "(fmt_test.Fn)(nil)"}, 797 {"%#v", reflect.ValueOf(U{fn: fnValue}).Field(1), "(fmt_test.Fn)(nil)"}, 798 799 800 {"%#v", 1.0, "1"}, 801 {"%#v", 1000000.0, "1e+06"}, 802 {"%#v", float32(1.0), "1"}, 803 {"%#v", float32(1000000.0), "1e+06"}, 804 805 806 {"%#v", []byte(nil), "[]byte(nil)"}, 807 {"%#v", []uint8(nil), "[]byte(nil)"}, 808 {"%#v", []byte{}, "[]byte{}"}, 809 {"%#v", []uint8{}, "[]byte{}"}, 810 {"%#v", reflect.ValueOf([]byte{}), "[]uint8{}"}, 811 {"%#v", reflect.ValueOf([]uint8{}), "[]uint8{}"}, 812 {"%#v", &[]byte{}, "&[]uint8{}"}, 813 {"%#v", &[]byte{}, "&[]uint8{}"}, 814 {"%#v", [3]byte{}, "[3]uint8{0x0, 0x0, 0x0}"}, 815 {"%#v", [3]uint8{}, "[3]uint8{0x0, 0x0, 0x0}"}, 816 817 818 {"%#x", []int{1, 2, 15}, `[0x1 0x2 0xf]`}, 819 {"%x", []int{1, 2, 15}, `[1 2 f]`}, 820 {"%d", []int{1, 2, 15}, `[1 2 15]`}, 821 {"%d", []byte{1, 2, 15}, `[1 2 15]`}, 822 {"%q", []string{"a", "b"}, `["a" "b"]`}, 823 {"% 02x", []byte{1}, "01"}, 824 {"% 02x", []byte{1, 2, 3}, "01 02 03"}, 825 826 827 {"%2x", []byte{}, " "}, 828 {"%#2x", []byte{}, " "}, 829 {"% 02x", []byte{}, "00"}, 830 {"%# 02x", []byte{}, "00"}, 831 {"%-2x", []byte{}, " "}, 832 {"%-02x", []byte{}, " "}, 833 {"%8x", []byte{0xab}, " ab"}, 834 {"% 8x", []byte{0xab}, " ab"}, 835 {"%#8x", []byte{0xab}, " 0xab"}, 836 {"%# 8x", []byte{0xab}, " 0xab"}, 837 {"%08x", []byte{0xab}, "000000ab"}, 838 {"% 08x", []byte{0xab}, "000000ab"}, 839 {"%#08x", []byte{0xab}, "00000xab"}, 840 {"%# 08x", []byte{0xab}, "00000xab"}, 841 {"%10x", []byte{0xab, 0xcd}, " abcd"}, 842 {"% 10x", []byte{0xab, 0xcd}, " ab cd"}, 843 {"%#10x", []byte{0xab, 0xcd}, " 0xabcd"}, 844 {"%# 10x", []byte{0xab, 0xcd}, " 0xab 0xcd"}, 845 {"%010x", []byte{0xab, 0xcd}, "000000abcd"}, 846 {"% 010x", []byte{0xab, 0xcd}, "00000ab cd"}, 847 {"%#010x", []byte{0xab, 0xcd}, "00000xabcd"}, 848 {"%# 010x", []byte{0xab, 0xcd}, "00xab 0xcd"}, 849 {"%-10X", []byte{0xab}, "AB "}, 850 {"% -010X", []byte{0xab}, "AB "}, 851 {"%#-10X", []byte{0xab, 0xcd}, "0XABCD "}, 852 {"%# -010X", []byte{0xab, 0xcd}, "0XAB 0XCD "}, 853 854 {"%2x", "", " "}, 855 {"%#2x", "", " "}, 856 {"% 02x", "", "00"}, 857 {"%# 02x", "", "00"}, 858 {"%-2x", "", " "}, 859 {"%-02x", "", " "}, 860 {"%8x", "\xab", " ab"}, 861 {"% 8x", "\xab", " ab"}, 862 {"%#8x", "\xab", " 0xab"}, 863 {"%# 8x", "\xab", " 0xab"}, 864 {"%08x", "\xab", "000000ab"}, 865 {"% 08x", "\xab", "000000ab"}, 866 {"%#08x", "\xab", "00000xab"}, 867 {"%# 08x", "\xab", "00000xab"}, 868 {"%10x", "\xab\xcd", " abcd"}, 869 {"% 10x", "\xab\xcd", " ab cd"}, 870 {"%#10x", "\xab\xcd", " 0xabcd"}, 871 {"%# 10x", "\xab\xcd", " 0xab 0xcd"}, 872 {"%010x", "\xab\xcd", "000000abcd"}, 873 {"% 010x", "\xab\xcd", "00000ab cd"}, 874 {"%#010x", "\xab\xcd", "00000xabcd"}, 875 {"%# 010x", "\xab\xcd", "00xab 0xcd"}, 876 {"%-10X", "\xab", "AB "}, 877 {"% -010X", "\xab", "AB "}, 878 {"%#-10X", "\xab\xcd", "0XABCD "}, 879 {"%# -010X", "\xab\xcd", "0XAB 0XCD "}, 880 881 882 {"%v", renamedBool(true), "true"}, 883 {"%d", renamedBool(true), "%!d(fmt_test.renamedBool=true)"}, 884 {"%o", renamedInt(8), "10"}, 885 {"%d", renamedInt8(-9), "-9"}, 886 {"%v", renamedInt16(10), "10"}, 887 {"%v", renamedInt32(-11), "-11"}, 888 {"%X", renamedInt64(255), "FF"}, 889 {"%v", renamedUint(13), "13"}, 890 {"%o", renamedUint8(14), "16"}, 891 {"%X", renamedUint16(15), "F"}, 892 {"%d", renamedUint32(16), "16"}, 893 {"%X", renamedUint64(17), "11"}, 894 {"%o", renamedUintptr(18), "22"}, 895 {"%x", renamedString("thing"), "7468696e67"}, 896 {"%d", renamedBytes([]byte{1, 2, 15}), `[1 2 15]`}, 897 {"%q", renamedBytes([]byte("hello")), `"hello"`}, 898 {"%x", []renamedUint8{'h', 'e', 'l', 'l', 'o'}, "68656c6c6f"}, 899 {"%X", []renamedUint8{'h', 'e', 'l', 'l', 'o'}, "68656C6C6F"}, 900 {"%s", []renamedUint8{'h', 'e', 'l', 'l', 'o'}, "hello"}, 901 {"%q", []renamedUint8{'h', 'e', 'l', 'l', 'o'}, `"hello"`}, 902 {"%v", renamedFloat32(22), "22"}, 903 {"%v", renamedFloat64(33), "33"}, 904 {"%v", renamedComplex64(3 + 4i), "(3+4i)"}, 905 {"%v", renamedComplex128(4 - 3i), "(4-3i)"}, 906 907 908 {"%x", F(1), "<x=F(1)>"}, 909 {"%x", G(2), "2"}, 910 {"%+v", S{F(4), G(5)}, "{F:<v=F(4)> G:5}"}, 911 912 913 {"%#v", G(6), "GoString(6)"}, 914 {"%#v", S{F(7), G(8)}, "fmt_test.S{F:<v=F(7)>, G:GoString(8)}"}, 915 916 917 {"%T", byte(0), "uint8"}, 918 {"%T", reflect.ValueOf(nil), "reflect.Value"}, 919 {"%T", (4 - 3i), "complex128"}, 920 {"%T", renamedComplex128(4 - 3i), "fmt_test.renamedComplex128"}, 921 {"%T", intVar, "int"}, 922 {"%6T", &intVar, " *int"}, 923 {"%10T", nil, " <nil>"}, 924 {"%-10T", nil, "<nil> "}, 925 926 927 {"%p", (*int)(nil), "0x0"}, 928 {"%#p", (*int)(nil), "0"}, 929 {"%p", &intVar, "0xPTR"}, 930 {"%#p", &intVar, "PTR"}, 931 {"%p", &array, "0xPTR"}, 932 {"%p", &slice, "0xPTR"}, 933 {"%8.2p", (*int)(nil), " 0x00"}, 934 {"%-20.16p", &intVar, "0xPTR "}, 935 936 {"%p", make(chan int), "0xPTR"}, 937 {"%p", make(map[int]int), "0xPTR"}, 938 {"%p", func() {}, "0xPTR"}, 939 {"%p", 27, "%!p(int=27)"}, 940 {"%p", nil, "%!p(<nil>)"}, 941 {"%#p", nil, "%!p(<nil>)"}, 942 943 {"%b", &intVar, "PTR_b"}, 944 {"%d", &intVar, "PTR_d"}, 945 {"%o", &intVar, "PTR_o"}, 946 {"%x", &intVar, "PTR_x"}, 947 {"%X", &intVar, "PTR_X"}, 948 949 {"%v", nil, "<nil>"}, 950 {"%#v", nil, "<nil>"}, 951 {"%v", (*int)(nil), "<nil>"}, 952 {"%#v", (*int)(nil), "(*int)(nil)"}, 953 {"%v", &intVar, "0xPTR"}, 954 {"%#v", &intVar, "(*int)(0xPTR)"}, 955 {"%8.2v", (*int)(nil), " <nil>"}, 956 {"%-20.16v", &intVar, "0xPTR "}, 957 958 {"%s", &pValue, "String(p)"}, 959 {"%p", &pValue, "0xPTR"}, 960 961 962 {"%s", time.Time{}.Month(), "January"}, 963 {"%d", time.Time{}.Month(), "1"}, 964 965 966 {"", nil, "%!(EXTRA <nil>)"}, 967 {"", 2, "%!(EXTRA int=2)"}, 968 {"no args", "hello", "no args%!(EXTRA string=hello)"}, 969 {"%s %", "hello", "hello %!(NOVERB)"}, 970 {"%s %.2", "hello", "hello %!(NOVERB)"}, 971 {"%017091901790959340919092959340919017929593813360", 0, "%!(NOVERB)%!(EXTRA int=0)"}, 972 {"%184467440737095516170v", 0, "%!(NOVERB)%!(EXTRA int=0)"}, 973 974 {"%010.2", "12345", "%!(NOVERB)%!(EXTRA string=12345)"}, 975 976 977 {"%v", map[float64]int{NaN: 1, NaN: 1}, "map[NaN:1 NaN:1]"}, 978 979 980 1023 {"%.2f", 1.0, "1.00"}, 1024 {"%.2f", -1.0, "-1.00"}, 1025 {"% .2f", 1.0, " 1.00"}, 1026 {"% .2f", -1.0, "-1.00"}, 1027 {"%+.2f", 1.0, "+1.00"}, 1028 {"%+.2f", -1.0, "-1.00"}, 1029 {"%7.2f", 1.0, " 1.00"}, 1030 {"%7.2f", -1.0, " -1.00"}, 1031 {"% 7.2f", 1.0, " 1.00"}, 1032 {"% 7.2f", -1.0, " -1.00"}, 1033 {"%+7.2f", 1.0, " +1.00"}, 1034 {"%+7.2f", -1.0, " -1.00"}, 1035 {"% +7.2f", 1.0, " +1.00"}, 1036 {"% +7.2f", -1.0, " -1.00"}, 1037 {"%07.2f", 1.0, "0001.00"}, 1038 {"%07.2f", -1.0, "-001.00"}, 1039 {"% 07.2f", 1.0, " 001.00"}, 1040 {"% 07.2f", -1.0, "-001.00"}, 1041 {"%+07.2f", 1.0, "+001.00"}, 1042 {"%+07.2f", -1.0, "-001.00"}, 1043 {"% +07.2f", 1.0, "+001.00"}, 1044 {"% +07.2f", -1.0, "-001.00"}, 1045 1046 1047 {"%7.2f", 1 + 2i, "( 1.00 +2.00i)"}, 1048 {"%+07.2f", -1 - 2i, "(-001.00-002.00i)"}, 1049 1050 1051 {"%0-5s", "abc", "abc "}, 1052 {"%-05.1f", 1.0, "1.0 "}, 1053 1054 1055 1056 {"%06v", []any{+10.0, 10}, "[000010 000010]"}, 1057 {"%06v", []any{-10.0, 10}, "[-00010 000010]"}, 1058 {"%06v", []any{+10.0 + 10i, 10}, "[(000010+00010i) 000010]"}, 1059 {"%06v", []any{-10.0 + 10i, 10}, "[(-00010+00010i) 000010]"}, 1060 1061 1062 {"%03.6v", []any{1, 2.0, "x"}, "[000001 002 00x]"}, 1063 {"%03.0v", []any{0, 2.0, "x"}, "[ 002 000]"}, 1064 1065 1066 1067 {"%v", []complex64{1, 2, 3}, "[(1+0i) (2+0i) (3+0i)]"}, 1068 {"%v", []complex128{1, 2, 3}, "[(1+0i) (2+0i) (3+0i)]"}, 1069 1070 1071 {"%.", 3, "%!.(int=3)"}, 1072 1073 1074 {"%+10.2f", +104.66 + 440.51i, "( +104.66 +440.51i)"}, 1075 {"%+10.2f", -104.66 + 440.51i, "( -104.66 +440.51i)"}, 1076 {"%+10.2f", +104.66 - 440.51i, "( +104.66 -440.51i)"}, 1077 {"%+10.2f", -104.66 - 440.51i, "( -104.66 -440.51i)"}, 1078 {"%+010.2f", +104.66 + 440.51i, "(+000104.66+000440.51i)"}, 1079 {"%+010.2f", -104.66 + 440.51i, "(-000104.66+000440.51i)"}, 1080 {"%+010.2f", +104.66 - 440.51i, "(+000104.66-000440.51i)"}, 1081 {"%+010.2f", -104.66 - 440.51i, "(-000104.66-000440.51i)"}, 1082 1083 1084 {"%v", byteStringerSlice, "[X X X X X]"}, 1085 {"%s", byteStringerSlice, "hello"}, 1086 {"%q", byteStringerSlice, "\"hello\""}, 1087 {"%x", byteStringerSlice, "68656c6c6f"}, 1088 {"%X", byteStringerSlice, "68656C6C6F"}, 1089 {"%#v", byteStringerSlice, "[]fmt_test.byteStringer{0x68, 0x65, 0x6c, 0x6c, 0x6f}"}, 1090 1091 1092 {"%v", byteFormatterSlice, "[X X X X X]"}, 1093 {"%s", byteFormatterSlice, "hello"}, 1094 {"%q", byteFormatterSlice, "\"hello\""}, 1095 {"%x", byteFormatterSlice, "68656c6c6f"}, 1096 {"%X", byteFormatterSlice, "68656C6C6F"}, 1097 1098 {"%#v", byteFormatterSlice, "[]fmt_test.byteFormatter{X, X, X, X, X}"}, 1099 1100 1101 {"%s", writeStringFormatter(""), "******"}, 1102 {"%s", writeStringFormatter("xyz"), "***xyz***"}, 1103 {"%s", writeStringFormatter("⌘/⌘"), "***⌘/⌘***"}, 1104 1105 1106 1107 1108 {"%v", reflect.ValueOf(A{}).Field(0).String(), "<int Value>"}, 1109 {"%v", reflect.ValueOf(A{}).Field(0), "0"}, 1110 1111 1112 {"%s", reflect.ValueOf("hello"), "hello"}, 1113 {"%q", reflect.ValueOf("hello"), `"hello"`}, 1114 {"%#04x", reflect.ValueOf(256), "0x0100"}, 1115 1116 1117 {"%v", reflect.Value{}, "<invalid reflect.Value>"}, 1118 {"%v", &reflect.Value{}, "<invalid Value>"}, 1119 {"%v", SI{reflect.Value{}}, "{<invalid Value>}"}, 1120 1121 1122 {"%☠", nil, "%!☠(<nil>)"}, 1123 {"%☠", any(nil), "%!☠(<nil>)"}, 1124 {"%☠", int(0), "%!☠(int=0)"}, 1125 {"%☠", uint(0), "%!☠(uint=0)"}, 1126 {"%☠", []byte{0, 1}, "[%!☠(uint8=0) %!☠(uint8=1)]"}, 1127 {"%☠", []uint8{0, 1}, "[%!☠(uint8=0) %!☠(uint8=1)]"}, 1128 {"%☠", [1]byte{0}, "[%!☠(uint8=0)]"}, 1129 {"%☠", [1]uint8{0}, "[%!☠(uint8=0)]"}, 1130 {"%☠", "hello", "%!☠(string=hello)"}, 1131 {"%☠", 1.2345678, "%!☠(float64=1.2345678)"}, 1132 {"%☠", float32(1.2345678), "%!☠(float32=1.2345678)"}, 1133 {"%☠", 1.2345678 + 1.2345678i, "%!☠(complex128=(1.2345678+1.2345678i))"}, 1134 {"%☠", complex64(1.2345678 + 1.2345678i), "%!☠(complex64=(1.2345678+1.2345678i))"}, 1135 {"%☠", &intVar, "%!☠(*int=0xPTR)"}, 1136 {"%☠", make(chan int), "%!☠(chan int=0xPTR)"}, 1137 {"%☠", func() {}, "%!☠(func()=0xPTR)"}, 1138 {"%☠", reflect.ValueOf(renamedInt(0)), "%!☠(fmt_test.renamedInt=0)"}, 1139 {"%☠", SI{renamedInt(0)}, "{%!☠(fmt_test.renamedInt=0)}"}, 1140 {"%☠", &[]any{I(1), G(2)}, "&[%!☠(fmt_test.I=1) %!☠(fmt_test.G=2)]"}, 1141 {"%☠", SI{&[]any{I(1), G(2)}}, "{%!☠(*[]interface {}=&[1 2])}"}, 1142 {"%☠", reflect.Value{}, "<invalid reflect.Value>"}, 1143 {"%☠", map[float64]int{NaN: 1}, "map[%!☠(float64=NaN):%!☠(int=1)]"}, 1144 } 1145 1146 1147 1148 func zeroFill(prefix string, width int, suffix string) string { 1149 return prefix + strings.Repeat("0", width-len(suffix)) + suffix 1150 } 1151 1152 func TestSprintf(t *testing.T) { 1153 for _, tt := range fmtTests { 1154 s := Sprintf(tt.fmt, tt.val) 1155 i := strings.Index(tt.out, "PTR") 1156 if i >= 0 && i < len(s) { 1157 var pattern, chars string 1158 switch { 1159 case strings.HasPrefix(tt.out[i:], "PTR_b"): 1160 pattern = "PTR_b" 1161 chars = "01" 1162 case strings.HasPrefix(tt.out[i:], "PTR_o"): 1163 pattern = "PTR_o" 1164 chars = "01234567" 1165 case strings.HasPrefix(tt.out[i:], "PTR_d"): 1166 pattern = "PTR_d" 1167 chars = "0123456789" 1168 case strings.HasPrefix(tt.out[i:], "PTR_x"): 1169 pattern = "PTR_x" 1170 chars = "0123456789abcdef" 1171 case strings.HasPrefix(tt.out[i:], "PTR_X"): 1172 pattern = "PTR_X" 1173 chars = "0123456789ABCDEF" 1174 default: 1175 pattern = "PTR" 1176 chars = "0123456789abcdefABCDEF" 1177 } 1178 p := s[:i] + pattern 1179 for j := i; j < len(s); j++ { 1180 if !strings.ContainsRune(chars, rune(s[j])) { 1181 p += s[j:] 1182 break 1183 } 1184 } 1185 s = p 1186 } 1187 if s != tt.out { 1188 if _, ok := tt.val.(string); ok { 1189 1190 1191 t.Errorf("Sprintf(%q, %q) = <%s> want <%s>", tt.fmt, tt.val, s, tt.out) 1192 } else { 1193 t.Errorf("Sprintf(%q, %v) = %q want %q", tt.fmt, tt.val, s, tt.out) 1194 } 1195 } 1196 } 1197 } 1198 1199 1200 1201 func TestComplexFormatting(t *testing.T) { 1202 var yesNo = []bool{true, false} 1203 var values = []float64{1, 0, -1, posInf, negInf, NaN} 1204 for _, plus := range yesNo { 1205 for _, zero := range yesNo { 1206 for _, space := range yesNo { 1207 for _, char := range "fFeEgG" { 1208 realFmt := "%" 1209 if zero { 1210 realFmt += "0" 1211 } 1212 if space { 1213 realFmt += " " 1214 } 1215 if plus { 1216 realFmt += "+" 1217 } 1218 realFmt += "10.2" 1219 realFmt += string(char) 1220 1221 imagFmt := "%" 1222 if zero { 1223 imagFmt += "0" 1224 } 1225 imagFmt += "+" 1226 imagFmt += "10.2" 1227 imagFmt += string(char) 1228 for _, realValue := range values { 1229 for _, imagValue := range values { 1230 one := Sprintf(realFmt, complex(realValue, imagValue)) 1231 two := Sprintf("("+realFmt+imagFmt+"i)", realValue, imagValue) 1232 if one != two { 1233 t.Error(f, one, two) 1234 } 1235 } 1236 } 1237 } 1238 } 1239 } 1240 } 1241 } 1242 1243 type SE []any 1244 1245 var reorderTests = []struct { 1246 fmt string 1247 val SE 1248 out string 1249 }{ 1250 {"%[1]d", SE{1}, "1"}, 1251 {"%[2]d", SE{2, 1}, "1"}, 1252 {"%[2]d %[1]d", SE{1, 2}, "2 1"}, 1253 {"%[2]*[1]d", SE{2, 5}, " 2"}, 1254 {"%6.2f", SE{12.0}, " 12.00"}, 1255 {"%[3]*.[2]*[1]f", SE{12.0, 2, 6}, " 12.00"}, 1256 {"%[1]*.[2]*[3]f", SE{6, 2, 12.0}, " 12.00"}, 1257 {"%10f", SE{12.0}, " 12.000000"}, 1258 {"%[1]*[3]f", SE{10, 99, 12.0}, " 12.000000"}, 1259 {"%.6f", SE{12.0}, "12.000000"}, 1260 {"%.[1]*[3]f", SE{6, 99, 12.0}, "12.000000"}, 1261 {"%6.f", SE{12.0}, " 12"}, 1262 {"%[1]*.[3]f", SE{6, 3, 12.0}, " 12"}, 1263 1264 {"%d %d %d %#[1]o %#o %#o", SE{11, 12, 13}, "11 12 13 013 014 015"}, 1265 1266 1267 {"%[d", SE{2, 1}, "%!d(BADINDEX)"}, 1268 {"%]d", SE{2, 1}, "%!](int=2)d%!(EXTRA int=1)"}, 1269 {"%[]d", SE{2, 1}, "%!d(BADINDEX)"}, 1270 {"%[-3]d", SE{2, 1}, "%!d(BADINDEX)"}, 1271 {"%[99]d", SE{2, 1}, "%!d(BADINDEX)"}, 1272 {"%[3]", SE{2, 1}, "%!(NOVERB)"}, 1273 {"%[1].2d", SE{5, 6}, "%!d(BADINDEX)"}, 1274 {"%[1]2d", SE{2, 1}, "%!d(BADINDEX)"}, 1275 {"%3.[2]d", SE{7}, "%!d(BADINDEX)"}, 1276 {"%.[2]d", SE{7}, "%!d(BADINDEX)"}, 1277 {"%d %d %d %#[1]o %#o %#o %#o", SE{11, 12, 13}, "11 12 13 013 014 015 %!o(MISSING)"}, 1278 {"%[5]d %[2]d %d", SE{1, 2, 3}, "%!d(BADINDEX) 2 3"}, 1279 {"%d %[3]d %d", SE{1, 2}, "1 %!d(BADINDEX) 2"}, 1280 {"%.[]", SE{}, "%!](BADINDEX)"}, 1281 {"%.-3d", SE{42}, "%!-(int=42)3d"}, 1282 {"%2147483648d", SE{42}, "%!(NOVERB)%!(EXTRA int=42)"}, 1283 {"%-2147483648d", SE{42}, "%!(NOVERB)%!(EXTRA int=42)"}, 1284 {"%.2147483648d", SE{42}, "%!(NOVERB)%!(EXTRA int=42)"}, 1285 } 1286 1287 func TestReorder(t *testing.T) { 1288 for _, tt := range reorderTests { 1289 s := Sprintf(tt.fmt, tt.val...) 1290 if s != tt.out { 1291 t.Errorf("Sprintf(%q, %v) = <%s> want <%s>", tt.fmt, tt.val, s, tt.out) 1292 } 1293 } 1294 } 1295 1296 func BenchmarkSprintfPadding(b *testing.B) { 1297 b.RunParallel(func(pb *testing.PB) { 1298 for pb.Next() { 1299 _ = Sprintf("%16f", 1.0) 1300 } 1301 }) 1302 } 1303 1304 func BenchmarkSprintfEmpty(b *testing.B) { 1305 b.RunParallel(func(pb *testing.PB) { 1306 for pb.Next() { 1307 _ = Sprintf("") 1308 } 1309 }) 1310 } 1311 1312 func BenchmarkSprintfString(b *testing.B) { 1313 b.RunParallel(func(pb *testing.PB) { 1314 for pb.Next() { 1315 _ = Sprintf("%s", "hello") 1316 } 1317 }) 1318 } 1319 1320 func BenchmarkSprintfTruncateString(b *testing.B) { 1321 b.RunParallel(func(pb *testing.PB) { 1322 for pb.Next() { 1323 _ = Sprintf("%.3s", "日本語日本語日本語日本語") 1324 } 1325 }) 1326 } 1327 1328 func BenchmarkSprintfTruncateBytes(b *testing.B) { 1329 var bytes any = []byte("日本語日本語日本語日本語") 1330 b.RunParallel(func(pb *testing.PB) { 1331 for pb.Next() { 1332 _ = Sprintf("%.3s", bytes) 1333 } 1334 }) 1335 } 1336 1337 func BenchmarkSprintfSlowParsingPath(b *testing.B) { 1338 b.RunParallel(func(pb *testing.PB) { 1339 for pb.Next() { 1340 _ = Sprintf("%.v", nil) 1341 } 1342 }) 1343 } 1344 1345 func BenchmarkSprintfQuoteString(b *testing.B) { 1346 b.RunParallel(func(pb *testing.PB) { 1347 for pb.Next() { 1348 _ = Sprintf("%q", "日本語日本語日本語") 1349 } 1350 }) 1351 } 1352 1353 func BenchmarkSprintfInt(b *testing.B) { 1354 b.RunParallel(func(pb *testing.PB) { 1355 for pb.Next() { 1356 _ = Sprintf("%d", 5) 1357 } 1358 }) 1359 } 1360 1361 func BenchmarkSprintfIntInt(b *testing.B) { 1362 b.RunParallel(func(pb *testing.PB) { 1363 for pb.Next() { 1364 _ = Sprintf("%d %d", 5, 6) 1365 } 1366 }) 1367 } 1368 1369 func BenchmarkSprintfPrefixedInt(b *testing.B) { 1370 b.RunParallel(func(pb *testing.PB) { 1371 for pb.Next() { 1372 _ = Sprintf("This is some meaningless prefix text that needs to be scanned %d", 6) 1373 } 1374 }) 1375 } 1376 1377 func BenchmarkSprintfFloat(b *testing.B) { 1378 b.RunParallel(func(pb *testing.PB) { 1379 for pb.Next() { 1380 _ = Sprintf("%g", 5.23184) 1381 } 1382 }) 1383 } 1384 1385 func BenchmarkSprintfComplex(b *testing.B) { 1386 b.RunParallel(func(pb *testing.PB) { 1387 for pb.Next() { 1388 _ = Sprintf("%f", 5.23184+5.23184i) 1389 } 1390 }) 1391 } 1392 1393 func BenchmarkSprintfBoolean(b *testing.B) { 1394 b.RunParallel(func(pb *testing.PB) { 1395 for pb.Next() { 1396 _ = Sprintf("%t", true) 1397 } 1398 }) 1399 } 1400 1401 func BenchmarkSprintfHexString(b *testing.B) { 1402 b.RunParallel(func(pb *testing.PB) { 1403 for pb.Next() { 1404 _ = Sprintf("% #x", "0123456789abcdef") 1405 } 1406 }) 1407 } 1408 1409 func BenchmarkSprintfHexBytes(b *testing.B) { 1410 data := []byte("0123456789abcdef") 1411 b.RunParallel(func(pb *testing.PB) { 1412 for pb.Next() { 1413 _ = Sprintf("% #x", data) 1414 } 1415 }) 1416 } 1417 1418 func BenchmarkSprintfBytes(b *testing.B) { 1419 data := []byte("0123456789abcdef") 1420 b.RunParallel(func(pb *testing.PB) { 1421 for pb.Next() { 1422 _ = Sprintf("%v", data) 1423 } 1424 }) 1425 } 1426 1427 func BenchmarkSprintfStringer(b *testing.B) { 1428 stringer := I(12345) 1429 b.RunParallel(func(pb *testing.PB) { 1430 for pb.Next() { 1431 _ = Sprintf("%v", stringer) 1432 } 1433 }) 1434 } 1435 1436 func BenchmarkSprintfStructure(b *testing.B) { 1437 s := &[]any{SI{12345}, map[int]string{0: "hello"}} 1438 b.RunParallel(func(pb *testing.PB) { 1439 for pb.Next() { 1440 _ = Sprintf("%#v", s) 1441 } 1442 }) 1443 } 1444 1445 func BenchmarkManyArgs(b *testing.B) { 1446 b.RunParallel(func(pb *testing.PB) { 1447 var buf bytes.Buffer 1448 for pb.Next() { 1449 buf.Reset() 1450 Fprintf(&buf, "%2d/%2d/%2d %d:%d:%d %s %s\n", 3, 4, 5, 11, 12, 13, "hello", "world") 1451 } 1452 }) 1453 } 1454 1455 func BenchmarkFprintInt(b *testing.B) { 1456 var buf bytes.Buffer 1457 for i := 0; i < b.N; i++ { 1458 buf.Reset() 1459 Fprint(&buf, 123456) 1460 } 1461 } 1462 1463 func BenchmarkFprintfBytes(b *testing.B) { 1464 data := []byte(string("0123456789")) 1465 var buf bytes.Buffer 1466 for i := 0; i < b.N; i++ { 1467 buf.Reset() 1468 Fprintf(&buf, "%s", data) 1469 } 1470 } 1471 1472 func BenchmarkFprintIntNoAlloc(b *testing.B) { 1473 var x any = 123456 1474 var buf bytes.Buffer 1475 for i := 0; i < b.N; i++ { 1476 buf.Reset() 1477 Fprint(&buf, x) 1478 } 1479 } 1480 1481 var mallocBuf bytes.Buffer 1482 var mallocPointer *int 1483 1484 var mallocTest = []struct { 1485 count int 1486 desc string 1487 fn func() 1488 }{ 1489 {0, `Sprintf("")`, func() { _ = Sprintf("") }}, 1490 {1, `Sprintf("xxx")`, func() { _ = Sprintf("xxx") }}, 1491 {0, `Sprintf("%x")`, func() { _ = Sprintf("%x", 7) }}, 1492 {1, `Sprintf("%x")`, func() { _ = Sprintf("%x", 1<<16) }}, 1493 {3, `Sprintf("%80000s")`, func() { _ = Sprintf("%80000s", "hello") }}, 1494 {1, `Sprintf("%s")`, func() { _ = Sprintf("%s", "hello") }}, 1495 {1, `Sprintf("%x %x")`, func() { _ = Sprintf("%x %x", 7, 112) }}, 1496 {1, `Sprintf("%g")`, func() { _ = Sprintf("%g", float32(3.14159)) }}, 1497 {0, `Fprintf(buf, "%s")`, func() { mallocBuf.Reset(); Fprintf(&mallocBuf, "%s", "hello") }}, 1498 {0, `Fprintf(buf, "%s")`, func() { mallocBuf.Reset(); s := "hello"; Fprintf(&mallocBuf, "%s", s) }}, 1499 {1, `Fprintf(buf, "%s")`, func() { mallocBuf.Reset(); s := "hello"; Fprintf(&mallocBuf, "%s", noliteral(s)) }}, 1500 {0, `Fprintf(buf, "%x")`, func() { mallocBuf.Reset(); Fprintf(&mallocBuf, "%x", 7) }}, 1501 {0, `Fprintf(buf, "%x")`, func() { mallocBuf.Reset(); Fprintf(&mallocBuf, "%x", 1<<16) }}, 1502 {0, `Fprintf(buf, "%x")`, func() { mallocBuf.Reset(); i := 1 << 16; Fprintf(&mallocBuf, "%x", i) }}, 1503 {1, `Fprintf(buf, "%x")`, func() { mallocBuf.Reset(); i := 1 << 16; Fprintf(&mallocBuf, "%x", noliteral(i)) }}, 1504 {4, `Fprintf(buf, "%v")`, func() { mallocBuf.Reset(); s := []int{1, 2}; Fprintf(&mallocBuf, "%v", s) }}, 1505 {0, `Fprintf(buf, "%v")`, func() { mallocBuf.Reset(); type P struct{ x, y int }; Fprintf(&mallocBuf, "%v", P{1, 2}) }}, 1506 {1, `Fprintf(buf, "%v")`, func() { mallocBuf.Reset(); type P struct{ x, y int }; Fprintf(&mallocBuf, "%v", noliteral(P{1, 2})) }}, 1507 {2, `Fprintf(buf, "%80000s")`, func() { mallocBuf.Reset(); Fprintf(&mallocBuf, "%80000s", "hello") }}, 1508 1509 {0, `Fprintf(buf, "%x %x %x")`, func() { 1510 mallocBuf.Reset() 1511 Fprintf(&mallocBuf, "%x %x %x", mallocPointer, mallocPointer, mallocPointer) 1512 }}, 1513 } 1514 1515 var _ bytes.Buffer 1516 1517 func TestCountMallocs(t *testing.T) { 1518 switch { 1519 case testing.Short(): 1520 t.Skip("skipping malloc count in short mode") 1521 case race.Enabled: 1522 t.Skip("skipping malloc count under race detector") 1523 } 1524 for _, mt := range mallocTest { 1525 mallocs := testing.AllocsPerRun(100, mt.fn) 1526 if got, max := mallocs, float64(mt.count); got != max { 1527 t.Errorf("%s: got %v allocs, want %v", mt.desc, got, max) 1528 } 1529 } 1530 } 1531 1532 type flagPrinter struct{} 1533 1534 func (flagPrinter) Format(f State, c rune) { 1535 s := "%" 1536 for i := 0; i < 128; i++ { 1537 if f.Flag(i) { 1538 s += string(rune(i)) 1539 } 1540 } 1541 if w, ok := f.Width(); ok { 1542 s += Sprintf("%d", w) 1543 } 1544 if p, ok := f.Precision(); ok { 1545 s += Sprintf(".%d", p) 1546 } 1547 s += string(c) 1548 io.WriteString(f, "["+s+"]") 1549 } 1550 1551 var flagtests = []struct { 1552 in string 1553 out string 1554 }{ 1555 {"%a", "[%a]"}, 1556 {"%-a", "[%-a]"}, 1557 {"%+a", "[%+a]"}, 1558 {"%#a", "[%#a]"}, 1559 {"% a", "[% a]"}, 1560 {"%0a", "[%0a]"}, 1561 {"%1.2a", "[%1.2a]"}, 1562 {"%-1.2a", "[%-1.2a]"}, 1563 {"%+1.2a", "[%+1.2a]"}, 1564 {"%-+1.2a", "[%+-1.2a]"}, 1565 {"%-+1.2abc", "[%+-1.2a]bc"}, 1566 {"%-1.2abc", "[%-1.2a]bc"}, 1567 {"%-0abc", "[%-0a]bc"}, 1568 } 1569 1570 func TestFlagParser(t *testing.T) { 1571 var flagprinter flagPrinter 1572 for _, tt := range flagtests { 1573 s := Sprintf(tt.in, &flagprinter) 1574 if s != tt.out { 1575 t.Errorf("Sprintf(%q, &flagprinter) => %q, want %q", tt.in, s, tt.out) 1576 } 1577 } 1578 } 1579 1580 func TestStructPrinter(t *testing.T) { 1581 type T struct { 1582 a string 1583 b string 1584 c int 1585 } 1586 var s T 1587 s.a = "abc" 1588 s.b = "def" 1589 s.c = 123 1590 var tests = []struct { 1591 fmt string 1592 out string 1593 }{ 1594 {"%v", "{abc def 123}"}, 1595 {"%+v", "{a:abc b:def c:123}"}, 1596 {"%#v", `fmt_test.T{a:"abc", b:"def", c:123}`}, 1597 } 1598 for _, tt := range tests { 1599 out := Sprintf(tt.fmt, s) 1600 if out != tt.out { 1601 t.Errorf("Sprintf(%q, s) = %#q, want %#q", tt.fmt, out, tt.out) 1602 } 1603 1604 out = Sprintf(tt.fmt, &s) 1605 if out != "&"+tt.out { 1606 t.Errorf("Sprintf(%q, &s) = %#q, want %#q", tt.fmt, out, "&"+tt.out) 1607 } 1608 } 1609 } 1610 1611 func TestSlicePrinter(t *testing.T) { 1612 slice := []int{} 1613 s := Sprint(slice) 1614 if s != "[]" { 1615 t.Errorf("empty slice printed as %q not %q", s, "[]") 1616 } 1617 slice = []int{1, 2, 3} 1618 s = Sprint(slice) 1619 if s != "[1 2 3]" { 1620 t.Errorf("slice: got %q expected %q", s, "[1 2 3]") 1621 } 1622 s = Sprint(&slice) 1623 if s != "&[1 2 3]" { 1624 t.Errorf("&slice: got %q expected %q", s, "&[1 2 3]") 1625 } 1626 } 1627 1628 1629 1630 func presentInMap(s string, a []string, t *testing.T) { 1631 for i := 0; i < len(a); i++ { 1632 loc := strings.Index(s, a[i]) 1633 if loc < 0 { 1634 t.Errorf("map print: expected to find %q in %q", a[i], s) 1635 } 1636 1637 loc += len(a[i]) 1638 if loc >= len(s) || (s[loc] != ' ' && s[loc] != ']') { 1639 t.Errorf("map print: %q not properly terminated in %q", a[i], s) 1640 } 1641 } 1642 } 1643 1644 func TestMapPrinter(t *testing.T) { 1645 m0 := make(map[int]string) 1646 s := Sprint(m0) 1647 if s != "map[]" { 1648 t.Errorf("empty map printed as %q not %q", s, "map[]") 1649 } 1650 m1 := map[int]string{1: "one", 2: "two", 3: "three"} 1651 a := []string{"1:one", "2:two", "3:three"} 1652 presentInMap(Sprintf("%v", m1), a, t) 1653 presentInMap(Sprint(m1), a, t) 1654 1655 if !strings.HasPrefix(Sprint(&m1), "&") { 1656 t.Errorf("no initial & for address of map") 1657 } 1658 presentInMap(Sprintf("%v", &m1), a, t) 1659 presentInMap(Sprint(&m1), a, t) 1660 } 1661 1662 func TestEmptyMap(t *testing.T) { 1663 const emptyMapStr = "map[]" 1664 var m map[string]int 1665 s := Sprint(m) 1666 if s != emptyMapStr { 1667 t.Errorf("nil map printed as %q not %q", s, emptyMapStr) 1668 } 1669 m = make(map[string]int) 1670 s = Sprint(m) 1671 if s != emptyMapStr { 1672 t.Errorf("empty map printed as %q not %q", s, emptyMapStr) 1673 } 1674 } 1675 1676 1677 1678 func TestBlank(t *testing.T) { 1679 got := Sprint("<", 1, ">:", 1, 2, 3, "!") 1680 expect := "<1>:1 2 3!" 1681 if got != expect { 1682 t.Errorf("got %q expected %q", got, expect) 1683 } 1684 } 1685 1686 1687 1688 func TestBlankln(t *testing.T) { 1689 got := Sprintln("<", 1, ">:", 1, 2, 3, "!") 1690 expect := "< 1 >: 1 2 3 !\n" 1691 if got != expect { 1692 t.Errorf("got %q expected %q", got, expect) 1693 } 1694 } 1695 1696 1697 func TestFormatterPrintln(t *testing.T) { 1698 f := F(1) 1699 expect := "<v=F(1)>\n" 1700 s := Sprint(f, "\n") 1701 if s != expect { 1702 t.Errorf("Sprint wrong with Formatter: expected %q got %q", expect, s) 1703 } 1704 s = Sprintln(f) 1705 if s != expect { 1706 t.Errorf("Sprintln wrong with Formatter: expected %q got %q", expect, s) 1707 } 1708 s = Sprintf("%v\n", f) 1709 if s != expect { 1710 t.Errorf("Sprintf wrong with Formatter: expected %q got %q", expect, s) 1711 } 1712 } 1713 1714 func args(a ...any) []any { return a } 1715 1716 var startests = []struct { 1717 fmt string 1718 in []any 1719 out string 1720 }{ 1721 {"%*d", args(4, 42), " 42"}, 1722 {"%-*d", args(4, 42), "42 "}, 1723 {"%*d", args(-4, 42), "42 "}, 1724 {"%-*d", args(-4, 42), "42 "}, 1725 {"%.*d", args(4, 42), "0042"}, 1726 {"%*.*d", args(8, 4, 42), " 0042"}, 1727 {"%0*d", args(4, 42), "0042"}, 1728 1729 {"%0*d", args(uint(4), 42), "0042"}, 1730 {"%0*d", args(uint64(4), 42), "0042"}, 1731 {"%0*d", args('\x04', 42), "0042"}, 1732 {"%0*d", args(uintptr(4), 42), "0042"}, 1733 1734 1735 {"%*d", args(nil, 42), "%!(BADWIDTH)42"}, 1736 {"%*d", args(int(1e7), 42), "%!(BADWIDTH)42"}, 1737 {"%*d", args(int(-1e7), 42), "%!(BADWIDTH)42"}, 1738 {"%.*d", args(nil, 42), "%!(BADPREC)42"}, 1739 {"%.*d", args(-1, 42), "%!(BADPREC)42"}, 1740 {"%.*d", args(int(1e7), 42), "%!(BADPREC)42"}, 1741 {"%.*d", args(uint(1e7), 42), "%!(BADPREC)42"}, 1742 {"%.*d", args(uint64(1<<63), 42), "%!(BADPREC)42"}, 1743 {"%.*d", args(uint64(1<<64-1), 42), "%!(BADPREC)42"}, 1744 {"%*d", args(5, "foo"), "%!d(string= foo)"}, 1745 {"%*% %d", args(20, 5), "% 5"}, 1746 {"%*", args(4), "%!(NOVERB)"}, 1747 } 1748 1749 func TestWidthAndPrecision(t *testing.T) { 1750 for i, tt := range startests { 1751 s := Sprintf(tt.fmt, tt.in...) 1752 if s != tt.out { 1753 t.Errorf("#%d: %q: got %q expected %q", i, tt.fmt, s, tt.out) 1754 } 1755 } 1756 } 1757 1758 1759 type PanicS struct { 1760 message any 1761 } 1762 1763 1764 func (p PanicS) String() string { 1765 panic(p.message) 1766 } 1767 1768 1769 type PanicGo struct { 1770 message any 1771 } 1772 1773 1774 func (p PanicGo) GoString() string { 1775 panic(p.message) 1776 } 1777 1778 1779 type PanicF struct { 1780 message any 1781 } 1782 1783 1784 func (p PanicF) Format(f State, c rune) { 1785 panic(p.message) 1786 } 1787 1788 var panictests = []struct { 1789 fmt string 1790 in any 1791 out string 1792 }{ 1793 1794 {"%s", (*PanicS)(nil), "<nil>"}, 1795 {"%s", PanicS{io.ErrUnexpectedEOF}, "%!s(PANIC=String method: unexpected EOF)"}, 1796 {"%s", PanicS{3}, "%!s(PANIC=String method: 3)"}, 1797 1798 {"%#v", (*PanicGo)(nil), "<nil>"}, 1799 {"%#v", PanicGo{io.ErrUnexpectedEOF}, "%!v(PANIC=GoString method: unexpected EOF)"}, 1800 {"%#v", PanicGo{3}, "%!v(PANIC=GoString method: 3)"}, 1801 1802 {"%#v", []any{PanicGo{3}, PanicGo{3}}, "[]interface {}{%!v(PANIC=GoString method: 3), %!v(PANIC=GoString method: 3)}"}, 1803 1804 {"%s", (*PanicF)(nil), "<nil>"}, 1805 {"%s", PanicF{io.ErrUnexpectedEOF}, "%!s(PANIC=Format method: unexpected EOF)"}, 1806 {"%s", PanicF{3}, "%!s(PANIC=Format method: 3)"}, 1807 } 1808 1809 func TestPanics(t *testing.T) { 1810 for i, tt := range panictests { 1811 s := Sprintf(tt.fmt, tt.in) 1812 if s != tt.out { 1813 t.Errorf("%d: %q: got %q expected %q", i, tt.fmt, s, tt.out) 1814 } 1815 } 1816 } 1817 1818 1819 var recurCount = 0 1820 1821 type Recur struct { 1822 i int 1823 failed *bool 1824 } 1825 1826 func (r *Recur) String() string { 1827 if recurCount++; recurCount > 10 { 1828 *r.failed = true 1829 return "FAIL" 1830 } 1831 1832 1833 1834 return Sprintf("recur@%p value: %d", r, r.i) 1835 } 1836 1837 func TestBadVerbRecursion(t *testing.T) { 1838 failed := false 1839 r := &Recur{3, &failed} 1840 _ = Sprintf("recur@%p value: %d\n", &r, r.i) 1841 if failed { 1842 t.Error("fail with pointer") 1843 } 1844 failed = false 1845 r = &Recur{4, &failed} 1846 _ = Sprintf("recur@%p, value: %d\n", r, r.i) 1847 if failed { 1848 t.Error("fail with value") 1849 } 1850 } 1851 1852 func TestIsSpace(t *testing.T) { 1853 1854 1855 for i := rune(0); i <= unicode.MaxRune; i++ { 1856 if IsSpace(i) != unicode.IsSpace(i) { 1857 t.Errorf("isSpace(%U) = %v, want %v", i, IsSpace(i), unicode.IsSpace(i)) 1858 } 1859 } 1860 } 1861 1862 func hideFromVet(s string) string { return s } 1863 1864 func TestNilDoesNotBecomeTyped(t *testing.T) { 1865 type A struct{} 1866 type B struct{} 1867 var a *A = nil 1868 var b B = B{} 1869 got := Sprintf(hideFromVet("%s %s %s %s %s"), nil, a, nil, b, nil) 1870 const expect = "%!s(<nil>) %!s(*fmt_test.A=<nil>) %!s(<nil>) {} %!s(<nil>)" 1871 if got != expect { 1872 t.Errorf("expected:\n\t%q\ngot:\n\t%q", expect, got) 1873 } 1874 } 1875 1876 var formatterFlagTests = []struct { 1877 in string 1878 val any 1879 out string 1880 }{ 1881 1882 {"%a", flagPrinter{}, "[%a]"}, 1883 {"%-a", flagPrinter{}, "[%-a]"}, 1884 {"%+a", flagPrinter{}, "[%+a]"}, 1885 {"%#a", flagPrinter{}, "[%#a]"}, 1886 {"% a", flagPrinter{}, "[% a]"}, 1887 {"%0a", flagPrinter{}, "[%0a]"}, 1888 {"%1.2a", flagPrinter{}, "[%1.2a]"}, 1889 {"%-1.2a", flagPrinter{}, "[%-1.2a]"}, 1890 {"%+1.2a", flagPrinter{}, "[%+1.2a]"}, 1891 {"%-+1.2a", flagPrinter{}, "[%+-1.2a]"}, 1892 {"%-+1.2abc", flagPrinter{}, "[%+-1.2a]bc"}, 1893 {"%-1.2abc", flagPrinter{}, "[%-1.2a]bc"}, 1894 {"%-0abc", flagPrinter{}, "[%-0a]bc"}, 1895 1896 1897 {"%a", [1]flagPrinter{}, "[[%a]]"}, 1898 {"%-a", [1]flagPrinter{}, "[[%-a]]"}, 1899 {"%+a", [1]flagPrinter{}, "[[%+a]]"}, 1900 {"%#a", [1]flagPrinter{}, "[[%#a]]"}, 1901 {"% a", [1]flagPrinter{}, "[[% a]]"}, 1902 {"%0a", [1]flagPrinter{}, "[[%0a]]"}, 1903 {"%1.2a", [1]flagPrinter{}, "[[%1.2a]]"}, 1904 {"%-1.2a", [1]flagPrinter{}, "[[%-1.2a]]"}, 1905 {"%+1.2a", [1]flagPrinter{}, "[[%+1.2a]]"}, 1906 {"%-+1.2a", [1]flagPrinter{}, "[[%+-1.2a]]"}, 1907 {"%-+1.2abc", [1]flagPrinter{}, "[[%+-1.2a]]bc"}, 1908 {"%-1.2abc", [1]flagPrinter{}, "[[%-1.2a]]bc"}, 1909 {"%-0abc", [1]flagPrinter{}, "[[%-0a]]bc"}, 1910 1911 1912 {"%v", flagPrinter{}, "[%v]"}, 1913 {"%-v", flagPrinter{}, "[%-v]"}, 1914 {"%+v", flagPrinter{}, "[%+v]"}, 1915 {"%#v", flagPrinter{}, "[%#v]"}, 1916 {"% v", flagPrinter{}, "[% v]"}, 1917 {"%0v", flagPrinter{}, "[%0v]"}, 1918 {"%1.2v", flagPrinter{}, "[%1.2v]"}, 1919 {"%-1.2v", flagPrinter{}, "[%-1.2v]"}, 1920 {"%+1.2v", flagPrinter{}, "[%+1.2v]"}, 1921 {"%-+1.2v", flagPrinter{}, "[%+-1.2v]"}, 1922 {"%-+1.2vbc", flagPrinter{}, "[%+-1.2v]bc"}, 1923 {"%-1.2vbc", flagPrinter{}, "[%-1.2v]bc"}, 1924 {"%-0vbc", flagPrinter{}, "[%-0v]bc"}, 1925 1926 1927 {"%v", [1]flagPrinter{}, "[[%v]]"}, 1928 {"%-v", [1]flagPrinter{}, "[[%-v]]"}, 1929 {"%+v", [1]flagPrinter{}, "[[%+v]]"}, 1930 {"%#v", [1]flagPrinter{}, "[1]fmt_test.flagPrinter{[%#v]}"}, 1931 {"% v", [1]flagPrinter{}, "[[% v]]"}, 1932 {"%0v", [1]flagPrinter{}, "[[%0v]]"}, 1933 {"%1.2v", [1]flagPrinter{}, "[[%1.2v]]"}, 1934 {"%-1.2v", [1]flagPrinter{}, "[[%-1.2v]]"}, 1935 {"%+1.2v", [1]flagPrinter{}, "[[%+1.2v]]"}, 1936 {"%-+1.2v", [1]flagPrinter{}, "[[%+-1.2v]]"}, 1937 {"%-+1.2vbc", [1]flagPrinter{}, "[[%+-1.2v]]bc"}, 1938 {"%-1.2vbc", [1]flagPrinter{}, "[[%-1.2v]]bc"}, 1939 {"%-0vbc", [1]flagPrinter{}, "[[%-0v]]bc"}, 1940 } 1941 1942 func TestFormatterFlags(t *testing.T) { 1943 for _, tt := range formatterFlagTests { 1944 s := Sprintf(tt.in, tt.val) 1945 if s != tt.out { 1946 t.Errorf("Sprintf(%q, %T) = %q, want %q", tt.in, tt.val, s, tt.out) 1947 } 1948 } 1949 } 1950 1951 func TestParsenum(t *testing.T) { 1952 testCases := []struct { 1953 s string 1954 start, end int 1955 num int 1956 isnum bool 1957 newi int 1958 }{ 1959 {"a123", 0, 4, 0, false, 0}, 1960 {"1234", 1, 1, 0, false, 1}, 1961 {"123a", 0, 4, 123, true, 3}, 1962 {"12a3", 0, 4, 12, true, 2}, 1963 {"1234", 0, 4, 1234, true, 4}, 1964 {"1a234", 1, 3, 0, false, 1}, 1965 } 1966 for _, tt := range testCases { 1967 num, isnum, newi := Parsenum(tt.s, tt.start, tt.end) 1968 if num != tt.num || isnum != tt.isnum || newi != tt.newi { 1969 t.Errorf("parsenum(%q, %d, %d) = %d, %v, %d, want %d, %v, %d", tt.s, tt.start, tt.end, num, isnum, newi, tt.num, tt.isnum, tt.newi) 1970 } 1971 } 1972 } 1973 1974 1975 1976 1977 const ( 1978 appendResult = "hello world, 23" 1979 hello = "hello " 1980 ) 1981 1982 func TestAppendf(t *testing.T) { 1983 b := make([]byte, 100) 1984 b = b[:copy(b, hello)] 1985 got := Appendf(b, "world, %d", 23) 1986 if string(got) != appendResult { 1987 t.Fatalf("Appendf returns %q not %q", got, appendResult) 1988 } 1989 if &b[0] != &got[0] { 1990 t.Fatalf("Appendf allocated a new slice") 1991 } 1992 } 1993 1994 func TestAppend(t *testing.T) { 1995 b := make([]byte, 100) 1996 b = b[:copy(b, hello)] 1997 got := Append(b, "world", ", ", 23) 1998 if string(got) != appendResult { 1999 t.Fatalf("Append returns %q not %q", got, appendResult) 2000 } 2001 if &b[0] != &got[0] { 2002 t.Fatalf("Append allocated a new slice") 2003 } 2004 } 2005 2006 func TestAppendln(t *testing.T) { 2007 b := make([]byte, 100) 2008 b = b[:copy(b, hello)] 2009 got := Appendln(b, "world,", 23) 2010 if string(got) != appendResult+"\n" { 2011 t.Fatalf("Appendln returns %q not %q", got, appendResult+"\n") 2012 } 2013 if &b[0] != &got[0] { 2014 t.Fatalf("Appendln allocated a new slice") 2015 } 2016 } 2017 2018 2019 2020 2021 func noliteral[T any](t T) T { 2022 return t 2023 } 2024
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4