diff options
-rw-r--r-- | src/pkg/json/struct.go | 2 | ||||
-rw-r--r-- | src/pkg/json/struct_test.go | 31 |
2 files changed, 32 insertions, 1 deletions
diff --git a/src/pkg/json/struct.go b/src/pkg/json/struct.go index 3fcf00e89..d94988b64 100644 --- a/src/pkg/json/struct.go +++ b/src/pkg/json/struct.go @@ -154,7 +154,7 @@ func (b *structBuilder) Elem(i int) Builder { return &structBuilder{val: v.Elem(i)} } case *reflect.SliceValue: - if i > v.Cap() { + if i >= v.Cap() { n := v.Cap(); if n < 8 { n = 8 diff --git a/src/pkg/json/struct_test.go b/src/pkg/json/struct_test.go index 95a3eb2a4..15446961a 100644 --- a/src/pkg/json/struct_test.go +++ b/src/pkg/json/struct_test.go @@ -6,6 +6,7 @@ package json import ( "reflect"; + "strconv"; "testing"; ) @@ -101,3 +102,33 @@ func TestUnmarshal(t *testing.T) { check(t, reflect.DeepEqual(m.MapStruct, decodedMapStruct), "mapstruct", m.MapStruct); check(t, reflect.DeepEqual(m.MapPtrStruct, decodedMapPtrStruct), "mapptrstruct", m.MapPtrStruct); } + +type Issue147Text struct { + Text string; +} + +type Issue147 struct { + Test []Issue147Text; +} + +const issue147Input = `{"test": [{"text":"0"},{"text":"1"},{"text":"2"}, +{"text":"3"},{"text":"4"},{"text":"5"}, +{"text":"6"},{"text":"7"},{"text":"8"}, +{"text":"9"},{"text":"10"},{"text":"11"}, +{"text":"12"},{"text":"13"},{"text":"14"}, +{"text":"15"},{"text":"16"},{"text":"17"}, +{"text":"18"},{"text":"19"},{"text":"20"}, +{"text":"21"},{"text":"22"},{"text":"23"}, +{"text":"24"},{"text":"25"},{"text":"26"}, +{"text":"27"},{"text":"28"},{"text":"29"}]}` + +func TestIssue147(t *testing.T) { + var timeline Issue147; + Unmarshal(issue147Input, &timeline); + + for i, e := range timeline.Test { + if e.Text != strconv.Itoa(i) { + t.Errorf("index: %d got: %s want: %d", i, e.Text, i) + } + } +} |