OSDN Git Service

Hulk did something
[bytom/vapor.git] / vendor / github.com / pkg / errors / errors_test.go
diff --git a/vendor/github.com/pkg/errors/errors_test.go b/vendor/github.com/pkg/errors/errors_test.go
new file mode 100644 (file)
index 0000000..c4e6eef
--- /dev/null
@@ -0,0 +1,225 @@
+package errors
+
+import (
+       "errors"
+       "fmt"
+       "io"
+       "reflect"
+       "testing"
+)
+
+func TestNew(t *testing.T) {
+       tests := []struct {
+               err  string
+               want error
+       }{
+               {"", fmt.Errorf("")},
+               {"foo", fmt.Errorf("foo")},
+               {"foo", New("foo")},
+               {"string with format specifiers: %v", errors.New("string with format specifiers: %v")},
+       }
+
+       for _, tt := range tests {
+               got := New(tt.err)
+               if got.Error() != tt.want.Error() {
+                       t.Errorf("New.Error(): got: %q, want %q", got, tt.want)
+               }
+       }
+}
+
+func TestWrapNil(t *testing.T) {
+       got := Wrap(nil, "no error")
+       if got != nil {
+               t.Errorf("Wrap(nil, \"no error\"): got %#v, expected nil", got)
+       }
+}
+
+func TestWrap(t *testing.T) {
+       tests := []struct {
+               err     error
+               message string
+               want    string
+       }{
+               {io.EOF, "read error", "read error: EOF"},
+               {Wrap(io.EOF, "read error"), "client error", "client error: read error: EOF"},
+       }
+
+       for _, tt := range tests {
+               got := Wrap(tt.err, tt.message).Error()
+               if got != tt.want {
+                       t.Errorf("Wrap(%v, %q): got: %v, want %v", tt.err, tt.message, got, tt.want)
+               }
+       }
+}
+
+type nilError struct{}
+
+func (nilError) Error() string { return "nil error" }
+
+func TestCause(t *testing.T) {
+       x := New("error")
+       tests := []struct {
+               err  error
+               want error
+       }{{
+               // nil error is nil
+               err:  nil,
+               want: nil,
+       }, {
+               // explicit nil error is nil
+               err:  (error)(nil),
+               want: nil,
+       }, {
+               // typed nil is nil
+               err:  (*nilError)(nil),
+               want: (*nilError)(nil),
+       }, {
+               // uncaused error is unaffected
+               err:  io.EOF,
+               want: io.EOF,
+       }, {
+               // caused error returns cause
+               err:  Wrap(io.EOF, "ignored"),
+               want: io.EOF,
+       }, {
+               err:  x, // return from errors.New
+               want: x,
+       }, {
+               WithMessage(nil, "whoops"),
+               nil,
+       }, {
+               WithMessage(io.EOF, "whoops"),
+               io.EOF,
+       }, {
+               WithStack(nil),
+               nil,
+       }, {
+               WithStack(io.EOF),
+               io.EOF,
+       }}
+
+       for i, tt := range tests {
+               got := Cause(tt.err)
+               if !reflect.DeepEqual(got, tt.want) {
+                       t.Errorf("test %d: got %#v, want %#v", i+1, got, tt.want)
+               }
+       }
+}
+
+func TestWrapfNil(t *testing.T) {
+       got := Wrapf(nil, "no error")
+       if got != nil {
+               t.Errorf("Wrapf(nil, \"no error\"): got %#v, expected nil", got)
+       }
+}
+
+func TestWrapf(t *testing.T) {
+       tests := []struct {
+               err     error
+               message string
+               want    string
+       }{
+               {io.EOF, "read error", "read error: EOF"},
+               {Wrapf(io.EOF, "read error without format specifiers"), "client error", "client error: read error without format specifiers: EOF"},
+               {Wrapf(io.EOF, "read error with %d format specifier", 1), "client error", "client error: read error with 1 format specifier: EOF"},
+       }
+
+       for _, tt := range tests {
+               got := Wrapf(tt.err, tt.message).Error()
+               if got != tt.want {
+                       t.Errorf("Wrapf(%v, %q): got: %v, want %v", tt.err, tt.message, got, tt.want)
+               }
+       }
+}
+
+func TestErrorf(t *testing.T) {
+       tests := []struct {
+               err  error
+               want string
+       }{
+               {Errorf("read error without format specifiers"), "read error without format specifiers"},
+               {Errorf("read error with %d format specifier", 1), "read error with 1 format specifier"},
+       }
+
+       for _, tt := range tests {
+               got := tt.err.Error()
+               if got != tt.want {
+                       t.Errorf("Errorf(%v): got: %q, want %q", tt.err, got, tt.want)
+               }
+       }
+}
+
+func TestWithStackNil(t *testing.T) {
+       got := WithStack(nil)
+       if got != nil {
+               t.Errorf("WithStack(nil): got %#v, expected nil", got)
+       }
+}
+
+func TestWithStack(t *testing.T) {
+       tests := []struct {
+               err  error
+               want string
+       }{
+               {io.EOF, "EOF"},
+               {WithStack(io.EOF), "EOF"},
+       }
+
+       for _, tt := range tests {
+               got := WithStack(tt.err).Error()
+               if got != tt.want {
+                       t.Errorf("WithStack(%v): got: %v, want %v", tt.err, got, tt.want)
+               }
+       }
+}
+
+func TestWithMessageNil(t *testing.T) {
+       got := WithMessage(nil, "no error")
+       if got != nil {
+               t.Errorf("WithMessage(nil, \"no error\"): got %#v, expected nil", got)
+       }
+}
+
+func TestWithMessage(t *testing.T) {
+       tests := []struct {
+               err     error
+               message string
+               want    string
+       }{
+               {io.EOF, "read error", "read error: EOF"},
+               {WithMessage(io.EOF, "read error"), "client error", "client error: read error: EOF"},
+       }
+
+       for _, tt := range tests {
+               got := WithMessage(tt.err, tt.message).Error()
+               if got != tt.want {
+                       t.Errorf("WithMessage(%v, %q): got: %q, want %q", tt.err, tt.message, got, tt.want)
+               }
+       }
+}
+
+// errors.New, etc values are not expected to be compared by value
+// but the change in errors#27 made them incomparable. Assert that
+// various kinds of errors have a functional equality operator, even
+// if the result of that equality is always false.
+func TestErrorEquality(t *testing.T) {
+       vals := []error{
+               nil,
+               io.EOF,
+               errors.New("EOF"),
+               New("EOF"),
+               Errorf("EOF"),
+               Wrap(io.EOF, "EOF"),
+               Wrapf(io.EOF, "EOF%d", 2),
+               WithMessage(nil, "whoops"),
+               WithMessage(io.EOF, "whoops"),
+               WithStack(io.EOF),
+               WithStack(nil),
+       }
+
+       for i := range vals {
+               for j := range vals {
+                       _ = vals[i] == vals[j] // mustn't panic
+               }
+       }
+}