package errors import ( "io" "reflect" "testing" ) func TestNew(t *testing.T) { got := New("test error") want := errorString("test error") if !reflect.DeepEqual(got, want) { t.Errorf("New: got %#v, want %#v", got, want) } } func TestNewError(t *testing.T) { tests := []struct { err string want error }{ {"", errorString("")}, {"foo", errorString("foo")}, {"foo", New("foo")}, } 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) } } } type nilError struct{} func (nilError) Error() string { return "nil error" } type causeError struct { cause error } func (e *causeError) Error() string { return "cause error" } func (e *causeError) Cause() error { return e.cause } func TestCause(t *testing.T) { 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: &causeError{cause: io.EOF}, want: 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) } } }