| // Copyright 2018 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 errors_test | |
| import ( | |
| "bytes" | |
| "errors" | |
| "fmt" | |
| "math/big" | |
| "regexp" | |
| "strings" | |
| "testing" | |
| ) | |
| func TestFrame(t *testing.T) { | |
| // Extra line | |
| got := fmt.Sprintf("%+v", errors.New("Test")) | |
| got = got[strings.Index(got, "Test"):] | |
| const want = "^Test:" + | |
| "\n errors_test.TestFrame" + | |
| "\n .*/errors/frame_test.go:20$" | |
| ok, err := regexp.MatchString(want, got) | |
| if err != nil { | |
| t.Fatal(err) | |
| } | |
| if !ok { | |
| t.Errorf("\n got %v;\nwant %v", got, want) | |
| } | |
| } | |
| type myType struct{} | |
| func (myType) Format(s fmt.State, v rune) { | |
| s.Write(bytes.Repeat([]byte("Hi! "), 10)) | |
| } | |
| func BenchmarkNew(b *testing.B) { | |
| for i := 0; i < b.N; i++ { | |
| _ = errors.New("new error") | |
| } | |
| } | |
| func BenchmarkErrorf(b *testing.B) { | |
| err := errors.New("foo") | |
| args := func(a ...interface{}) []interface{} { return a } | |
| benchCases := []struct { | |
| name string | |
| format string | |
| args []interface{} | |
| }{ | |
| {"no_format", "msg: %v", args(err)}, | |
| {"with_format", "failed %d times: %v", args(5, err)}, | |
| {"method: mytype", "pi %s %v: %v", args("myfile.go", myType{}, err)}, | |
| {"method: number", "pi %s %d: %v", args("myfile.go", big.NewInt(5), err)}, | |
| } | |
| for _, bc := range benchCases { | |
| b.Run(bc.name, func(b *testing.B) { | |
| for i := 0; i < b.N; i++ { | |
| _ = fmt.Errorf(bc.format, bc.args...) | |
| } | |
| }) | |
| } | |
| } |