| // +build go1.13 |
| |
| package errors |
| |
| import ( |
| stderrors "errors" |
| "fmt" |
| "reflect" |
| "testing" |
| ) |
| |
| func TestErrorChainCompat(t *testing.T) { |
| err := stderrors.New("error that gets wrapped") |
| wrapped := Wrap(err, "wrapped up") |
| if !stderrors.Is(wrapped, err) { |
| t.Errorf("Wrap does not support Go 1.13 error chains") |
| } |
| } |
| |
| func TestIs(t *testing.T) { |
| err := New("test") |
| |
| type args struct { |
| err error |
| target error |
| } |
| tests := []struct { |
| name string |
| args args |
| want bool |
| }{ |
| { |
| name: "with stack", |
| args: args{ |
| err: WithStack(err), |
| target: err, |
| }, |
| want: true, |
| }, |
| { |
| name: "with message", |
| args: args{ |
| err: WithMessage(err, "test"), |
| target: err, |
| }, |
| want: true, |
| }, |
| { |
| name: "with message format", |
| args: args{ |
| err: WithMessagef(err, "%s", "test"), |
| target: err, |
| }, |
| want: true, |
| }, |
| { |
| name: "std errors compatibility", |
| args: args{ |
| err: fmt.Errorf("wrap it: %w", err), |
| target: err, |
| }, |
| want: true, |
| }, |
| } |
| for _, tt := range tests { |
| t.Run(tt.name, func(t *testing.T) { |
| if got := Is(tt.args.err, tt.args.target); got != tt.want { |
| t.Errorf("Is() = %v, want %v", got, tt.want) |
| } |
| }) |
| } |
| } |
| |
| type customErr struct { |
| msg string |
| } |
| |
| func (c customErr) Error() string { return c.msg } |
| |
| func TestAs(t *testing.T) { |
| var err = customErr{msg: "test message"} |
| |
| type args struct { |
| err error |
| target interface{} |
| } |
| tests := []struct { |
| name string |
| args args |
| want bool |
| }{ |
| { |
| name: "with stack", |
| args: args{ |
| err: WithStack(err), |
| target: new(customErr), |
| }, |
| want: true, |
| }, |
| { |
| name: "with message", |
| args: args{ |
| err: WithMessage(err, "test"), |
| target: new(customErr), |
| }, |
| want: true, |
| }, |
| { |
| name: "with message format", |
| args: args{ |
| err: WithMessagef(err, "%s", "test"), |
| target: new(customErr), |
| }, |
| want: true, |
| }, |
| { |
| name: "std errors compatibility", |
| args: args{ |
| err: fmt.Errorf("wrap it: %w", err), |
| target: new(customErr), |
| }, |
| want: true, |
| }, |
| } |
| for _, tt := range tests { |
| t.Run(tt.name, func(t *testing.T) { |
| if got := As(tt.args.err, tt.args.target); got != tt.want { |
| t.Errorf("As() = %v, want %v", got, tt.want) |
| } |
| |
| ce := tt.args.target.(*customErr) |
| if !reflect.DeepEqual(err, *ce) { |
| t.Errorf("set target error failed, target error is %v", *ce) |
| } |
| }) |
| } |
| } |
| |
| func TestUnwrap(t *testing.T) { |
| err := New("test") |
| |
| type args struct { |
| err error |
| } |
| tests := []struct { |
| name string |
| args args |
| want error |
| }{ |
| { |
| name: "with stack", |
| args: args{err: WithStack(err)}, |
| want: err, |
| }, |
| { |
| name: "with message", |
| args: args{err: WithMessage(err, "test")}, |
| want: err, |
| }, |
| { |
| name: "with message format", |
| args: args{err: WithMessagef(err, "%s", "test")}, |
| want: err, |
| }, |
| { |
| name: "std errors compatibility", |
| args: args{err: fmt.Errorf("wrap: %w", err)}, |
| want: err, |
| }, |
| } |
| for _, tt := range tests { |
| t.Run(tt.name, func(t *testing.T) { |
| if err := Unwrap(tt.args.err); !reflect.DeepEqual(err, tt.want) { |
| t.Errorf("Unwrap() error = %v, want %v", err, tt.want) |
| } |
| }) |
| } |
| } |