// Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package json import ( "testing" ) type basicLatin2xTag struct { V string `json:"$%-/"` } type basicLatin3xTag struct { V string `json:"0123456789"` } type basicLatin4xTag struct { V string `json:"ABCDEFGHIJKLMO"` } type basicLatin5xTag struct { V string `json:"PQRSTUVWXYZ_"` } type basicLatin6xTag struct { V string `json:"abcdefghijklmno"` } type basicLatin7xTag struct { V string `json:"pqrstuvwxyz"` } type miscPlaneTag struct { V string `json:"色は匂へど"` } type percentSlashTag struct { V string `json:"text/html%"` // https://golang.org/issue/2718 } type punctuationTag struct { V string `json:"!#$%&()*+-./:;<=>?@[]^_{|}~ "` // https://golang.org/issue/3546 } type dashTag struct { V string `json:"-,"` } type emptyTag struct { W string } type misnamedTag struct { X string `jsom:"Misnamed"` } type badFormatTag struct { Y string `:"BadFormat"` } type badCodeTag struct { Z string `json:" !\"#&'()*+,."` } type spaceTag struct { Q string `json:"With space"` } type unicodeTag struct { W string `json:"Ελλάδα"` } func TestStructTagObjectKey(t *testing.T) { tests := []struct { CaseName raw any value string key string }{ {Name(""), basicLatin2xTag{"2x"}, "2x", "$%-/"}, {Name(""), basicLatin3xTag{"3x"}, "3x", "0123456789"}, {Name(""), basicLatin4xTag{"4x"}, "4x", "ABCDEFGHIJKLMO"}, {Name(""), basicLatin5xTag{"5x"}, "5x", "PQRSTUVWXYZ_"}, {Name(""), basicLatin6xTag{"6x"}, "6x", "abcdefghijklmno"}, {Name(""), basicLatin7xTag{"7x"}, "7x", "pqrstuvwxyz"}, {Name(""), miscPlaneTag{"いろはにほへと"}, "いろはにほへと", "色は匂へど"}, {Name(""), dashTag{"foo"}, "foo", "-"}, {Name(""), emptyTag{"Pour Moi"}, "Pour Moi", "W"}, {Name(""), misnamedTag{"Animal Kingdom"}, "Animal Kingdom", "X"}, {Name(""), badFormatTag{"Orfevre"}, "Orfevre", "Y"}, {Name(""), badCodeTag{"Reliable Man"}, "Reliable Man", "Z"}, {Name(""), percentSlashTag{"brut"}, "brut", "text/html%"}, {Name(""), punctuationTag{"Union Rags"}, "Union Rags", "!#$%&()*+-./:;<=>?@[]^_{|}~ "}, {Name(""), spaceTag{"Perreddu"}, "Perreddu", "With space"}, {Name(""), unicodeTag{"Loukanikos"}, "Loukanikos", "Ελλάδα"}, } for _, tt := range tests { t.Run(tt.Name, func(t *testing.T) { b, err := Marshal(tt.raw) if err != nil { t.Fatalf("%s: Marshal error: %v", tt.Where, err) } var f any err = Unmarshal(b, &f) if err != nil { t.Fatalf("%s: Unmarshal error: %v", tt.Where, err) } for k, v := range f.(map[string]any) { if k == tt.key { if s, ok := v.(string); !ok || s != tt.value { t.Fatalf("%s: Unmarshal(%#q) value:\n\tgot: %q\n\twant: %q", tt.Where, b, s, tt.value) } } else { t.Fatalf("%s: Unmarshal(%#q): unexpected key: %q", tt.Where, b, k) } } }) } }