gofmt_test.gno
8.37 Kb · 233 lines
1package ufmt
2
3import (
4 "math"
5 "testing"
6)
7
8// goCases were generated by running each row through Go's fmt.Sprintf
9// (go1.27.1), so a row that fails here is a place v2 differs from Go.
10var goCases = []struct {
11 format string
12 args []any
13 want string
14}{
15 {"%d", []any{7}, "7"},
16 {"%03d", []any{7}, "007"},
17 {"%08X", []any{uint32(0xdead)}, "0000DEAD"},
18 {"0x%08X", []any{uint32(0x10074)}, "0x00010074"},
19 {"%08x", []any{uint32(0x00a00513)}, "00a00513"},
20 {"%x", []any{uint32(255)}, "ff"},
21 {"%X", []any{-255}, "-FF"},
22 {"%#x", []any{255}, "0xff"},
23 {"%#X", []any{255}, "0XFF"},
24 {"%#08x", []any{255}, "0x000000ff"},
25 {"%#o", []any{8}, "010"},
26 {"%O", []any{8}, "0o10"},
27 {"%b", []any{5}, "101"},
28 {"%#b", []any{5}, "0b101"},
29 {"%o", []any{-8}, "-10"},
30 {"%5d", []any{42}, " 42"},
31 {"%-5d|", []any{42}, "42 |"},
32 {"%+d", []any{42}, "+42"},
33 {"% d", []any{42}, " 42"},
34 {"%+05d", []any{42}, "+0042"},
35 {"%-05d|", []any{42}, "42 |"},
36 {"%.3d", []any{7}, "007"},
37 {"%8.3d", []any{-7}, " -007"},
38 {"%.0d", []any{0}, ""},
39 {"%5.0d|", []any{0}, " |"},
40 {"%d", []any{int64(-9223372036854775808)}, "-9223372036854775808"},
41 {"%x", []any{int64(-9223372036854775808)}, "-8000000000000000"},
42 {"%d", []any{uint64(18446744073709551615)}, "18446744073709551615"},
43 {"%x", []any{uint64(18446744073709551615)}, "ffffffffffffffff"},
44 {"%d", []any{int8(-128)}, "-128"},
45 {"%d", []any{uint8(200)}, "200"},
46 {"%x", []any{int16(-1)}, "-1"},
47 {"%d", []any{"hi"}, "%!d(string=hi)"},
48 {"%s", []any{42}, "%!s(int=42)"},
49 {"%c", []any{'x'}, "x"},
50 {"%c", []any{0x1F600}, "😀"},
51 {"%q", []any{'x'}, "'x'"},
52 {"%+q", []any{'é'}, "'\\u00e9'"},
53 {"%U", []any{0x1F600}, "U+1F600"},
54 {"%#U", []any{'x'}, "U+0078 'x'"},
55 {"%U", []any{1}, "U+0001"},
56 {"%.6U", []any{1}, "U+000001"},
57 {"%c", []any{-1}, "�"},
58 {"%s", []any{"hello"}, "hello"},
59 {"%10s|", []any{"hello"}, " hello|"},
60 {"%-10s|", []any{"hello"}, "hello |"},
61 {"%.2s", []any{"hello"}, "he"},
62 {"%.2s", []any{"héllo"}, "hé"},
63 {"%5.1s|", []any{"héllo"}, " h|"},
64 {"%05s", []any{"ab"}, "000ab"},
65 {"%q", []any{"hi\n"}, "\"hi\\n\""},
66 {"%+q", []any{"héllo"}, "\"h\\u00e9llo\""},
67 {"%#q", []any{"back`tick"}, "\"back`tick\""},
68 {"%#q", []any{"plain"}, "`plain`"},
69 {"%x", []any{"hello"}, "68656c6c6f"},
70 {"%X", []any{"hello"}, "68656C6C6F"},
71 {"% x", []any{"hello"}, "68 65 6c 6c 6f"},
72 {"%# x", []any{"hi"}, "0x68 0x69"},
73 {"%#x", []any{"hi"}, "0x6869"},
74 {"%10x|", []any{"hi"}, " 6869|"},
75 {"%-10x|", []any{"hi"}, "6869 |"},
76 {"%x", []any{""}, ""},
77 {"%5x|", []any{""}, " |"},
78 {"%.1x", []any{"hi"}, "68"},
79 {"%s", []any{[]byte("bytes")}, "bytes"},
80 {"%x", []any{[]byte{1, 171}}, "01ab"},
81 {"%X", []any{[]byte{1, 171}}, "01AB"},
82 {"%v", []any{[]byte{1, 2}}, "[1 2]"},
83 {"%d", []any{[]byte{1, 2}}, "[1 2]"},
84 {"%#v", []any{[]byte{1, 2}}, "[]byte{0x1, 0x2}"},
85 {"%q", []any{[]byte("q")}, "\"q\""},
86 {"%b", []any{[]byte{3}}, "[11]"},
87 {"%t", []any{true}, "true"},
88 {"%v", []any{false}, "false"},
89 {"%5t|", []any{true}, " true|"},
90 {"%d", []any{true}, "%!d(bool=true)"},
91 {"%f", []any{3.14159}, "3.141590"},
92 {"%.2f", []any{3.14159}, "3.14"},
93 {"%8.3f|", []any{3.14159}, " 3.142|"},
94 {"%-8.3f|", []any{3.14159}, "3.142 |"},
95 {"%08.3f", []any{-3.14159}, "-003.142"},
96 {"%+.1f", []any{2.0}, "+2.0"},
97 {"% .1f", []any{2.0}, " 2.0"},
98 {"%e", []any{1234.5678}, "1.234568e+03"},
99 {"%E", []any{1234.5678}, "1.234568E+03"},
100 {"%.2e", []any{1234.5678}, "1.23e+03"},
101 {"%g", []any{1234.5678}, "1234.5678"},
102 {"%g", []any{1e21}, "1e+21"},
103 {"%g", []any{0.00001}, "1e-05"},
104 {"%G", []any{1e-10}, "1E-10"},
105 {"%v", []any{3.14}, "3.14"},
106 {"%v", []any{1e6}, "1e+06"},
107 {"%v", []any{100000.0}, "100000"},
108 {"%v", []any{float32(0.1)}, "0.1"},
109 {"%F", []any{1.5}, "1.500000"},
110 {"%#g", []any{1.0}, "1.00000"},
111 {"%#.3g", []any{1.0}, "1.00"},
112 {"%#f", []any{1.0}, "1.000000"},
113 {"%#.0f", []any{1.0}, "1."},
114 {"%#.0e", []any{1.0}, "1.e+00"},
115 {"%x", []any{1.0}, "0x1p+00"},
116 {"%X", []any{1.0}, "0X1P+00"},
117 {"%b", []any{1.0}, "4503599627370496p-52"},
118 {"%.3x", []any{3.14159}, "0x1.922p+01"},
119 {"%f", []any{math.Inf(1)}, "+Inf"},
120 {"%+f", []any{math.Inf(1)}, "+Inf"},
121 {"%08f", []any{math.Inf(-1)}, " -Inf"},
122 {"%f", []any{math.NaN()}, "NaN"},
123 {"%+f", []any{math.NaN()}, "+NaN"},
124 {"%010.2f", []any{12.5}, "0000012.50"},
125 {"%s", []any{1.5}, "%!s(float64=1.5)"},
126 {"%v", []any{nil}, "<nil>"},
127 {"%d", []any{nil}, "%!d(<nil>)"},
128 {"%s", []any{nil}, "%!s(<nil>)"},
129 {"%T", []any{nil}, "<nil>"},
130 {"%T", []any{42}, "int"},
131 {"%T", []any{"s"}, "string"},
132 {"%T", []any{[]byte("x")}, "[]uint8"},
133 {"%T", []any{3.0}, "float64"},
134 {"%T", []any{int8(1)}, "int8"},
135 {"%T", []any{[]string{"a"}}, "[]string"},
136 {"%T", []any{map[string]int{}}, "map[string]int"},
137 {"%5T|", []any{1}, " int|"},
138 {"%v", []any{[]string{"a", "b"}}, "[a b]"},
139 {"%q", []any{[]string{"a", "b"}}, "[\"a\" \"b\"]"},
140 {"%#v", []any{[]string{"a", "b"}}, "[]string{\"a\", \"b\"}"},
141 {"%#v", []any{[]string(nil)}, "[]string(nil)"},
142 {"%v", []any{[]int{1, 2, 3}}, "[1 2 3]"},
143 {"%3d", []any{[]int{1, 2}}, "[ 1 2]"},
144 {"%x", []any{[]int{10, 255}}, "[a ff]"},
145 {"%d", []any{[]string{"a"}}, "[%!d(string=a)]"},
146 {"%v", []any{[]any{1, "a", nil, true}}, "[1 a <nil> true]"},
147 {"%#v", []any{[]any{1, "a", nil}}, "[]interface {}{1, \"a\", interface {}(nil)}"},
148 {"%v", []any{[]float64{1.5, 2}}, "[1.5 2]"},
149 {"%v", []any{map[string]int{"b": 2, "a": 1, "c": 3}}, "map[a:1 b:2 c:3]"},
150 {"%#v", []any{map[string]int{"b": 2, "a": 1}}, "map[string]int{\"a\":1, \"b\":2}"},
151 {"%v", []any{map[string]string{"k": "v"}}, "map[k:v]"},
152 {"%v", []any{map[string]any{"x": nil, "y": 1}}, "map[x:<nil> y:1]"},
153 {"%v", []any{map[string]bool{}}, "map[]"},
154 {"%#v", []any{"str"}, "\"str\""},
155 {"%#v", []any{42}, "42"},
156 {"%#v", []any{uint(42)}, "0x2a"},
157 {"%#v", []any{3.0}, "3"},
158 {"%#v", []any{true}, "true"},
159 {"%#v", []any{nil}, "<nil>"},
160 {"%+v", []any{42}, "42"},
161 {"%+v", []any{"x"}, "x"},
162 {"%%", []any{}, "%"},
163 {"100%%", []any{}, "100%"},
164 {"%5%", []any{}, "%"},
165 {"%", []any{}, "%!(NOVERB)"},
166 {"abc%", []any{}, "abc%!(NOVERB)"},
167 {"%!", []any{}, "%!!(MISSING)"},
168 {"%z", []any{1}, "%!z(int=1)"},
169 {"%d", []any{}, "%!d(MISSING)"},
170 {"%d %d", []any{1}, "1 %!d(MISSING)"},
171 {"%d", []any{1, 2}, "1%!(EXTRA int=2)"},
172 {"%s", []any{"a", 3, nil}, "a%!(EXTRA int=3, <nil>)"},
173 {"%[2]d %[1]d", []any{1, 2}, "2 1"},
174 {"%[1]d %[1]x", []any{255}, "255 ff"},
175 {"%[3]d", []any{1, 2}, "%!d(BADINDEX)"},
176 {"%[0]d", []any{1}, "%!d(BADINDEX)"},
177 {"%[x]d", []any{1}, "%!d(BADINDEX)"},
178 {"%[1]*d|", []any{5, 42}, " 42|"},
179 {"%[2]*[1]d|", []any{42, 6}, " 42|"},
180 {"%*d|", []any{5, 42}, " 42|"},
181 {"%-*d|", []any{5, 42}, "42 |"},
182 {"%*d|", []any{-5, 42}, "42 |"},
183 {"%.*f", []any{2, 3.14159}, "3.14"},
184 {"%.*f", []any{-1, 3.14159}, "%!(BADPREC)3.141590"},
185 {"%*d", []any{"x", 1}, "%!(BADWIDTH)1"},
186 {"%.*d", []any{"x", 1}, "%!(BADPREC)1"},
187 {"%*.*f|", []any{8, 2, 3.14159}, " 3.14|"},
188 {"%d %s", []any{1}, "1 %!s(MISSING)"},
189 {"%[2]d", []any{1}, "%!d(BADINDEX)"},
190 {"%5.2v|", []any{3.14159}, " 3.1|"},
191 {"%v %v", []any{"a", "b"}, "a b"},
192 {"%-+5d|", []any{3}, "+3 |"},
193 {"%+-5d|", []any{3}, "+3 |"},
194 {"%0-5d|", []any{3}, "3 |"},
195 {"%x", []any{-1}, "-1"},
196 {"%#v", []any{[]byte(nil)}, "[]byte(nil)"},
197 {"%v", []any{[]byte{}}, "[]"},
198 {"%v", []any{[]string{}}, "[]"},
199 {"%d", []any{[]any{1, "x"}}, "[1 %!d(string=x)]"},
200 {"%v", []any{int32(-5)}, "-5"},
201 {"%c", []any{65}, "A"},
202 {"%x", []any{"\xff\x00"}, "ff00"},
203 {"%s", []any{"日本語"}, "日本語"},
204 {"%6s|", []any{"日本語"}, " 日本語|"},
205 {"%-6s|", []any{"日本語"}, "日本語 |"},
206 {"%q", []any{"日本語"}, "\"日本語\""},
207 {"%+q", []any{"日本語"}, "\"\\u65e5\\u672c\\u8a9e\""},
208 {"%x", []any{"日本"}, "e697a5e69cac"},
209 {"%v", []any{"\x00"}, "\x00"},
210 {"%q", []any{'\n'}, "'\\n'"},
211 {"%q", []any{0x110000}, "'�'"},
212 {"%U", []any{-1}, "U+FFFFFFFFFFFFFFFF"},
213 {"%10.4f|", []any{1234.56789}, " 1234.5679|"},
214 {"%-10.1e|", []any{1234.56789}, "1.2e+03 |"},
215 {"%+e", []any{0.0}, "+0.000000e+00"},
216 {"%g", []any{-0.0}, "0"},
217 {"%.3g", []any{123456.0}, "1.23e+05"},
218 {"%.10g", []any{1.0 / 3}, "0.3333333333"},
219 {"%e", []any{float32(1.0) / 3}, "3.333333e-01"},
220 {"%v", []any{float32(16777216.0)}, "1.6777216e+07"},
221 {"%v", []any{1e100}, "1e+100"},
222 {"%v", []any{123456789.0}, "1.23456789e+08"},
223 {"%v", []any{0.000001}, "1e-06"},
224 {"%v", []any{0.0000001}, "1e-07"},
225}
226
227func TestSprintfMatchesGo(t *testing.T) {
228 for _, c := range goCases {
229 if got := Sprintf(c.format, c.args...); got != c.want {
230 t.Errorf("Sprintf(%q, %v) = %q, want %q", c.format, c.args, got, c.want)
231 }
232 }
233}