Search Apps Documentation Source Content File Folder Download Copy Actions Download State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

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}