28 lines
1.0 KiB
Go
28 lines
1.0 KiB
Go
|
|
package jsonvalue
|
||
|
|
|
||
|
|
import (
|
||
|
|
"encoding/json"
|
||
|
|
"reflect"
|
||
|
|
"testing"
|
||
|
|
)
|
||
|
|
|
||
|
|
type trustedNamed string
|
||
|
|
|
||
|
|
func TestCloneTrustedPreservesTypesAndDetaches(t *testing.T) {
|
||
|
|
named := trustedNamed("value")
|
||
|
|
original := map[string]any{"": map[string]any{"number": json.Number("9007199254740993")}, "typed": []string{"original"}, "pointer": &named, "nilmap": map[string]any(nil), "nilslice": []string(nil), "empty": []any{}}
|
||
|
|
copy := CloneTrusted(original).(map[string]any)
|
||
|
|
if !reflect.DeepEqual(copy, original) {
|
||
|
|
t.Fatalf("clone = %#v", copy)
|
||
|
|
}
|
||
|
|
copy[""].(map[string]any)["number"] = json.Number("1")
|
||
|
|
copy["typed"].([]string)[0] = "changed"
|
||
|
|
*copy["pointer"].(*trustedNamed) = "changed"
|
||
|
|
if original[""].(map[string]any)["number"] != json.Number("9007199254740993") || original["typed"].([]string)[0] != "original" || named != "value" {
|
||
|
|
t.Fatal("clone shares mutable storage")
|
||
|
|
}
|
||
|
|
if copy["nilmap"].(map[string]any) != nil || copy["nilslice"].([]string) != nil || copy["empty"].([]any) == nil {
|
||
|
|
t.Fatal("nil/empty shape changed")
|
||
|
|
}
|
||
|
|
}
|