// Copyright 2025 The Go MCP SDK Authors. All rights reserved. // Use of this source code is governed by an MIT-style // license that can be found in the LICENSE file. package mcp import ( "strings" "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" ) func TestMarshalStructWithMap(t *testing.T) { type S struct { A int B string `json:"b,omitempty"` u bool M map[string]any `json:",omitempty"` } t.Run("basic", func(t *testing.T) { s := S{A: 1, B: "two", M: map[string]any{"!@#": true}} got, err := marshalStructWithMap(&s, "M") if err != nil { t.Fatal(err) } want := `{"A":1,"b":"two","!@#":true}` if g := string(got); g != want { t.Errorf("\ngot %s\nwant %s", g, want) } var un S if err := unmarshalStructWithMap(got, &un, "M"); err != nil { t.Fatal(err) } if diff := cmp.Diff(s, un, cmpopts.IgnoreUnexported(S{})); diff != "" { t.Errorf("mismatch (-want, +got):\n%s", diff) } }) t.Run("duplicate", func(t *testing.T) { s := S{A: 1, B: "two", M: map[string]any{"b": "dup"}} _, err := marshalStructWithMap(&s, "M") if err == nil || !strings.Contains(err.Error(), "duplicate") { t.Errorf("got %v, want error with 'duplicate'", err) } }) }