package msgpack_test import ( "reflect" "testing" "github.com/vmihailenco/msgpack" "github.com/vmihailenco/msgpack/codes" ) func init() { msgpack.RegisterExt(9, (*ExtTest)(nil)) } func TestRegisterExtPanic(t *testing.T) { defer func() { r := recover() if r == nil { t.Fatalf("panic expected") } got := r.(error).Error() wanted := "msgpack: ext with id=9 is already registered" if got != wanted { t.Fatalf("got %q, wanted %q", got, wanted) } }() msgpack.RegisterExt(9, (*ExtTest)(nil)) } type ExtTest struct { S string } var _ msgpack.CustomEncoder = (*ExtTest)(nil) var _ msgpack.CustomDecoder = (*ExtTest)(nil) func (ext ExtTest) EncodeMsgpack(e *msgpack.Encoder) error { return e.EncodeString("hello " + ext.S) } func (ext *ExtTest) DecodeMsgpack(d *msgpack.Decoder) error { var err error ext.S, err = d.DecodeString() return err } func TestExt(t *testing.T) { for _, v := range []interface{}{ExtTest{"world"}, &ExtTest{"world"}} { b, err := msgpack.Marshal(v) if err != nil { t.Fatal(err) } var dst interface{} err = msgpack.Unmarshal(b, &dst) if err != nil { t.Fatal(err) } v, ok := dst.(*ExtTest) if !ok { t.Fatalf("got %#v, wanted ExtTest", dst) } wanted := "hello world" if v.S != wanted { t.Fatalf("got %q, wanted %q", v.S, wanted) } ext := new(ExtTest) err = msgpack.Unmarshal(b, ext) if err != nil { t.Fatal(err) } if ext.S != wanted { t.Fatalf("got %q, wanted %q", ext.S, wanted) } } } func TestUnknownExt(t *testing.T) { b := []byte{byte(codes.FixExt1), 1, 0} var dst interface{} err := msgpack.Unmarshal(b, &dst) if err == nil { t.Fatalf("got nil, wanted error") } got := err.Error() wanted := "msgpack: unregistered ext id=1" if got != wanted { t.Fatalf("got %q, wanted %q", got, wanted) } } func TestDecodeExtWithMap(t *testing.T) { type S struct { I int } msgpack.RegisterExt(2, S{}) b, err := msgpack.Marshal(&S{I: 42}) if err != nil { t.Fatal(err) } var got map[string]interface{} if err := msgpack.Unmarshal(b, &got); err != nil { t.Fatal(err) } wanted := map[string]interface{}{"I": int8(42)} if !reflect.DeepEqual(got, wanted) { t.Fatalf("got %#v, but wanted %#v", got, wanted) } }