| // 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) |
| } |
| } |
| } |