@@ -84,6 +84,94 @@ func TestComposeDecodeHookFunc_kinds(t *testing.T) {
8484 }
8585}
8686
87+ func TestOrComposeDecodeHookFunc (t * testing.T ) {
88+ f1 := func (
89+ f reflect.Kind ,
90+ t reflect.Kind ,
91+ data interface {}) (interface {}, error ) {
92+ return data .(string ) + "foo" , nil
93+ }
94+
95+ f2 := func (
96+ f reflect.Kind ,
97+ t reflect.Kind ,
98+ data interface {}) (interface {}, error ) {
99+ return data .(string ) + "bar" , nil
100+ }
101+
102+ f := OrComposeDecodeHookFunc (f1 , f2 )
103+
104+ result , err := DecodeHookExec (
105+ f , reflect .ValueOf ("" ), reflect .ValueOf ([]byte ("" )))
106+ if err != nil {
107+ t .Fatalf ("bad: %s" , err )
108+ }
109+ if result .(string ) != "foo" {
110+ t .Fatalf ("bad: %#v" , result )
111+ }
112+ }
113+
114+ func TestOrComposeDecodeHookFunc_correctValueIsLast (t * testing.T ) {
115+ f1 := func (
116+ f reflect.Kind ,
117+ t reflect.Kind ,
118+ data interface {}) (interface {}, error ) {
119+ return nil , errors .New ("f1 error" )
120+ }
121+
122+ f2 := func (
123+ f reflect.Kind ,
124+ t reflect.Kind ,
125+ data interface {}) (interface {}, error ) {
126+ return nil , errors .New ("f2 error" )
127+ }
128+
129+ f3 := func (
130+ f reflect.Kind ,
131+ t reflect.Kind ,
132+ data interface {}) (interface {}, error ) {
133+ return data .(string ) + "bar" , nil
134+ }
135+
136+ f := OrComposeDecodeHookFunc (f1 , f2 , f3 )
137+
138+ result , err := DecodeHookExec (
139+ f , reflect .ValueOf ("" ), reflect .ValueOf ([]byte ("" )))
140+ if err != nil {
141+ t .Fatalf ("bad: %s" , err )
142+ }
143+ if result .(string ) != "bar" {
144+ t .Fatalf ("bad: %#v" , result )
145+ }
146+ }
147+
148+ func TestOrComposeDecodeHookFunc_err (t * testing.T ) {
149+ f1 := func (
150+ f reflect.Kind ,
151+ t reflect.Kind ,
152+ data interface {}) (interface {}, error ) {
153+ return nil , errors .New ("f1 error" )
154+ }
155+
156+ f2 := func (
157+ f reflect.Kind ,
158+ t reflect.Kind ,
159+ data interface {}) (interface {}, error ) {
160+ return nil , errors .New ("f2 error" )
161+ }
162+
163+ f := OrComposeDecodeHookFunc (f1 , f2 )
164+
165+ _ , err := DecodeHookExec (
166+ f , reflect .ValueOf ("" ), reflect .ValueOf ([]byte ("" )))
167+ if err == nil {
168+ t .Fatalf ("bad: should return an error" )
169+ }
170+ if err .Error () != "f1 error\n f2 error\n " {
171+ t .Fatalf ("bad: %s" , err )
172+ }
173+ }
174+
87175func TestComposeDecodeHookFunc_safe_nofuncs (t * testing.T ) {
88176 f := ComposeDecodeHookFunc ()
89177 type myStruct2 struct {
0 commit comments