You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
3.0 KiB
Go
130 lines
3.0 KiB
Go
package codec
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestJSONCodec(t *testing.T) {
|
|
codec := NewJSONCodec()
|
|
|
|
// 测试名称
|
|
assert.Equal(t, "json", codec.Name(), "Expected name to be 'json'")
|
|
|
|
// 测试编码
|
|
type TestStruct struct {
|
|
Name string `json:"name"`
|
|
Value int `json:"value"`
|
|
}
|
|
|
|
data := TestStruct{
|
|
Name: "test",
|
|
Value: 42,
|
|
}
|
|
|
|
encoded, err := codec.Encode(data)
|
|
require.NoError(t, err, "Expected no error when encoding")
|
|
assert.NotEmpty(t, encoded, "Expected encoded data to be non-empty")
|
|
|
|
// 测试解码
|
|
var decoded TestStruct
|
|
err = codec.Decode(encoded, &decoded)
|
|
require.NoError(t, err, "Expected no error when decoding")
|
|
assert.Equal(t, data.Name, decoded.Name, "Expected name to match")
|
|
assert.Equal(t, data.Value, decoded.Value, "Expected value to match")
|
|
}
|
|
|
|
func TestJSONCodecEncodePrimitives(t *testing.T) {
|
|
codec := NewJSONCodec()
|
|
|
|
// 测试编码字符串
|
|
encoded, err := codec.Encode("hello")
|
|
require.NoError(t, err)
|
|
assert.Equal(t, `"hello"`, string(encoded))
|
|
|
|
// 测试编码数字
|
|
encoded, err = codec.Encode(42)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "42", string(encoded))
|
|
|
|
// 测试编码布尔值
|
|
encoded, err = codec.Encode(true)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "true", string(encoded))
|
|
}
|
|
|
|
func TestJSONCodecDecodePrimitives(t *testing.T) {
|
|
codec := NewJSONCodec()
|
|
|
|
// 测试解码字符串
|
|
var str string
|
|
err := codec.Decode([]byte(`"hello"`), &str)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "hello", str)
|
|
|
|
// 测试解码数字
|
|
var num int
|
|
err = codec.Decode([]byte("42"), &num)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, 42, num)
|
|
|
|
// 测试解码布尔值
|
|
var b bool
|
|
err = codec.Decode([]byte("true"), &b)
|
|
require.NoError(t, err)
|
|
assert.True(t, b)
|
|
}
|
|
|
|
func TestJSONCodecInvalidJSON(t *testing.T) {
|
|
codec := NewJSONCodec()
|
|
|
|
// 测试无效的JSON
|
|
var result interface{}
|
|
err := codec.Decode([]byte("invalid json"), &result)
|
|
assert.Error(t, err, "Expected error for invalid JSON")
|
|
}
|
|
|
|
func TestJSONCodecEncodeNil(t *testing.T) {
|
|
codec := NewJSONCodec()
|
|
|
|
// 测试编码nil
|
|
encoded, err := codec.Encode(nil)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "null", string(encoded))
|
|
}
|
|
|
|
func TestJSONCodecComplexStruct(t *testing.T) {
|
|
codec := NewJSONCodec()
|
|
|
|
type ComplexStruct struct {
|
|
Name string `json:"name"`
|
|
Age int `json:"age"`
|
|
Tags []string `json:"tags"`
|
|
Metadata map[string]string `json:"metadata"`
|
|
}
|
|
|
|
data := ComplexStruct{
|
|
Name: "John",
|
|
Age: 30,
|
|
Tags: []string{"tag1", "tag2"},
|
|
Metadata: map[string]string{
|
|
"key1": "value1",
|
|
"key2": "value2",
|
|
},
|
|
}
|
|
|
|
encoded, err := codec.Encode(data)
|
|
require.NoError(t, err)
|
|
|
|
var decoded ComplexStruct
|
|
err = codec.Decode(encoded, &decoded)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, data.Name, decoded.Name)
|
|
assert.Equal(t, data.Age, decoded.Age)
|
|
assert.Equal(t, data.Tags, decoded.Tags)
|
|
assert.Equal(t, data.Metadata, decoded.Metadata)
|
|
}
|
|
|