1// Copyright 2022 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5package fmt_test 6 7import ( 8 "fmt" 9 "testing" 10) 11 12type testState struct { 13 width int 14 widthOK bool 15 prec int 16 precOK bool 17 flag map[int]bool 18} 19 20var _ fmt.State = testState{} 21 22func (s testState) Write(b []byte) (n int, err error) { 23 panic("unimplemented") 24} 25 26func (s testState) Width() (wid int, ok bool) { 27 return s.width, s.widthOK 28} 29 30func (s testState) Precision() (prec int, ok bool) { 31 return s.prec, s.precOK 32} 33 34func (s testState) Flag(c int) bool { 35 return s.flag[c] 36} 37 38const NO = -1000 39 40func mkState(w, p int, flags string) testState { 41 s := testState{} 42 if w != NO { 43 s.width = w 44 s.widthOK = true 45 } 46 if p != NO { 47 s.prec = p 48 s.precOK = true 49 } 50 s.flag = make(map[int]bool) 51 for _, c := range flags { 52 s.flag[int(c)] = true 53 } 54 return s 55} 56 57func TestFormatString(t *testing.T) { 58 var tests = []struct { 59 width, prec int 60 flags string 61 result string 62 }{ 63 {NO, NO, "", "%x"}, 64 {NO, 3, "", "%.3x"}, 65 {3, NO, "", "%3x"}, 66 {7, 3, "", "%7.3x"}, 67 {NO, NO, " +-#0", "% +-#0x"}, 68 {7, 3, "+", "%+7.3x"}, 69 {7, -3, "-", "%-7.-3x"}, 70 {7, 3, " ", "% 7.3x"}, 71 {7, 3, "#", "%#7.3x"}, 72 {7, 3, "0", "%07.3x"}, 73 } 74 for _, test := range tests { 75 got := fmt.FormatString(mkState(test.width, test.prec, test.flags), 'x') 76 if got != test.result { 77 t.Errorf("%v: got %s", test, got) 78 } 79 } 80} 81