|
|
@@ -3,14 +3,176 @@
|
|
|
package errors
|
|
|
|
|
|
import (
|
|
|
- stdlib_errors "errors"
|
|
|
+ stderrors "errors"
|
|
|
+ "fmt"
|
|
|
+ "reflect"
|
|
|
"testing"
|
|
|
)
|
|
|
|
|
|
func TestErrorChainCompat(t *testing.T) {
|
|
|
- err := stdlib_errors.New("error that gets wrapped")
|
|
|
+ err := stderrors.New("error that gets wrapped")
|
|
|
wrapped := Wrap(err, "wrapped up")
|
|
|
- if !stdlib_errors.Is(wrapped, err) {
|
|
|
+ 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)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|