10 func TestWrap(t *testing.T) {
11 err := errors.New("0")
12 err1 := Wrap(err, "1")
13 err2 := Wrap(err1, "2")
16 if got := Root(err1); got != err {
17 t.Fatalf("Root(%v)=%v want %v", err1, got, err)
20 if got := Root(err2); got != err {
21 t.Fatalf("Root(%v)=%v want %v", err2, got, err)
24 if err2.Error() != "2: 1: 0" {
25 t.Fatalf("err msg = %s want '2: 1: 0'", err2.Error())
28 if err3.Error() != "2: 1: 0" {
29 t.Fatalf("err msg = %s want '2: 1: 0'", err3.Error())
34 t.Fatalf("len(stack) = %v want > 0", len(stack))
36 if !strings.Contains(stack[0].String(), "TestWrap") {
37 t.Fatalf("first stack frame should contain \"TestWrap\": %v", stack[0].String())
40 if !reflect.DeepEqual(Stack(err2), Stack(err1)) {
41 t.Errorf("err2 stack got %v want %v", Stack(err2), Stack(err1))
44 if !reflect.DeepEqual(Stack(err3), Stack(err1)) {
45 t.Errorf("err3 stack got %v want %v", Stack(err3), Stack(err1))
49 func TestWrapNil(t *testing.T) {
52 err1 := Wrap(err, "1")
54 t.Fatal("wrapping nil error should yield nil")
58 func TestWrapf(t *testing.T) {
59 err := errors.New("0")
60 err1 := Wrapf(err, "there are %d errors being wrapped", 1)
61 if err1.Error() != "there are 1 errors being wrapped: 0" {
62 t.Fatalf("err msg = %s want 'there are 1 errors being wrapped: 0'", err1.Error())
66 func TestWrapMsg(t *testing.T) {
67 err := errors.New("rooti")
68 err1 := Wrap(err, "cherry", " ", "guava")
69 if err1.Error() != "cherry guava: rooti" {
70 t.Fatalf("err msg = %s want 'cherry guava: rooti'", err1.Error())
74 func TestDetail(t *testing.T) {
75 root := errors.New("foo")
82 {WithDetail(root, "bar"), "bar", "bar: foo"},
83 {WithDetail(WithDetail(root, "bar"), "baz"), "bar; baz", "baz: bar: foo"},
84 {Wrap(WithDetail(root, "bar"), "baz"), "bar", "baz: bar: foo"},
87 for _, test := range cases {
88 if got := Detail(test.err); got != test.detail {
89 t.Errorf("Detail(%v) = %v want %v", test.err, got, test.detail)
91 if got := Root(test.err); got != root {
92 t.Errorf("Root(%v) = %v want %v", test.err, got, root)
94 if got := test.err.Error(); got != test.message {
95 t.Errorf("(%v).Error() = %v want %v", test.err, got, test.message)
100 func TestData(t *testing.T) {
101 root := errors.New("foo")
106 {WithData(root, "a", "b"), map[string]interface{}{"a": "b"}},
107 {WithData(WithData(root, "a", "b"), "c", "d"), map[string]interface{}{"a": "b", "c": "d"}},
108 {Wrap(WithData(root, "a", "b"), "baz"), map[string]interface{}{"a": "b"}},
111 for _, test := range cases {
112 if got := Data(test.err); !reflect.DeepEqual(got, test.data) {
113 t.Errorf("Data(%#v) = %v want %v", test.err, got, test.data)
115 if got := Root(test.err); got != root {
116 t.Errorf("Root(%#v) = %v want %v", test.err, got, root)
121 func TestSub(t *testing.T) {
124 cases := []struct{ new, old, want error }{
130 {x, y, errors.New("y: x")},
131 {Wrap(x), y, errors.New("y: x")},
132 {x, Wrap(y), errors.New("y: x")},
133 {Wrap(x, "z"), Wrap(y), errors.New("y: z: x")},
136 for _, test := range cases {
137 got := Sub(test.new, test.old)
138 if !(got == nil && test.want == nil || got.Error() == test.want.Error()) {
139 t.Errorf("Sub(%#v, %#v) = %v, want %v", test.new, test.old, got, test.want)