10 func TestComposeDecodeHookFunc(t *testing.T) {
14 data interface{}) (interface{}, error) {
15 return data.(string) + "foo", nil
21 data interface{}) (interface{}, error) {
22 return data.(string) + "bar", nil
25 f := ComposeDecodeHookFunc(f1, f2)
27 result, err := DecodeHookExec(
28 f, reflect.TypeOf(""), reflect.TypeOf([]byte("")), "")
30 t.Fatalf("bad: %s", err)
32 if result.(string) != "foobar" {
33 t.Fatalf("bad: %#v", result)
37 func TestComposeDecodeHookFunc_err(t *testing.T) {
38 f1 := func(reflect.Kind, reflect.Kind, interface{}) (interface{}, error) {
39 return nil, errors.New("foo")
42 f2 := func(reflect.Kind, reflect.Kind, interface{}) (interface{}, error) {
46 f := ComposeDecodeHookFunc(f1, f2)
48 _, err := DecodeHookExec(
49 f, reflect.TypeOf(""), reflect.TypeOf([]byte("")), 42)
50 if err.Error() != "foo" {
51 t.Fatalf("bad: %s", err)
55 func TestComposeDecodeHookFunc_kinds(t *testing.T) {
56 var f2From reflect.Kind
61 data interface{}) (interface{}, error) {
68 data interface{}) (interface{}, error) {
73 f := ComposeDecodeHookFunc(f1, f2)
75 _, err := DecodeHookExec(
76 f, reflect.TypeOf(""), reflect.TypeOf([]byte("")), "")
78 t.Fatalf("bad: %s", err)
80 if f2From != reflect.Int {
81 t.Fatalf("bad: %#v", f2From)
85 func TestStringToSliceHookFunc(t *testing.T) {
86 f := StringToSliceHookFunc(",")
88 strType := reflect.TypeOf("")
89 sliceType := reflect.TypeOf([]byte(""))
96 {sliceType, sliceType, 42, 42, false},
97 {strType, strType, 42, 42, false},
102 []string{"foo", "bar", "baz"},
114 for i, tc := range cases {
115 actual, err := DecodeHookExec(f, tc.f, tc.t, tc.data)
116 if tc.err != (err != nil) {
117 t.Fatalf("case %d: expected err %#v", i, tc.err)
119 if !reflect.DeepEqual(actual, tc.result) {
121 "case %d: expected %#v, got %#v",
122 i, tc.result, actual)
127 func TestStringToTimeDurationHookFunc(t *testing.T) {
128 f := StringToTimeDurationHookFunc()
130 strType := reflect.TypeOf("")
131 timeType := reflect.TypeOf(time.Duration(5))
138 {strType, timeType, "5s", 5 * time.Second, false},
139 {strType, timeType, "5", time.Duration(0), true},
140 {strType, strType, "5", "5", false},
143 for i, tc := range cases {
144 actual, err := DecodeHookExec(f, tc.f, tc.t, tc.data)
145 if tc.err != (err != nil) {
146 t.Fatalf("case %d: expected err %#v", i, tc.err)
148 if !reflect.DeepEqual(actual, tc.result) {
150 "case %d: expected %#v, got %#v",
151 i, tc.result, actual)
156 func TestWeaklyTypedHook(t *testing.T) {
157 var f DecodeHookFunc = WeaklyTypedHook
159 boolType := reflect.TypeOf(true)
160 strType := reflect.TypeOf("")
161 sliceType := reflect.TypeOf([]byte(""))
186 reflect.TypeOf(float32(1)),
194 reflect.TypeOf(int(1)),
210 reflect.TypeOf(uint(1)),
218 for i, tc := range cases {
219 actual, err := DecodeHookExec(f, tc.f, tc.t, tc.data)
220 if tc.err != (err != nil) {
221 t.Fatalf("case %d: expected err %#v", i, tc.err)
223 if !reflect.DeepEqual(actual, tc.result) {
225 "case %d: expected %#v, got %#v",
226 i, tc.result, actual)