1+ package model
2+
3+ import (
4+ "bytes"
5+ "testing"
6+
7+ "github.com/stretchr/testify/assert"
8+ "github.com/stretchr/testify/require"
9+ )
10+
11+ func TestMsgpackEncodeDecode (t * testing.T ) {
12+ t .Run ("encode and decode struct" , func (t * testing.T ) {
13+ type TestStruct struct {
14+ Name string
15+ Age int
16+ Active bool
17+ Tags []string
18+ }
19+
20+ original := TestStruct {
21+ Name : "John Doe" ,
22+ Age : 30 ,
23+ Active : true ,
24+ Tags : []string {"developer" , "golang" },
25+ }
26+
27+ encoded , err := MsgpackEncode (original )
28+ require .NoError (t , err )
29+ assert .NotEmpty (t , encoded )
30+
31+ var decoded TestStruct
32+ err = MsgpackDecode (encoded , & decoded )
33+ require .NoError (t , err )
34+ assert .Equal (t , original , decoded )
35+ })
36+
37+ t .Run ("encode and decode map" , func (t * testing.T ) {
38+ original := map [string ]interface {}{
39+ "name" : "test" ,
40+ "value" : 123 ,
41+ "enabled" : true ,
42+ "items" : []int {1 , 2 , 3 },
43+ }
44+
45+ encoded , err := MsgpackEncode (original )
46+ require .NoError (t , err )
47+ assert .NotEmpty (t , encoded )
48+
49+ var decoded map [string ]interface {}
50+ err = MsgpackDecode (encoded , & decoded )
51+ require .NoError (t , err )
52+ assert .Equal (t , original ["name" ], decoded ["name" ])
53+ assert .Equal (t , original ["enabled" ], decoded ["enabled" ])
54+ })
55+
56+ t .Run ("encode and decode slice" , func (t * testing.T ) {
57+ original := []string {"apple" , "banana" , "cherry" }
58+
59+ encoded , err := MsgpackEncode (original )
60+ require .NoError (t , err )
61+ assert .NotEmpty (t , encoded )
62+
63+ var decoded []string
64+ err = MsgpackDecode (encoded , & decoded )
65+ require .NoError (t , err )
66+ assert .Equal (t , original , decoded )
67+ })
68+
69+ t .Run ("encode nil value" , func (t * testing.T ) {
70+ encoded , err := MsgpackEncode (nil )
71+ require .NoError (t , err )
72+ assert .NotEmpty (t , encoded )
73+
74+ var decoded interface {}
75+ err = MsgpackDecode (encoded , & decoded )
76+ require .NoError (t , err )
77+ assert .Nil (t , decoded )
78+ })
79+
80+ t .Run ("decode error with invalid data" , func (t * testing.T ) {
81+ var decoded string
82+ err := MsgpackDecode ([]byte {0xFF , 0xFF , 0xFF }, & decoded )
83+ assert .Error (t , err )
84+ })
85+ }
86+
87+ func TestMsgpackEncodeDecodeWriter (t * testing.T ) {
88+ t .Run ("encode and decode with writer/reader" , func (t * testing.T ) {
89+ type TestData struct {
90+ ID int
91+ Message string
92+ }
93+
94+ original := TestData {ID : 42 , Message : "hello world" }
95+
96+ var buf bytes.Buffer
97+ err := MsgpackEncodeWriter (& buf , original )
98+ require .NoError (t , err )
99+
100+ var decoded TestData
101+ err = MsgpackDecodeReader (& buf , & decoded )
102+ require .NoError (t , err )
103+ assert .Equal (t , original , decoded )
104+ })
105+
106+ t .Run ("multiple encode decode operations" , func (t * testing.T ) {
107+ var buf bytes.Buffer
108+
109+ // Write multiple values
110+ err := MsgpackEncodeWriter (& buf , "first" )
111+ require .NoError (t , err )
112+
113+ err = MsgpackEncodeWriter (& buf , 42 )
114+ require .NoError (t , err )
115+
116+ err = MsgpackEncodeWriter (& buf , true )
117+ require .NoError (t , err )
118+
119+ // Read them back
120+ var str string
121+ err = MsgpackDecodeReader (& buf , & str )
122+ require .NoError (t , err )
123+ assert .Equal (t , "first" , str )
124+
125+ var num int
126+ err = MsgpackDecodeReader (& buf , & num )
127+ require .NoError (t , err )
128+ assert .Equal (t , 42 , num )
129+
130+ var boolean bool
131+ err = MsgpackDecodeReader (& buf , & boolean )
132+ require .NoError (t , err )
133+ assert .True (t , boolean )
134+ })
135+ }
136+
137+ func BenchmarkMsgpackEncode (b * testing.B ) {
138+ type BenchData struct {
139+ ID int
140+ Name string
141+ Values []float64
142+ Metadata map [string ]string
143+ }
144+
145+ data := BenchData {
146+ ID : 12345 ,
147+ Name : "benchmark test" ,
148+ Values : []float64 {1.1 , 2.2 , 3.3 , 4.4 , 5.5 },
149+ Metadata : map [string ]string {
150+ "key1" : "value1" ,
151+ "key2" : "value2" ,
152+ },
153+ }
154+
155+ b .ResetTimer ()
156+ for i := 0 ; i < b .N ; i ++ {
157+ _ , _ = MsgpackEncode (data )
158+ }
159+ }
160+
161+ func BenchmarkMsgpackDecode (b * testing.B ) {
162+ type BenchData struct {
163+ ID int
164+ Name string
165+ Values []float64
166+ Metadata map [string ]string
167+ }
168+
169+ data := BenchData {
170+ ID : 12345 ,
171+ Name : "benchmark test" ,
172+ Values : []float64 {1.1 , 2.2 , 3.3 , 4.4 , 5.5 },
173+ Metadata : map [string ]string {
174+ "key1" : "value1" ,
175+ "key2" : "value2" ,
176+ },
177+ }
178+
179+ encoded , _ := MsgpackEncode (data )
180+
181+ b .ResetTimer ()
182+ for i := 0 ; i < b .N ; i ++ {
183+ var decoded BenchData
184+ _ = MsgpackDecode (encoded , & decoded )
185+ }
186+ }
0 commit comments