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

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)
}