| // Copyright 2022 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package fmt_test | |
| import ( | |
| "fmt" | |
| "testing" | |
| ) | |
| type testState struct { | |
| width int | |
| widthOK bool | |
| prec int | |
| precOK bool | |
| flag map[int]bool | |
| } | |
| var _ fmt.State = testState{} | |
| func (s testState) Write(b []byte) (n int, err error) { | |
| panic("unimplemented") | |
| } | |
| func (s testState) Width() (wid int, ok bool) { | |
| return s.width, s.widthOK | |
| } | |
| func (s testState) Precision() (prec int, ok bool) { | |
| return s.prec, s.precOK | |
| } | |
| func (s testState) Flag(c int) bool { | |
| return s.flag[c] | |
| } | |
| const NO = -1000 | |
| func mkState(w, p int, flags string) testState { | |
| s := testState{} | |
| if w != NO { | |
| s.width = w | |
| s.widthOK = true | |
| } | |
| if p != NO { | |
| s.prec = p | |
| s.precOK = true | |
| } | |
| s.flag = make(map[int]bool) | |
| for _, c := range flags { | |
| s.flag[int(c)] = true | |
| } | |
| return s | |
| } | |
| func TestFormatString(t *testing.T) { | |
| var tests = []struct { | |
| width, prec int | |
| flags string | |
| result string | |
| }{ | |
| {NO, NO, "", "%x"}, | |
| {NO, 3, "", "%.3x"}, | |
| {3, NO, "", "%3x"}, | |
| {7, 3, "", "%7.3x"}, | |
| {NO, NO, " +-#0", "% +-#0x"}, | |
| {7, 3, "+", "%+7.3x"}, | |
| {7, -3, "-", "%-7.-3x"}, | |
| {7, 3, " ", "% 7.3x"}, | |
| {7, 3, "#", "%#7.3x"}, | |
| {7, 3, "0", "%07.3x"}, | |
| } | |
| for _, test := range tests { | |
| got := fmt.FormatString(mkState(test.width, test.prec, test.flags), 'x') | |
| if got != test.result { | |
| t.Errorf("%v: got %s", test, got) | |
| } | |
| } | |
| } |