forked from vmihailenco/msgpack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathext_test.go
More file actions
116 lines (97 loc) · 2.18 KB
/
ext_test.go
File metadata and controls
116 lines (97 loc) · 2.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package msgpack_test
import (
"reflect"
"testing"
"github.com/gig/msgpack"
"github.com/gig/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)
}
}