Skip to content

Commit f22d3dc

Browse files
joeybloggsjoeybloggs
authored andcommitted
Add float32 tests + some index fixes
1 parent 925dbb6 commit f22d3dc

File tree

2 files changed

+175
-7
lines changed

2 files changed

+175
-7
lines changed

form.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -320,12 +320,12 @@ func (d *formDecoder) setFieldByType(current reflect.Value, namespace string, id
320320
return
321321
}
322322

323-
v.SetString(arr[0])
323+
v.SetString(arr[idx])
324324
set = true
325325

326326
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
327327

328-
if !ok || len(arr[0]) == 0 {
328+
if !ok || len(arr[idx]) == 0 {
329329
return
330330
}
331331

@@ -339,7 +339,7 @@ func (d *formDecoder) setFieldByType(current reflect.Value, namespace string, id
339339
v.SetUint(u64)
340340
set = true
341341
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
342-
if !ok || len(arr[0]) == 0 {
342+
if !ok || len(arr[idx]) == 0 {
343343
return
344344
}
345345

@@ -355,13 +355,13 @@ func (d *formDecoder) setFieldByType(current reflect.Value, namespace string, id
355355

356356
case reflect.Float32, reflect.Float64:
357357

358-
if !ok || len(arr[0]) == 0 {
358+
if !ok || len(arr[idx]) == 0 {
359359
return
360360
}
361361

362362
var f float64
363363

364-
if f, err = strconv.ParseFloat(arr[0], 64); err != nil || v.OverflowFloat(f) {
364+
if f, err = strconv.ParseFloat(arr[idx], 64); err != nil || v.OverflowFloat(f) {
365365
d.setError(namespace, fmt.Errorf("Invalid Float Value '%s', Type '%v'", arr[0], v.Type()))
366366
return
367367
}
@@ -371,13 +371,13 @@ func (d *formDecoder) setFieldByType(current reflect.Value, namespace string, id
371371

372372
case reflect.Bool:
373373

374-
if !ok || len(arr[0]) == 0 {
374+
if !ok || len(arr[idx]) == 0 {
375375
return
376376
}
377377

378378
var b bool
379379

380-
if b, err = strconv.ParseBool(arr[0]); err != nil {
380+
if b, err = strconv.ParseBool(arr[idx]); err != nil {
381381
d.setError(namespace, fmt.Errorf("Invalid Boolean Value '%s', Type '%v'", arr[idx], v.Type()))
382382
return
383383
}

form_test.go

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,174 @@ func TestUint(t *testing.T) {
235235
Equal(t, test.NoURLValue, uint(0))
236236
}
237237

238+
func TestString(t *testing.T) {
239+
240+
type TestString struct {
241+
String string
242+
StringPtr *string
243+
StringArray []string
244+
StringPtrArray []*string
245+
StringArrayArray [][]string
246+
StringPtrArrayArray [][]*string
247+
StringMap map[string]string
248+
StringPtrMap map[*string]*string
249+
NoURLValue string
250+
}
251+
252+
values := url.Values{
253+
"String": []string{"3"},
254+
"StringPtr": []string{"3"},
255+
"StringArray": []string{"1", "2", "3"},
256+
"StringPtrArray[0]": []string{"1"},
257+
"StringPtrArray[2]": []string{"3"},
258+
"StringArrayArray[0][0]": []string{"1"},
259+
"StringArrayArray[0][2]": []string{"3"},
260+
"StringArrayArray[2][0]": []string{"1"},
261+
"StringPtrArrayArray[0][0]": []string{"1"},
262+
"StringPtrArrayArray[0][2]": []string{"3"},
263+
"StringPtrArrayArray[2][0]": []string{"1"},
264+
"StringMap[1]": []string{"3"},
265+
"StringPtrMap[1]": []string{"3"},
266+
}
267+
268+
var test TestString
269+
270+
test.StringArray = make([]string, 4)
271+
272+
decoder := NewDecoder()
273+
errs := decoder.Decode(&test, values)
274+
Equal(t, errs, nil)
275+
276+
Equal(t, test.String, "3")
277+
278+
Equal(t, *test.StringPtr, "3")
279+
280+
Equal(t, len(test.StringArray), 4)
281+
Equal(t, test.StringArray[0], "1")
282+
Equal(t, test.StringArray[1], "2")
283+
Equal(t, test.StringArray[2], "3")
284+
Equal(t, test.StringArray[3], "")
285+
286+
Equal(t, len(test.StringPtrArray), 3)
287+
Equal(t, *test.StringPtrArray[0], "1")
288+
Equal(t, test.StringPtrArray[1], nil)
289+
Equal(t, *test.StringPtrArray[2], "3")
290+
291+
Equal(t, len(test.StringArrayArray), 3)
292+
Equal(t, len(test.StringArrayArray[0]), 3)
293+
Equal(t, len(test.StringArrayArray[1]), 0)
294+
Equal(t, len(test.StringArrayArray[2]), 1)
295+
Equal(t, test.StringArrayArray[0][0], "1")
296+
Equal(t, test.StringArrayArray[0][1], "")
297+
Equal(t, test.StringArrayArray[0][2], "3")
298+
Equal(t, test.StringArrayArray[2][0], "1")
299+
300+
Equal(t, len(test.StringPtrArrayArray), 3)
301+
Equal(t, len(test.StringPtrArrayArray[0]), 3)
302+
Equal(t, len(test.StringPtrArrayArray[1]), 0)
303+
Equal(t, len(test.StringPtrArrayArray[2]), 1)
304+
Equal(t, *test.StringPtrArrayArray[0][0], "1")
305+
Equal(t, test.StringPtrArrayArray[0][1], nil)
306+
Equal(t, *test.StringPtrArrayArray[0][2], "3")
307+
Equal(t, *test.StringPtrArrayArray[2][0], "1")
308+
309+
Equal(t, len(test.StringMap), 1)
310+
Equal(t, len(test.StringPtrMap), 1)
311+
312+
v, ok := test.StringMap["1"]
313+
Equal(t, ok, true)
314+
Equal(t, v, "3")
315+
316+
Equal(t, test.NoURLValue, "")
317+
}
318+
319+
func TestFloat(t *testing.T) {
320+
321+
type TestFloat struct {
322+
Float32 float32
323+
Float32Ptr *float32
324+
Float64 float64
325+
Float64Ptr *float64
326+
Float32Array []float32
327+
Float32PtrArray []*float32
328+
Float32ArrayArray [][]float32
329+
Float32PtrArrayArray [][]*float32
330+
Float32Map map[float32]float32
331+
Float32PtrMap map[*float32]*float32
332+
NoURLValue float32
333+
}
334+
335+
values := url.Values{
336+
"Float32": []string{"3.3"},
337+
"Float32Ptr": []string{"3.3"},
338+
"Float64": []string{"3.3"},
339+
"Float64Ptr": []string{"3.3"},
340+
"Float32Array": []string{"1.1", "2.2", "3.3"},
341+
"Float32PtrArray[0]": []string{"1.1"},
342+
"Float32PtrArray[2]": []string{"3.3"},
343+
"Float32ArrayArray[0][0]": []string{"1.1"},
344+
"Float32ArrayArray[0][2]": []string{"3.3"},
345+
"Float32ArrayArray[2][0]": []string{"1.1"},
346+
"Float32PtrArrayArray[0][0]": []string{"1.1"},
347+
"Float32PtrArrayArray[0][2]": []string{"3.3"},
348+
"Float32PtrArrayArray[2][0]": []string{"1.1"},
349+
"Float32Map[1.1]": []string{"3.3"},
350+
"Float32PtrMap[1.1]": []string{"3.3"},
351+
}
352+
353+
var test TestFloat
354+
355+
test.Float32Array = make([]float32, 4)
356+
357+
decoder := NewDecoder()
358+
errs := decoder.Decode(&test, values)
359+
Equal(t, errs, nil)
360+
361+
Equal(t, test.Float32, float32(3.3))
362+
Equal(t, test.Float64, float64(3.3))
363+
364+
Equal(t, *test.Float32Ptr, float32(3.3))
365+
Equal(t, *test.Float64Ptr, float64(3.3))
366+
367+
Equal(t, len(test.Float32Array), 4)
368+
Equal(t, test.Float32Array[0], float32(1.1))
369+
Equal(t, test.Float32Array[1], float32(2.2))
370+
Equal(t, test.Float32Array[2], float32(3.3))
371+
Equal(t, test.Float32Array[3], float32(0.0))
372+
373+
Equal(t, len(test.Float32PtrArray), 3)
374+
Equal(t, *test.Float32PtrArray[0], float32(1.1))
375+
Equal(t, test.Float32PtrArray[1], nil)
376+
Equal(t, *test.Float32PtrArray[2], float32(3.3))
377+
378+
Equal(t, len(test.Float32ArrayArray), 3)
379+
Equal(t, len(test.Float32ArrayArray[0]), 3)
380+
Equal(t, len(test.Float32ArrayArray[1]), 0)
381+
Equal(t, len(test.Float32ArrayArray[2]), 1)
382+
Equal(t, test.Float32ArrayArray[0][0], float32(1.1))
383+
Equal(t, test.Float32ArrayArray[0][1], float32(0.0))
384+
Equal(t, test.Float32ArrayArray[0][2], float32(3.3))
385+
Equal(t, test.Float32ArrayArray[2][0], float32(1.1))
386+
387+
Equal(t, len(test.Float32PtrArrayArray), 3)
388+
Equal(t, len(test.Float32PtrArrayArray[0]), 3)
389+
Equal(t, len(test.Float32PtrArrayArray[1]), 0)
390+
Equal(t, len(test.Float32PtrArrayArray[2]), 1)
391+
Equal(t, *test.Float32PtrArrayArray[0][0], float32(1.1))
392+
Equal(t, test.Float32PtrArrayArray[0][1], nil)
393+
Equal(t, *test.Float32PtrArrayArray[0][2], float32(3.3))
394+
Equal(t, *test.Float32PtrArrayArray[2][0], float32(1.1))
395+
396+
Equal(t, len(test.Float32Map), 1)
397+
Equal(t, len(test.Float32PtrMap), 1)
398+
399+
v, ok := test.Float32Map[float32(1.1)]
400+
Equal(t, ok, true)
401+
Equal(t, v, float32(3.3))
402+
403+
Equal(t, test.NoURLValue, float32(0.0))
404+
}
405+
238406
// func TestString(t *testing.T) {
239407

240408
// type stringStruct struct {

0 commit comments

Comments
 (0)