@@ -8,88 +8,155 @@ import (
88 "github.com/gravitton/assert"
99)
1010
11- func TestFields (t * testing.T ) {
12- err := Newf ("Test DataError #%d: %s" , 5 , "failed to spawn" )
13- assert .Equal (t , err .Error (), "Test DataError #5: failed to spawn" )
14- assert .Length (t , err .Fields (), 0 )
11+ func TestNew (t * testing.T ) {
12+ err := New ("test" )
1513
16- err = Wrap ("test" )
1714 assert .Equal (t , err .Error (), "test" )
15+ assert .Empty (t , err .Fields ())
1816
19- err = New ("test3" ).WithField ("action" , "call" )
20- assert .Equal (t , err .Error (), "test3" )
21- assert .Equal (t , err .Fields ()["action" ], "call" )
22- assert .NotContains (t , err .Fields (), "type" )
17+ cause := err .Unwrap ()
18+ assert .Equal (t , reflect .TypeOf (cause ).String (), "*errors.errorString" )
19+ }
2320
24- err1 := Wrap ( err )
25- assert . Same ( t , err , err1 )
21+ func TestNewf ( t * testing. T ) {
22+ err := Newf ( "Test DataError #%d: %s" , 5 , "failed to spawn" )
2623
27- err2 := err .WithFields (map [string ]any {"type" : "warning" })
28- assert .NotSame (t , err1 , err2 )
29- assert .NotContains (t , err .Fields (), "type" )
30- assert .Equal (t , err .Error (), "test3" )
31- assert .Equal (t , err2 .Fields ()["type" ], "warning" )
32-
33- err3 := err .WithField ("action" , "send" )
34- assert .Equal (t , err2 .Fields ()["action" ], "call" )
35- assert .Equal (t , err3 .Fields ()["action" ], "send" )
36-
37- err4 := New ("error" )
38- err5 := New ("error" )
39- assert .Equal (t , err4 , err5 )
40- assert .NotSame (t , err4 , err5 )
24+ assert .Equal (t , err .Error (), "Test DataError #5: failed to spawn" )
25+ assert .Empty (t , err .Fields ())
26+
27+ cause := err .Unwrap ()
28+ assert .Equal (t , reflect .TypeOf (cause ).String (), "*errors.errorString" )
29+ }
30+
31+ func TestWrapNil (t * testing.T ) {
32+ err := Wrap (nil )
33+
34+ assert .NoError (t , err )
4135}
4236
43- func TestUnwrap (t * testing.T ) {
44- err := New ("original error 1" )
37+ func TestWrapNonError (t * testing.T ) {
38+ err := Wrap ("something went wrong" )
39+
40+ assert .Equal (t , err .Error (), "something went wrong" )
4541
4642 cause := err .Unwrap ()
43+ assert .Equal (t , reflect .TypeOf (cause ).String (), "*errors.errorString" )
44+ }
45+
46+ func TestWrapNonErrorNonString (t * testing.T ) {
47+ err := Wrap (159.5 )
4748
49+ assert .Equal (t , err .Error (), "159.5" )
50+
51+ cause := err .Unwrap ()
4852 assert .Equal (t , reflect .TypeOf (cause ).String (), "*errors.errorString" )
49- assert .Equal (t , "original error 1" , cause .Error ())
53+ }
54+
55+ func TestWrapError (t * testing.T ) {
56+ original := errors .New ("original" )
57+ err := Wrap (original )
58+
59+ assert .Equal (t , err .Error (), "original" )
60+
61+ cause := err .Unwrap ()
62+ assert .Equal (t , cause , original )
63+ }
64+
65+ func TestWrapDataError (t * testing.T ) {
66+ original := New ("original" )
67+ err := Wrap (original )
68+
69+ assert .Same (t , err , original )
70+ }
71+
72+ func TestStackTrace (t * testing.T ) {
73+ err1 := New ("test" )
74+ err2 := Newf ("test %d" , 1 )
75+ err3 := Wrap (errors .New ("std" ))
76+
77+ assert .NotEmpty (t , err1 .StackTrace ())
78+ assert .NotEmpty (t , err2 .StackTrace ())
79+ assert .NotEmpty (t , err3 .StackTrace ())
80+ }
5081
51- oErr := errors .New ("original error 2" )
52- err = Wrap (oErr )
82+ func TestFields (t * testing.T ) {
83+ err1 := New ("test" )
84+
85+ assert .Empty (t , err1 .Fields ())
5386
54- assert .Same (t , oErr , err .Unwrap ())
87+ err2 := err1 .WithField ("action" , "call" )
88+
89+ assert .NotSame (t , err1 , err2 )
90+ assert .Empty (t , err1 .Fields ())
91+ assert .Equal (t , err2 .Fields (), map [string ]any {"action" : "call" })
5592
56- oErr2 := errors .New ("original error 3" )
57- err = err .WithCause (oErr2 )
58- assert .Same (t , oErr2 , err .Unwrap ())
93+ err3 := err2 .WithFields (map [string ]any {"type" : "warning" })
94+
95+ assert .NotSame (t , err2 , err3 )
96+ assert .Equal (t , err2 .Fields (), map [string ]any {"action" : "call" })
97+ assert .Equal (t , err3 .Fields (), map [string ]any {"action" : "call" , "type" : "warning" })
98+
99+ err4 := err3 .WithFields (map [string ]any {"type" : "error" , "debug" : true , "line" : 15 })
100+
101+ assert .NotSame (t , err3 , err4 )
102+ assert .Equal (t , err3 .Fields (), map [string ]any {"action" : "call" , "type" : "warning" })
103+ assert .Equal (t , err4 .Fields (), map [string ]any {"action" : "call" , "type" : "error" , "debug" : true , "line" : 15 })
104+ }
105+
106+ func TestWithFieldsDropsFunctions (t * testing.T ) {
107+ err := New ("test" ).WithFields (map [string ]any {"key" : "value" , "func" : func () {}})
108+
109+ assert .Equal (t , err .Fields (), map [string ]any {"key" : "value" })
110+ }
111+
112+ func TestWithCause (t * testing.T ) {
113+ err1 := New ("test" )
114+ original := errors .New ("original error" )
115+
116+ err2 := err1 .WithCause (original )
117+
118+ assert .NotSame (t , err1 , err2 )
119+ assert .Same (t , err2 .Unwrap (), original )
59120}
60121
61122func TestErrorsIs (t * testing.T ) {
62- tests := []struct {
63- name string
64- err error
65- }{
66- {
67- name : "*errors.errorString" ,
68- err : errors .New ("dummy error" ),
69- },
70- {
71- name : "*DataError" ,
72- err : New ("dummy error" ),
73- },
74- }
75-
76- for _ , test := range tests {
77- t .Run (test .name , func (t * testing.T ) {
78- assert .ErrorIs (t , test .err , test .err )
79- assert .ErrorIs (t , Wrap (test .err ), test .err )
80- assert .ErrorIs (t , Wrap (test .err ).WithField ("action" , "call" ), test .err )
81- assert .ErrorIs (t , Wrap (test .err ).WithField ("action" , "call" ).WithField ("type" , "warning" ), test .err )
82- assert .ErrorIs (t , Wrap (test .err ).WithFields (map [string ]any {"type" : "warning" }), test .err )
83- })
84- }
123+ original := errors .New ("original error" )
124+ err1 := New ("original error" )
125+
126+ assert .NotErrorIs (t , err1 , original )
127+
128+ err2 := Wrap (original )
129+
130+ assert .ErrorIs (t , err2 , original )
131+
132+ err3 := err1 .WithCause (original )
133+
134+ assert .ErrorIs (t , err3 , original )
135+
136+ err4 := err2 .WithField ("action" , "call" )
137+
138+ assert .ErrorIs (t , err4 , original )
85139}
86140
87- func TestErrorsIsWithFields (t * testing.T ) {
88- assert .ErrorIs (t , New ("dummy error" ).WithField ("action" , "call" ), New ("dummy error" ))
89- assert .NotErrorIs (t , New ("dummy error" ), New ("dummy error" ).WithField ("action" , "call" ))
90- assert .NotErrorIs (t , New ("dummy error" ).WithField ("action" , "call" ), New ("dummy error" ).WithField ("action" , "send" ))
141+ func TestErrorsIsDataError (t * testing.T ) {
142+ err1 := New ("test" )
143+ err2 := New ("test2" )
144+ err3 := New ("test" ).WithFields (map [string ]any {"action" : "call" , "type" : "error" })
145+ err4 := New ("test" ).WithFields (map [string ]any {"type" : "warn" })
146+
147+ assert .NotErrorIs (t , err1 , err2 ) // different error
148+ assert .NotErrorIs (t , err1 , err3 ) // additional fields
149+ assert .NotErrorIs (t , err1 , err4 ) // additional fields
150+
151+ assert .NotErrorIs (t , err2 , err1 ) // different error
152+ assert .NotErrorIs (t , err2 , err3 ) // different error
153+ assert .NotErrorIs (t , err2 , err4 ) // different error
154+
155+ assert .ErrorIs (t , err3 , err1 ) // missing fields
156+ assert .NotErrorIs (t , err3 , err2 ) // different error
157+ assert .NotErrorIs (t , err3 , err4 ) // different fields
91158
92- err := New ( "dummy error" ). WithField ( "module" , "http" )
93- assert .ErrorIs (t , err . WithField ( "add" , false ), err )
94- assert .NotErrorIs (t , err , err . WithField ( "add" , false ))
159+ assert . ErrorIs ( t , err4 , err1 ) // missing fields
160+ assert .NotErrorIs (t , err4 , err2 ) // different error
161+ assert .NotErrorIs (t , err4 , err3 ) // different fields
95162}
0 commit comments