@@ -4,6 +4,7 @@ package errorx
44
55import (
66 "errors"
7+ "fmt"
78 "io"
89 "testing"
910
@@ -100,4 +101,48 @@ func TestErrorIs(t *testing.T) {
100101 err := Decorate (io .EOF ,"" )
101102 require .True (t , errors .Is (err , io .EOF ))
102103 })
104+ }
105+
106+ func TestErrorAs (t * testing.T ) {
107+ t .Run ("Trivial" , func (t * testing.T ) {
108+ err := fooReturnsError ()
109+ target := testType .NewWithNoMessage ()
110+ require .True (t , errors .As (err , & target ))
111+ require .EqualValues (t , "whoops" , target .Message ())
112+ output := fmt .Sprintf ("%+v" , target )
113+ require .Contains (t , output , "fooReturnsError" , output )
114+ })
115+
116+ // Current errors.As allows no customization in this behaviour; if go types are assignable, here we go
117+ t .Run ("NegativeBroken" , func (t * testing.T ) {
118+ err := fooReturnsError ()
119+ target := testTypeBar1 .NewWithNoMessage ()
120+ require .True (t , errors .As (err , & target ))
121+ require .EqualValues (t , "whoops" , target .Message ())
122+ require .True (t , IsOfType (target , testType ))
123+ require .False (t , IsOfType (target , testTypeBar1 ))
124+ })
125+
126+ t .Run ("Negative" , func (t * testing.T ) {
127+ err := io .EOF
128+ target := testTypeBar1 .NewWithNoMessage ()
129+ require .False (t , errors .As (err , & target ))
130+ })
131+
132+ t .Run ("DecorateForeign" , func (t * testing.T ) {
133+ err := Decorate (myErr ("test" ),"" )
134+ var target myErr
135+ require .True (t , errors .As (err , & target ))
136+ require .EqualValues (t , "test" , target .Error ())
137+ })
138+ }
139+
140+ func fooReturnsError () error {
141+ return testType .New ("whoops" )
142+ }
143+
144+ type myErr string
145+
146+ func (e myErr ) Error () string {
147+ return string (e )
103148}
0 commit comments