1package errwrap 2 3import ( 4 "errors" 5 "fmt" 6 "testing" 7) 8 9func TestWrappedError_impl(t *testing.T) { 10 var _ error = new(wrappedError) 11} 12 13func TestGetAll(t *testing.T) { 14 cases := []struct { 15 Err error 16 Msg string 17 Len int 18 }{ 19 {}, 20 { 21 fmt.Errorf("foo"), 22 "foo", 23 1, 24 }, 25 { 26 fmt.Errorf("bar"), 27 "foo", 28 0, 29 }, 30 { 31 Wrapf("bar", fmt.Errorf("foo")), 32 "foo", 33 1, 34 }, 35 { 36 Wrapf("{{err}}", fmt.Errorf("foo")), 37 "foo", 38 2, 39 }, 40 { 41 Wrapf("bar", Wrapf("baz", fmt.Errorf("foo"))), 42 "foo", 43 1, 44 }, 45 { 46 fmt.Errorf("foo: %w", fmt.Errorf("bar")), 47 "foo: bar", 48 1, 49 }, 50 { 51 fmt.Errorf("foo: %w", fmt.Errorf("bar")), 52 "bar", 53 1, 54 }, 55 } 56 57 for i, tc := range cases { 58 actual := GetAll(tc.Err, tc.Msg) 59 if len(actual) != tc.Len { 60 t.Fatalf("%d: bad: %#v", i, actual) 61 } 62 for _, v := range actual { 63 if v.Error() != tc.Msg { 64 t.Fatalf("%d: bad: %#v", i, actual) 65 } 66 } 67 } 68} 69 70func TestGetAllType(t *testing.T) { 71 cases := []struct { 72 Err error 73 Type interface{} 74 Len int 75 }{ 76 {}, 77 { 78 fmt.Errorf("foo"), 79 "foo", 80 0, 81 }, 82 { 83 fmt.Errorf("bar"), 84 fmt.Errorf("foo"), 85 1, 86 }, 87 { 88 Wrapf("bar", fmt.Errorf("foo")), 89 fmt.Errorf("baz"), 90 2, 91 }, 92 { 93 Wrapf("bar", Wrapf("baz", fmt.Errorf("foo"))), 94 Wrapf("", nil), 95 0, 96 }, 97 { 98 fmt.Errorf("one: %w", fmt.Errorf("two: %w", fmt.Errorf("three"))), 99 fmt.Errorf("%w", errors.New("")), 100 2, 101 }, 102 } 103 104 for i, tc := range cases { 105 actual := GetAllType(tc.Err, tc.Type) 106 if len(actual) != tc.Len { 107 t.Fatalf("%d: bad: %#v", i, actual) 108 } 109 } 110} 111 112func TestWrappedError_IsCompatibleWithErrorsUnwrap(t *testing.T) { 113 inner := errors.New("inner error") 114 err := Wrap(errors.New("outer"), inner) 115 actual := errors.Unwrap(err) 116 if actual != inner { 117 t.Fatal("wrappedError did not unwrap to inner") 118 } 119} 120