aboutsummaryrefslogtreecommitdiff
path: root/src/encoding/json/decode_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/encoding/json/decode_test.go')
-rw-r--r--src/encoding/json/decode_test.go54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/encoding/json/decode_test.go b/src/encoding/json/decode_test.go
index 5ac1022207..a62488d447 100644
--- a/src/encoding/json/decode_test.go
+++ b/src/encoding/json/decode_test.go
@@ -2569,3 +2569,57 @@ func TestUnmarshalMaxDepth(t *testing.T) {
}
}
}
+
+func TestUnmarshalMapPointerElem(t *testing.T) {
+ type S struct{ Unchanged, Changed int }
+ input := []byte(`{"S":{"Changed":5}}`)
+ want := S{1, 5}
+
+ // First, a map with struct pointer elements. The key-value pair exists,
+ // so reuse the existing value.
+ s := &S{1, 2}
+ ptrMap := map[string]*S{"S": s}
+ if err := Unmarshal(input, &ptrMap); err != nil {
+ t.Fatal(err)
+ }
+ if s != ptrMap["S"] {
+ t.Fatal("struct pointer element in map was completely replaced")
+ }
+ if got := *s; got != want {
+ t.Fatalf("want %#v, got %#v", want, got)
+ }
+
+ // Second, a map with struct elements. The key-value pair exists, but
+ // the value isn't addresable, so make a copy and use that.
+ s = &S{1, 2}
+ strMap := map[string]S{"S": *s}
+ if err := Unmarshal(input, &strMap); err != nil {
+ t.Fatal(err)
+ }
+ if *s == strMap["S"] {
+ t.Fatal("struct element in map wasn't copied")
+ }
+ if got := strMap["S"]; got != want {
+ t.Fatalf("want %#v, got %#v", want, got)
+ }
+
+ // Finally, check the cases where the key-value pair exists, but the
+ // value is zero.
+ want = S{0, 5}
+
+ ptrMap = map[string]*S{"S": nil}
+ if err := Unmarshal(input, &ptrMap); err != nil {
+ t.Fatal(err)
+ }
+ if got := *ptrMap["S"]; got != want {
+ t.Fatalf("want %#v, got %#v", want, got)
+ }
+
+ strMap = map[string]S{"S": {}}
+ if err := Unmarshal(input, &strMap); err != nil {
+ t.Fatal(err)
+ }
+ if got := strMap["S"]; got != want {
+ t.Fatalf("want %#v, got %#v", want, got)
+ }
+}