Black Lives Matter. Support the Equal Justice Initiative.

Source file src/fmt/fmt_test.go

Documentation: fmt

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

View as plain text