Assisted-by: GLM 5.3 Flash
This commit is contained in:
+112
@@ -494,3 +494,115 @@ field = "y"
|
||||
t.Errorf("Field = %q, want \"y\"", cfg.R.Field)
|
||||
}
|
||||
}
|
||||
|
||||
// --- embedded field symmetry -----------------------------------------------
|
||||
|
||||
type RoundTripBase struct {
|
||||
ID int `toml:"id"`
|
||||
Name string `toml:"name"`
|
||||
}
|
||||
|
||||
type RoundTripDerived struct {
|
||||
RoundTripBase
|
||||
X string `toml:"x"`
|
||||
}
|
||||
|
||||
func TestUnmarshalEmbeddedStructRoundTrip(t *testing.T) {
|
||||
orig := RoundTripDerived{ID: 1, Name: "b", X: "x"}
|
||||
out, err := Marshal(orig)
|
||||
if err != nil {
|
||||
t.Fatalf("marshal: %v", err)
|
||||
}
|
||||
var back RoundTripDerived
|
||||
if err := Unmarshal(out, &back); err != nil {
|
||||
t.Fatalf("unmarshal: %v", err)
|
||||
}
|
||||
if back != orig {
|
||||
t.Fatalf("round-trip mismatch:\nwas: %+v\nnow: %+v", orig, back)
|
||||
}
|
||||
}
|
||||
|
||||
type RoundTripPtrCfg struct {
|
||||
*RoundTripBase
|
||||
X string `toml:"x"`
|
||||
}
|
||||
|
||||
func TestUnmarshalEmbeddedPointerStruct(t *testing.T) {
|
||||
var cfg RoundTripPtrCfg
|
||||
if err := Unmarshal([]byte("id = 7\nname = \"n\"\nx = \"x\"\n"), &cfg); err != nil {
|
||||
t.Fatalf("unmarshal: %v", err)
|
||||
}
|
||||
if cfg.RoundTripBase == nil || cfg.ID != 7 || cfg.Name != "n" || cfg.X != "x" {
|
||||
t.Fatalf("decoded: %+v", cfg)
|
||||
}
|
||||
}
|
||||
|
||||
type RoundTripExtra map[string]int
|
||||
|
||||
type RoundTripMapCfg struct {
|
||||
RoundTripExtra
|
||||
X string `toml:"x"`
|
||||
}
|
||||
|
||||
func TestUnmarshalEmbeddedMap(t *testing.T) {
|
||||
var cfg RoundTripMapCfg
|
||||
if err := Unmarshal([]byte("alpha = 1\nx = \"x\"\n"), &cfg); err != nil {
|
||||
t.Fatalf("unmarshal: %v", err)
|
||||
}
|
||||
if cfg.RoundTripExtra["alpha"] != 1 || cfg.X != "x" {
|
||||
t.Fatalf("decoded: %+v", cfg)
|
||||
}
|
||||
|
||||
orig := RoundTripMapCfg{RoundTripExtra: RoundTripExtra{"a": 1}, X: "x"}
|
||||
out, err := Marshal(orig)
|
||||
if err != nil {
|
||||
t.Fatalf("marshal: %v", err)
|
||||
}
|
||||
var back RoundTripMapCfg
|
||||
if err := Unmarshal(out, &back); err != nil {
|
||||
t.Fatalf("unmarshal: %v", err)
|
||||
}
|
||||
if back.X != "x" || back.RoundTripExtra["a"] != 1 {
|
||||
t.Fatalf("round-trip mismatch: %+v", back)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUnmarshalEmbeddedNameClashShallowerWins(t *testing.T) {
|
||||
type Inner struct {
|
||||
Name string `toml:"name"`
|
||||
Deep string `toml:"deep"`
|
||||
}
|
||||
type Outer struct {
|
||||
Inner
|
||||
Name string `toml:"name"`
|
||||
}
|
||||
var v Outer
|
||||
if err := Unmarshal([]byte("name = \"outer\"\ndeep = \"d\"\n"), &v); err != nil {
|
||||
t.Fatalf("unmarshal: %v", err)
|
||||
}
|
||||
if v.Name != "outer" || v.Deep != "d" {
|
||||
t.Fatalf("decoded: %+v", v)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUnmarshalUnknownKeyWithoutEmbeddedMap(t *testing.T) {
|
||||
var cfg RoundTripDerived
|
||||
if err := Unmarshal([]byte("rogue = 1\n"), &cfg); err != nil {
|
||||
t.Fatalf("unmarshal: %v", err)
|
||||
}
|
||||
if cfg.ID != 0 || cfg.X != "" {
|
||||
t.Fatalf("decoded: %+v", cfg)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUnmarshalStrictEmbeddedMapStaysStrict(t *testing.T) {
|
||||
type Cfg struct {
|
||||
RoundTripExtra
|
||||
Name string `toml:"name"`
|
||||
}
|
||||
dec := NewDecoder().DisallowUnknownFields()
|
||||
err := dec.Decode([]byte("name = \"n\"\nrogue = 1\n"), &Cfg{})
|
||||
if err == nil || !strings.Contains(err.Error(), "unknown field") {
|
||||
t.Fatalf("expected unknown field error, got: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user