1
// Copyright 2012 The Gorilla Authors. All rights reserved.
2
// Use of this source code is governed by a BSD-style
3
// license that can be found in the LICENSE file.
12
// All cases we want to cover, in a nutshell.
15
F02 *int `schema:"f2"`
16
F03 []int `schema:"f3"`
17
F04 []*int `schema:"f4"`
18
F05 *[]int `schema:"f5"`
19
F06 *[]*int `schema:"f6"`
23
F10 []S1 `schema:"f10"`
24
F11 []*S1 `schema:"f11"`
25
F12 *[]S1 `schema:"f12"`
26
F13 *[]*S1 `schema:"f13"`
30
F01 *[]*int `schema:"f1"`
33
func TestAll(t *testing.T) {
34
v := map[string][]string{
41
"f7.f1": {"71", "72"},
42
"f8.f8.f7.f1": {"81", "82"},
44
"f10.0.f10.0.f6": {"101", "102"},
45
"f10.0.f10.1.f6": {"103", "104"},
46
"f11.0.f11.0.f6": {"111", "112"},
47
"f11.0.f11.1.f6": {"113", "114"},
48
"f12.0.f12.0.f6": {"121", "122"},
49
"f12.0.f12.1.f6": {"123", "124"},
50
"f13.0.f13.0.f6": {"131", "132"},
51
"f13.0.f13.1.f6": {"133", "134"},
58
f101, f102, f103, f104 := 101, 102, 103, 104
59
f111, f112, f113, f114 := 111, 112, 113, 114
60
f121, f122, f123, f124 := 121, 122, 123, 124
61
f131, f132, f133, f134 := 131, 132, 133, 134
66
F04: []*int{&f41, &f42},
68
F06: &[]*int{&f61, &f62},
70
F01: &[]*int{&f71, &f72},
75
F01: &[]*int{&f81, &f82},
83
S1{F06: &[]*int{&f101, &f102}},
84
S1{F06: &[]*int{&f103, &f104}},
91
&S1{F06: &[]*int{&f111, &f112}},
92
&S1{F06: &[]*int{&f113, &f114}},
99
S1{F06: &[]*int{&f121, &f122}},
100
S1{F06: &[]*int{&f123, &f124}},
107
&S1{F06: &[]*int{&f131, &f132}},
108
&S1{F06: &[]*int{&f133, &f134}},
115
_ = NewDecoder().Decode(s, v)
117
vals := func(values []*int) []int {
118
r := make([]int, len(values))
119
for k, v := range values {
126
t.Errorf("f1: expected %v, got %v", e.F01, s.F01)
129
t.Errorf("f2: expected %v, got nil", *e.F02)
130
} else if *s.F02 != *e.F02 {
131
t.Errorf("f2: expected %v, got %v", *e.F02, *s.F02)
134
t.Errorf("f3: expected %v, got nil", e.F03)
135
} else if len(s.F03) != 2 || s.F03[0] != e.F03[0] || s.F03[1] != e.F03[1] {
136
t.Errorf("f3: expected %v, got %v", e.F03, s.F03)
139
t.Errorf("f4: expected %v, got nil", e.F04)
141
if len(s.F04) != 2 || *(s.F04)[0] != *(e.F04)[0] || *(s.F04)[1] != *(e.F04)[1] {
142
t.Errorf("f4: expected %v, got %v", vals(e.F04), vals(s.F04))
146
t.Errorf("f5: expected %v, got nil", e.F05)
148
sF05, eF05 := *s.F05, *e.F05
149
if len(sF05) != 2 || sF05[0] != eF05[0] || sF05[1] != eF05[1] {
150
t.Errorf("f5: expected %v, got %v", eF05, sF05)
154
t.Errorf("f6: expected %v, got nil", vals(*e.F06))
156
sF06, eF06 := *s.F06, *e.F06
157
if len(sF06) != 2 || *(sF06)[0] != *(eF06)[0] || *(sF06)[1] != *(eF06)[1] {
158
t.Errorf("f6: expected %v, got %v", vals(eF06), vals(sF06))
161
if s.F07.F01 == nil {
162
t.Errorf("f7.f1: expected %v, got nil", vals(*e.F07.F01))
164
sF07, eF07 := *s.F07.F01, *e.F07.F01
165
if len(sF07) != 2 || *(sF07)[0] != *(eF07)[0] || *(sF07)[1] != *(eF07)[1] {
166
t.Errorf("f7.f1: expected %v, got %v", vals(eF07), vals(sF07))
170
t.Errorf("f8: got nil")
171
} else if s.F08.F08 == nil {
172
t.Errorf("f8.f8: got nil")
173
} else if s.F08.F08.F07.F01 == nil {
174
t.Errorf("f8.f8.f7.f1: expected %v, got nil", vals(*e.F08.F08.F07.F01))
176
sF08, eF08 := *s.F08.F08.F07.F01, *e.F08.F08.F07.F01
177
if len(sF08) != 2 || *(sF08)[0] != *(eF08)[0] || *(sF08)[1] != *(eF08)[1] {
178
t.Errorf("f8.f8.f7.f1: expected %v, got %v", vals(eF08), vals(sF08))
182
t.Errorf("f9: expected %v, got %v", e.F09, s.F09)
185
t.Errorf("f10: got nil")
186
} else if len(s.F10) != 1 {
187
t.Errorf("f10: expected 1 element, got %v", s.F10)
189
if len(s.F10[0].F10) != 2 {
190
t.Errorf("f10.0.f10: expected 1 element, got %v", s.F10[0].F10)
192
sF10, eF10 := *s.F10[0].F10[0].F06, *e.F10[0].F10[0].F06
194
t.Errorf("f10.0.f10.0.f6: expected %v, got nil", vals(eF10))
196
if len(sF10) != 2 || *(sF10)[0] != *(eF10)[0] || *(sF10)[1] != *(eF10)[1] {
197
t.Errorf("f10.0.f10.0.f6: expected %v, got %v", vals(eF10), vals(sF10))
200
sF10, eF10 = *s.F10[0].F10[1].F06, *e.F10[0].F10[1].F06
202
t.Errorf("f10.0.f10.0.f6: expected %v, got nil", vals(eF10))
204
if len(sF10) != 2 || *(sF10)[0] != *(eF10)[0] || *(sF10)[1] != *(eF10)[1] {
205
t.Errorf("f10.0.f10.0.f6: expected %v, got %v", vals(eF10), vals(sF10))
211
t.Errorf("f11: got nil")
212
} else if len(s.F11) != 1 {
213
t.Errorf("f11: expected 1 element, got %v", s.F11)
215
if len(s.F11[0].F11) != 2 {
216
t.Errorf("f11.0.f11: expected 1 element, got %v", s.F11[0].F11)
218
sF11, eF11 := *s.F11[0].F11[0].F06, *e.F11[0].F11[0].F06
220
t.Errorf("f11.0.f11.0.f6: expected %v, got nil", vals(eF11))
222
if len(sF11) != 2 || *(sF11)[0] != *(eF11)[0] || *(sF11)[1] != *(eF11)[1] {
223
t.Errorf("f11.0.f11.0.f6: expected %v, got %v", vals(eF11), vals(sF11))
226
sF11, eF11 = *s.F11[0].F11[1].F06, *e.F11[0].F11[1].F06
228
t.Errorf("f11.0.f11.0.f6: expected %v, got nil", vals(eF11))
230
if len(sF11) != 2 || *(sF11)[0] != *(eF11)[0] || *(sF11)[1] != *(eF11)[1] {
231
t.Errorf("f11.0.f11.0.f6: expected %v, got %v", vals(eF11), vals(sF11))
237
t.Errorf("f12: got nil")
238
} else if len(*s.F12) != 1 {
239
t.Errorf("f12: expected 1 element, got %v", *s.F12)
241
sF12, eF12 := *(s.F12), *(e.F12)
242
if len(*sF12[0].F12) != 2 {
243
t.Errorf("f12.0.f12: expected 1 element, got %v", *sF12[0].F12)
245
sF122, eF122 := *(*sF12[0].F12)[0].F06, *(*eF12[0].F12)[0].F06
247
t.Errorf("f12.0.f12.0.f6: expected %v, got nil", vals(eF122))
249
if len(sF122) != 2 || *(sF122)[0] != *(eF122)[0] || *(sF122)[1] != *(eF122)[1] {
250
t.Errorf("f12.0.f12.0.f6: expected %v, got %v", vals(eF122), vals(sF122))
253
sF122, eF122 = *(*sF12[0].F12)[1].F06, *(*eF12[0].F12)[1].F06
255
t.Errorf("f12.0.f12.0.f6: expected %v, got nil", vals(eF122))
257
if len(sF122) != 2 || *(sF122)[0] != *(eF122)[0] || *(sF122)[1] != *(eF122)[1] {
258
t.Errorf("f12.0.f12.0.f6: expected %v, got %v", vals(eF122), vals(sF122))
264
t.Errorf("f13: got nil")
265
} else if len(*s.F13) != 1 {
266
t.Errorf("f13: expected 1 element, got %v", *s.F13)
268
sF13, eF13 := *(s.F13), *(e.F13)
269
if len(*sF13[0].F13) != 2 {
270
t.Errorf("f13.0.f13: expected 1 element, got %v", *sF13[0].F13)
272
sF132, eF132 := *(*sF13[0].F13)[0].F06, *(*eF13[0].F13)[0].F06
274
t.Errorf("f13.0.f13.0.f6: expected %v, got nil", vals(eF132))
276
if len(sF132) != 2 || *(sF132)[0] != *(eF132)[0] || *(sF132)[1] != *(eF132)[1] {
277
t.Errorf("f13.0.f13.0.f6: expected %v, got %v", vals(eF132), vals(sF132))
280
sF132, eF132 = *(*sF13[0].F13)[1].F06, *(*eF13[0].F13)[1].F06
282
t.Errorf("f13.0.f13.0.f6: expected %v, got nil", vals(eF132))
284
if len(sF132) != 2 || *(sF132)[0] != *(eF132)[0] || *(sF132)[1] != *(eF132)[1] {
285
t.Errorf("f13.0.f13.0.f6: expected %v, got %v", vals(eF132), vals(sF132))
292
// ----------------------------------------------------------------------------
311
func TestDefaultConverters(t *testing.T) {
312
v := map[string][]string{
345
_ = NewDecoder().Decode(s, v)
347
t.Errorf("F01: expected %v, got %v", e.F01, s.F01)
350
t.Errorf("F02: expected %v, got %v", e.F02, s.F02)
353
t.Errorf("F03: expected %v, got %v", e.F03, s.F03)
356
t.Errorf("F04: expected %v, got %v", e.F04, s.F04)
359
t.Errorf("F05: expected %v, got %v", e.F05, s.F05)
362
t.Errorf("F06: expected %v, got %v", e.F06, s.F06)
365
t.Errorf("F07: expected %v, got %v", e.F07, s.F07)
368
t.Errorf("F08: expected %v, got %v", e.F08, s.F08)
371
t.Errorf("F09: expected %v, got %v", e.F09, s.F09)
374
t.Errorf("F10: expected %v, got %v", e.F10, s.F10)
377
t.Errorf("F11: expected %v, got %v", e.F11, s.F11)
380
t.Errorf("F12: expected %v, got %v", e.F12, s.F12)
383
t.Errorf("F13: expected %v, got %v", e.F13, s.F13)
386
t.Errorf("F14: expected %v, got %v", e.F14, s.F14)
390
// ----------------------------------------------------------------------------
392
func TestInlineStruct(t *testing.T) {
399
v1 := map[string][]string{
402
v2 := map[string][]string{
405
decoder := NewDecoder()
406
_ = decoder.Decode(s1, v1)
408
t.Errorf("s1: expected %v, got %v", true, s1.F01)
410
_ = decoder.Decode(s2, v2)
412
t.Errorf("s2: expected %v, got %v", 42, s2.F01)
416
// ----------------------------------------------------------------------------
437
func TestSimpleExample(t *testing.T) {
438
data := map[string][]string{
446
"Bif.0.F99": {"A", "B", "C"},
460
F99: []string{"A", "B", "C"}},
465
_ = NewDecoder().Decode(s, data)
468
t.Errorf("F01: expected %v, got %v", e.F01, s.F01)
470
if s.F02.F01 != e.F02.F01 {
471
t.Errorf("F02.F01: expected %v, got %v", e.F02.F01, s.F02.F01)
473
if s.F02.F02 != e.F02.F02 {
474
t.Errorf("F02.F02: expected %v, got %v", e.F02.F02, s.F02.F02)
476
if s.F02.F03 != e.F02.F03 {
477
t.Errorf("F02.F03: expected %v, got %v", e.F02.F03, s.F02.F03)
479
if s.F02.F14 != e.F02.F14 {
480
t.Errorf("F02.F14: expected %v, got %v", e.F02.F14, s.F02.F14)
482
if s.F02.S05 != e.F02.S05 {
483
t.Errorf("F02.S05: expected %v, got %v", e.F02.S05, s.F02.S05)
485
if s.F02.Str != e.F02.Str {
486
t.Errorf("F02.Str: expected %v, got %v", e.F02.Str, s.F02.Str)
488
if len(s.Bif) != len(e.Bif) {
489
t.Errorf("Bif len: expected %d, got %d", len(e.Bif), len(s.Bif))
491
if len(s.Bif[0].F99) != len(e.Bif[0].F99) {
492
t.Errorf("Bif[0].F99 len: expected %d, got %d", len(e.Bif[0].F99), len(s.Bif[0].F99))
497
// ----------------------------------------------------------------------------
505
func TestConversionError(t *testing.T) {
506
data := map[string][]string{
512
e := NewDecoder().Decode(s, data)
516
t.Errorf("Expected 3 errors, got %v", m)