1+ // +build go1.13
2+
3+ package errorx
4+
5+ import (
6+ "errors"
7+ "fmt"
8+ "io"
9+ "testing"
10+
11+ "github.com/stretchr/testify/require"
12+ )
13+
14+ func TestErrorUnwrap (t * testing.T ) {
15+ t .Run ("Trivial" , func (t * testing.T ) {
16+ err := testType .NewWithNoMessage ()
17+ unwrapped := errors .Unwrap (err )
18+ require .Nil (t , unwrapped )
19+ })
20+
21+ t .Run ("Wrap" , func (t * testing.T ) {
22+ err := testTypeBar1 .Wrap (testType .NewWithNoMessage (), "" )
23+ unwrapped := errors .Unwrap (err )
24+ require .Nil (t , unwrapped )
25+ })
26+
27+ t .Run ("WrapForeign" , func (t * testing.T ) {
28+ err := testTypeBar1 .Wrap (io .EOF , "" )
29+ unwrapped := errors .Unwrap (err )
30+ require .Nil (t , unwrapped )
31+ })
32+
33+ t .Run ("Decorate" , func (t * testing.T ) {
34+ err := Decorate (testType .NewWithNoMessage (), "" )
35+ unwrapped := errors .Unwrap (err )
36+ require .NotNil (t , unwrapped )
37+ require .True (t , IsOfType (unwrapped , testType ))
38+ require .True (t , Cast (unwrapped ).Type () == testType )
39+ })
40+
41+ t .Run ("DecorateForeign" , func (t * testing.T ) {
42+ err := Decorate (io .EOF , "" )
43+ unwrapped := errors .Unwrap (err )
44+ require .NotNil (t , unwrapped )
45+ require .True (t , errors .Is (unwrapped , io .EOF ))
46+ require .True (t , unwrapped == io .EOF )
47+ })
48+
49+ t .Run ("Nested" , func (t * testing.T ) {
50+ err := Decorate (Decorate (testType .NewWithNoMessage (), "" ), "" )
51+ unwrapped := errors .Unwrap (err )
52+ require .NotNil (t , unwrapped )
53+ unwrapped = errors .Unwrap (unwrapped )
54+ require .NotNil (t , unwrapped )
55+ require .True (t , IsOfType (unwrapped , testType ))
56+ })
57+
58+ t .Run ("NestedWrapped" , func (t * testing.T ) {
59+ err := Decorate (testTypeBar1 .Wrap (testType .NewWithNoMessage (), "" ), "" )
60+ unwrapped := errors .Unwrap (err )
61+ require .NotNil (t , unwrapped )
62+ require .True (t , IsOfType (unwrapped , testTypeBar1 ))
63+ unwrapped = errors .Unwrap (unwrapped )
64+ require .Nil (t , unwrapped )
65+ })
66+
67+ t .Run ("NestedForeign" , func (t * testing.T ) {
68+ err := Decorate (Decorate (io .EOF , "" ), "" )
69+ unwrapped := errors .Unwrap (err )
70+ require .NotNil (t , unwrapped )
71+ unwrapped = errors .Unwrap (unwrapped )
72+ require .NotNil (t , unwrapped )
73+ require .True (t , errors .Is (unwrapped , io .EOF ))
74+ })
75+ }
76+
77+ func TestErrorIs (t * testing.T ) {
78+ t .Run ("Trivial" , func (t * testing.T ) {
79+ err := testType .NewWithNoMessage ()
80+ require .True (t , errors .Is (err , testType .NewWithNoMessage ()))
81+ require .False (t , errors .Is (err , testTypeBar1 .NewWithNoMessage ()))
82+ })
83+
84+ t .Run ("Wrap" , func (t * testing.T ) {
85+ err := testTypeBar1 .Wrap (testType .NewWithNoMessage (), "" )
86+ require .False (t , errors .Is (err , testType .NewWithNoMessage ()))
87+ require .True (t , errors .Is (err , testTypeBar1 .NewWithNoMessage ()))
88+ })
89+
90+ t .Run ("Supertype" , func (t * testing.T ) {
91+ err := testSubtype0 .Wrap (testTypeBar1 .NewWithNoMessage (), "" )
92+ require .True (t , errors .Is (err , testType .NewWithNoMessage ()))
93+ require .True (t , errors .Is (err , testSubtype0 .NewWithNoMessage ()))
94+ require .False (t , errors .Is (err , testTypeBar1 .NewWithNoMessage ()))
95+ })
96+
97+ t .Run ("Decorate" , func (t * testing.T ) {
98+ err := Decorate (testType .NewWithNoMessage (), "" )
99+ require .True (t , errors .Is (err , testType .NewWithNoMessage ()))
100+ })
101+
102+ t .Run ("DecorateForeign" , func (t * testing.T ) {
103+ err := Decorate (io .EOF , "" )
104+ require .True (t , errors .Is (err , io .EOF ))
105+ })
106+ }
107+
108+ func TestErrorsAndErrorx (t * testing.T ) {
109+ t .Run ("DecoratedForeign" , func (t * testing.T ) {
110+ err := fmt .Errorf ("error test: %w" , testType .NewWithNoMessage ())
111+ require .True (t , errors .Is (err , testType .NewWithNoMessage ()))
112+ require .True (t , IsOfType (err , testType ))
113+ })
114+
115+ t .Run ("LayeredDecorate" , func (t * testing.T ) {
116+ err := Decorate (fmt .Errorf ("error test: %w" , testType .NewWithNoMessage ()), "test" )
117+ require .True (t , errors .Is (err , testType .NewWithNoMessage ()))
118+ require .True (t , IsOfType (err , testType ))
119+ })
120+
121+ t .Run ("LayeredDecorateAgain" , func (t * testing.T ) {
122+ err := fmt .Errorf ("error test: %w" , Decorate (io .EOF , "test" ))
123+ require .True (t , errors .Is (err , io .EOF ))
124+ })
125+
126+ t .Run ("Wrap" , func (t * testing.T ) {
127+ err := fmt .Errorf ("error test: %w" , testType .Wrap (io .EOF , "test" ))
128+ require .False (t , errors .Is (err , io .EOF ))
129+ require .True (t , errors .Is (err , testType .NewWithNoMessage ()))
130+ })
131+ }
0 commit comments