Decode: fix reuse of slice for array tables (#934)
When decoding into a non-empty slice, it needs to be emptied so that only the tables contained in the document are present in the resulting value. Arrays are not impacted because their unmarshal offset is tracked separately. Fixes #931
This commit is contained in:
@@ -2823,6 +2823,76 @@ blah.a = "def"`)
|
||||
require.Equal(t, "def", cfg.A)
|
||||
}
|
||||
|
||||
func TestIssue931(t *testing.T) {
|
||||
type item struct {
|
||||
Name string
|
||||
}
|
||||
|
||||
type items struct {
|
||||
Slice []item
|
||||
}
|
||||
|
||||
its := items{[]item{{"a"}, {"b"}}}
|
||||
|
||||
b := []byte(`
|
||||
[[Slice]]
|
||||
Name = 'c'
|
||||
|
||||
[[Slice]]
|
||||
Name = 'd'
|
||||
`)
|
||||
|
||||
toml.Unmarshal(b, &its)
|
||||
require.Equal(t, items{[]item{{"c"}, {"d"}}}, its)
|
||||
}
|
||||
|
||||
func TestIssue931Interface(t *testing.T) {
|
||||
type items struct {
|
||||
Slice interface{}
|
||||
}
|
||||
|
||||
type item = map[string]interface{}
|
||||
|
||||
its := items{[]interface{}{item{"Name": "a"}, item{"Name": "b"}}}
|
||||
|
||||
b := []byte(`
|
||||
[[Slice]]
|
||||
Name = 'c'
|
||||
|
||||
[[Slice]]
|
||||
Name = 'd'
|
||||
`)
|
||||
|
||||
toml.Unmarshal(b, &its)
|
||||
require.Equal(t, items{[]interface{}{item{"Name": "c"}, item{"Name": "d"}}}, its)
|
||||
}
|
||||
|
||||
func TestIssue931SliceInterface(t *testing.T) {
|
||||
type items struct {
|
||||
Slice []interface{}
|
||||
}
|
||||
|
||||
type item = map[string]interface{}
|
||||
|
||||
its := items{
|
||||
[]interface{}{
|
||||
item{"Name": "a"},
|
||||
item{"Name": "b"},
|
||||
},
|
||||
}
|
||||
|
||||
b := []byte(`
|
||||
[[Slice]]
|
||||
Name = 'c'
|
||||
|
||||
[[Slice]]
|
||||
Name = 'd'
|
||||
`)
|
||||
|
||||
toml.Unmarshal(b, &its)
|
||||
require.Equal(t, items{[]interface{}{item{"Name": "c"}, item{"Name": "d"}}}, its)
|
||||
}
|
||||
|
||||
func TestUnmarshalDecodeErrors(t *testing.T) {
|
||||
examples := []struct {
|
||||
desc string
|
||||
|
||||
Reference in New Issue
Block a user