package ufmt import ( "math" "testing" ) // goCases were generated by running each row through Go's fmt.Sprintf // (go1.27.1), so a row that fails here is a place v2 differs from Go. var goCases = []struct { format string args []any want string }{ {"%d", []any{7}, "7"}, {"%03d", []any{7}, "007"}, {"%08X", []any{uint32(0xdead)}, "0000DEAD"}, {"0x%08X", []any{uint32(0x10074)}, "0x00010074"}, {"%08x", []any{uint32(0x00a00513)}, "00a00513"}, {"%x", []any{uint32(255)}, "ff"}, {"%X", []any{-255}, "-FF"}, {"%#x", []any{255}, "0xff"}, {"%#X", []any{255}, "0XFF"}, {"%#08x", []any{255}, "0x000000ff"}, {"%#o", []any{8}, "010"}, {"%O", []any{8}, "0o10"}, {"%b", []any{5}, "101"}, {"%#b", []any{5}, "0b101"}, {"%o", []any{-8}, "-10"}, {"%5d", []any{42}, " 42"}, {"%-5d|", []any{42}, "42 |"}, {"%+d", []any{42}, "+42"}, {"% d", []any{42}, " 42"}, {"%+05d", []any{42}, "+0042"}, {"%-05d|", []any{42}, "42 |"}, {"%.3d", []any{7}, "007"}, {"%8.3d", []any{-7}, " -007"}, {"%.0d", []any{0}, ""}, {"%5.0d|", []any{0}, " |"}, {"%d", []any{int64(-9223372036854775808)}, "-9223372036854775808"}, {"%x", []any{int64(-9223372036854775808)}, "-8000000000000000"}, {"%d", []any{uint64(18446744073709551615)}, "18446744073709551615"}, {"%x", []any{uint64(18446744073709551615)}, "ffffffffffffffff"}, {"%d", []any{int8(-128)}, "-128"}, {"%d", []any{uint8(200)}, "200"}, {"%x", []any{int16(-1)}, "-1"}, {"%d", []any{"hi"}, "%!d(string=hi)"}, {"%s", []any{42}, "%!s(int=42)"}, {"%c", []any{'x'}, "x"}, {"%c", []any{0x1F600}, "😀"}, {"%q", []any{'x'}, "'x'"}, {"%+q", []any{'é'}, "'\\u00e9'"}, {"%U", []any{0x1F600}, "U+1F600"}, {"%#U", []any{'x'}, "U+0078 'x'"}, {"%U", []any{1}, "U+0001"}, {"%.6U", []any{1}, "U+000001"}, {"%c", []any{-1}, "�"}, {"%s", []any{"hello"}, "hello"}, {"%10s|", []any{"hello"}, " hello|"}, {"%-10s|", []any{"hello"}, "hello |"}, {"%.2s", []any{"hello"}, "he"}, {"%.2s", []any{"héllo"}, "hé"}, {"%5.1s|", []any{"héllo"}, " h|"}, {"%05s", []any{"ab"}, "000ab"}, {"%q", []any{"hi\n"}, "\"hi\\n\""}, {"%+q", []any{"héllo"}, "\"h\\u00e9llo\""}, {"%#q", []any{"back`tick"}, "\"back`tick\""}, {"%#q", []any{"plain"}, "`plain`"}, {"%x", []any{"hello"}, "68656c6c6f"}, {"%X", []any{"hello"}, "68656C6C6F"}, {"% x", []any{"hello"}, "68 65 6c 6c 6f"}, {"%# x", []any{"hi"}, "0x68 0x69"}, {"%#x", []any{"hi"}, "0x6869"}, {"%10x|", []any{"hi"}, " 6869|"}, {"%-10x|", []any{"hi"}, "6869 |"}, {"%x", []any{""}, ""}, {"%5x|", []any{""}, " |"}, {"%.1x", []any{"hi"}, "68"}, {"%s", []any{[]byte("bytes")}, "bytes"}, {"%x", []any{[]byte{1, 171}}, "01ab"}, {"%X", []any{[]byte{1, 171}}, "01AB"}, {"%v", []any{[]byte{1, 2}}, "[1 2]"}, {"%d", []any{[]byte{1, 2}}, "[1 2]"}, {"%#v", []any{[]byte{1, 2}}, "[]byte{0x1, 0x2}"}, {"%q", []any{[]byte("q")}, "\"q\""}, {"%b", []any{[]byte{3}}, "[11]"}, {"%t", []any{true}, "true"}, {"%v", []any{false}, "false"}, {"%5t|", []any{true}, " true|"}, {"%d", []any{true}, "%!d(bool=true)"}, {"%f", []any{3.14159}, "3.141590"}, {"%.2f", []any{3.14159}, "3.14"}, {"%8.3f|", []any{3.14159}, " 3.142|"}, {"%-8.3f|", []any{3.14159}, "3.142 |"}, {"%08.3f", []any{-3.14159}, "-003.142"}, {"%+.1f", []any{2.0}, "+2.0"}, {"% .1f", []any{2.0}, " 2.0"}, {"%e", []any{1234.5678}, "1.234568e+03"}, {"%E", []any{1234.5678}, "1.234568E+03"}, {"%.2e", []any{1234.5678}, "1.23e+03"}, {"%g", []any{1234.5678}, "1234.5678"}, {"%g", []any{1e21}, "1e+21"}, {"%g", []any{0.00001}, "1e-05"}, {"%G", []any{1e-10}, "1E-10"}, {"%v", []any{3.14}, "3.14"}, {"%v", []any{1e6}, "1e+06"}, {"%v", []any{100000.0}, "100000"}, {"%v", []any{float32(0.1)}, "0.1"}, {"%F", []any{1.5}, "1.500000"}, {"%#g", []any{1.0}, "1.00000"}, {"%#.3g", []any{1.0}, "1.00"}, {"%#f", []any{1.0}, "1.000000"}, {"%#.0f", []any{1.0}, "1."}, {"%#.0e", []any{1.0}, "1.e+00"}, {"%x", []any{1.0}, "0x1p+00"}, {"%X", []any{1.0}, "0X1P+00"}, {"%b", []any{1.0}, "4503599627370496p-52"}, {"%.3x", []any{3.14159}, "0x1.922p+01"}, {"%f", []any{math.Inf(1)}, "+Inf"}, {"%+f", []any{math.Inf(1)}, "+Inf"}, {"%08f", []any{math.Inf(-1)}, " -Inf"}, {"%f", []any{math.NaN()}, "NaN"}, {"%+f", []any{math.NaN()}, "+NaN"}, {"%010.2f", []any{12.5}, "0000012.50"}, {"%s", []any{1.5}, "%!s(float64=1.5)"}, {"%v", []any{nil}, ""}, {"%d", []any{nil}, "%!d()"}, {"%s", []any{nil}, "%!s()"}, {"%T", []any{nil}, ""}, {"%T", []any{42}, "int"}, {"%T", []any{"s"}, "string"}, {"%T", []any{[]byte("x")}, "[]uint8"}, {"%T", []any{3.0}, "float64"}, {"%T", []any{int8(1)}, "int8"}, {"%T", []any{[]string{"a"}}, "[]string"}, {"%T", []any{map[string]int{}}, "map[string]int"}, {"%5T|", []any{1}, " int|"}, {"%v", []any{[]string{"a", "b"}}, "[a b]"}, {"%q", []any{[]string{"a", "b"}}, "[\"a\" \"b\"]"}, {"%#v", []any{[]string{"a", "b"}}, "[]string{\"a\", \"b\"}"}, {"%#v", []any{[]string(nil)}, "[]string(nil)"}, {"%v", []any{[]int{1, 2, 3}}, "[1 2 3]"}, {"%3d", []any{[]int{1, 2}}, "[ 1 2]"}, {"%x", []any{[]int{10, 255}}, "[a ff]"}, {"%d", []any{[]string{"a"}}, "[%!d(string=a)]"}, {"%v", []any{[]any{1, "a", nil, true}}, "[1 a true]"}, {"%#v", []any{[]any{1, "a", nil}}, "[]interface {}{1, \"a\", interface {}(nil)}"}, {"%v", []any{[]float64{1.5, 2}}, "[1.5 2]"}, {"%v", []any{map[string]int{"b": 2, "a": 1, "c": 3}}, "map[a:1 b:2 c:3]"}, {"%#v", []any{map[string]int{"b": 2, "a": 1}}, "map[string]int{\"a\":1, \"b\":2}"}, {"%v", []any{map[string]string{"k": "v"}}, "map[k:v]"}, {"%v", []any{map[string]any{"x": nil, "y": 1}}, "map[x: y:1]"}, {"%v", []any{map[string]bool{}}, "map[]"}, {"%#v", []any{"str"}, "\"str\""}, {"%#v", []any{42}, "42"}, {"%#v", []any{uint(42)}, "0x2a"}, {"%#v", []any{3.0}, "3"}, {"%#v", []any{true}, "true"}, {"%#v", []any{nil}, ""}, {"%+v", []any{42}, "42"}, {"%+v", []any{"x"}, "x"}, {"%%", []any{}, "%"}, {"100%%", []any{}, "100%"}, {"%5%", []any{}, "%"}, {"%", []any{}, "%!(NOVERB)"}, {"abc%", []any{}, "abc%!(NOVERB)"}, {"%!", []any{}, "%!!(MISSING)"}, {"%z", []any{1}, "%!z(int=1)"}, {"%d", []any{}, "%!d(MISSING)"}, {"%d %d", []any{1}, "1 %!d(MISSING)"}, {"%d", []any{1, 2}, "1%!(EXTRA int=2)"}, {"%s", []any{"a", 3, nil}, "a%!(EXTRA int=3, )"}, {"%[2]d %[1]d", []any{1, 2}, "2 1"}, {"%[1]d %[1]x", []any{255}, "255 ff"}, {"%[3]d", []any{1, 2}, "%!d(BADINDEX)"}, {"%[0]d", []any{1}, "%!d(BADINDEX)"}, {"%[x]d", []any{1}, "%!d(BADINDEX)"}, {"%[1]*d|", []any{5, 42}, " 42|"}, {"%[2]*[1]d|", []any{42, 6}, " 42|"}, {"%*d|", []any{5, 42}, " 42|"}, {"%-*d|", []any{5, 42}, "42 |"}, {"%*d|", []any{-5, 42}, "42 |"}, {"%.*f", []any{2, 3.14159}, "3.14"}, {"%.*f", []any{-1, 3.14159}, "%!(BADPREC)3.141590"}, {"%*d", []any{"x", 1}, "%!(BADWIDTH)1"}, {"%.*d", []any{"x", 1}, "%!(BADPREC)1"}, {"%*.*f|", []any{8, 2, 3.14159}, " 3.14|"}, {"%d %s", []any{1}, "1 %!s(MISSING)"}, {"%[2]d", []any{1}, "%!d(BADINDEX)"}, {"%5.2v|", []any{3.14159}, " 3.1|"}, {"%v %v", []any{"a", "b"}, "a b"}, {"%-+5d|", []any{3}, "+3 |"}, {"%+-5d|", []any{3}, "+3 |"}, {"%0-5d|", []any{3}, "3 |"}, {"%x", []any{-1}, "-1"}, {"%#v", []any{[]byte(nil)}, "[]byte(nil)"}, {"%v", []any{[]byte{}}, "[]"}, {"%v", []any{[]string{}}, "[]"}, {"%d", []any{[]any{1, "x"}}, "[1 %!d(string=x)]"}, {"%v", []any{int32(-5)}, "-5"}, {"%c", []any{65}, "A"}, {"%x", []any{"\xff\x00"}, "ff00"}, {"%s", []any{"日本語"}, "日本語"}, {"%6s|", []any{"日本語"}, " 日本語|"}, {"%-6s|", []any{"日本語"}, "日本語 |"}, {"%q", []any{"日本語"}, "\"日本語\""}, {"%+q", []any{"日本語"}, "\"\\u65e5\\u672c\\u8a9e\""}, {"%x", []any{"日本"}, "e697a5e69cac"}, {"%v", []any{"\x00"}, "\x00"}, {"%q", []any{'\n'}, "'\\n'"}, {"%q", []any{0x110000}, "'�'"}, {"%U", []any{-1}, "U+FFFFFFFFFFFFFFFF"}, {"%10.4f|", []any{1234.56789}, " 1234.5679|"}, {"%-10.1e|", []any{1234.56789}, "1.2e+03 |"}, {"%+e", []any{0.0}, "+0.000000e+00"}, {"%g", []any{-0.0}, "0"}, {"%.3g", []any{123456.0}, "1.23e+05"}, {"%.10g", []any{1.0 / 3}, "0.3333333333"}, {"%e", []any{float32(1.0) / 3}, "3.333333e-01"}, {"%v", []any{float32(16777216.0)}, "1.6777216e+07"}, {"%v", []any{1e100}, "1e+100"}, {"%v", []any{123456789.0}, "1.23456789e+08"}, {"%v", []any{0.000001}, "1e-06"}, {"%v", []any{0.0000001}, "1e-07"}, } func TestSprintfMatchesGo(t *testing.T) { for _, c := range goCases { if got := Sprintf(c.format, c.args...); got != c.want { t.Errorf("Sprintf(%q, %v) = %q, want %q", c.format, c.args, got, c.want) } } }