mirror of
https://github.com/duke-git/lancet.git
synced 2025-10-05 15:36:52 +08:00
316 lines
5.7 KiB
Go
316 lines
5.7 KiB
Go
package structs
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/duke-git/lancet/v2/internal"
|
|
)
|
|
|
|
func TestField_Tag(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
assert := internal.NewAssert(t, "TestField_Tag")
|
|
|
|
type Parent struct {
|
|
Name string `json:"name,omitempty"`
|
|
}
|
|
p1 := &Parent{"111"}
|
|
|
|
s := New(p1)
|
|
n, _ := s.Field("Name")
|
|
tag := n.Tag()
|
|
|
|
assert.Equal("name", tag.Name)
|
|
assert.Equal(true, tag.HasOption("omitempty"))
|
|
}
|
|
|
|
func TestField_Value(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
assert := internal.NewAssert(t, "TestField_Value")
|
|
|
|
type Parent struct {
|
|
Name string `json:"name,omitempty"`
|
|
}
|
|
p1 := &Parent{"111"}
|
|
|
|
s := New(p1)
|
|
n, _ := s.Field("Name")
|
|
|
|
assert.Equal("111", n.Value())
|
|
}
|
|
|
|
func TestField_IsEmbedded(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
assert := internal.NewAssert(t, "TestField_IsEmbedded")
|
|
|
|
type Parent struct {
|
|
Name string
|
|
}
|
|
type Child struct {
|
|
Parent
|
|
Age int
|
|
}
|
|
c1 := &Child{}
|
|
c1.Name = "111"
|
|
c1.Age = 11
|
|
|
|
s := New(c1)
|
|
n, _ := s.Field("Name")
|
|
a, _ := s.Field("Age")
|
|
|
|
assert.Equal(true, n.IsEmbedded())
|
|
assert.Equal(false, a.IsEmbedded())
|
|
}
|
|
|
|
func TestField_IsExported(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
assert := internal.NewAssert(t, "TestField_IsEmbedded")
|
|
|
|
type Parent struct {
|
|
Name string
|
|
age int
|
|
}
|
|
p1 := &Parent{Name: "11", age: 11}
|
|
s := New(p1)
|
|
n, _ := s.Field("Name")
|
|
a, _ := s.Field("age")
|
|
|
|
assert.Equal(true, n.IsExported())
|
|
assert.Equal(false, a.IsExported())
|
|
}
|
|
|
|
func TestField_IsZero(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
assert := internal.NewAssert(t, "TestField_IsZero")
|
|
|
|
type Parent struct {
|
|
Name string
|
|
Age int
|
|
}
|
|
p1 := &Parent{Age: 11}
|
|
s := New(p1)
|
|
n, _ := s.Field("Name")
|
|
a, _ := s.Field("Age")
|
|
|
|
assert.Equal(true, n.IsZero())
|
|
assert.Equal(false, a.IsZero())
|
|
}
|
|
|
|
func TestField_Name(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
assert := internal.NewAssert(t, "TestField_Name")
|
|
|
|
type Parent struct {
|
|
Name string
|
|
Age int
|
|
}
|
|
p1 := &Parent{Age: 11}
|
|
s := New(p1)
|
|
n, _ := s.Field("Name")
|
|
a, _ := s.Field("Age")
|
|
|
|
assert.Equal("Name", n.Name())
|
|
assert.Equal("Age", a.Name())
|
|
}
|
|
|
|
func TestField_Kind(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
assert := internal.NewAssert(t, "TestField_Kind")
|
|
|
|
type Parent struct {
|
|
Name string
|
|
Age int
|
|
}
|
|
p1 := &Parent{Age: 11}
|
|
s := New(p1)
|
|
n, _ := s.Field("Name")
|
|
a, _ := s.Field("Age")
|
|
|
|
assert.Equal(reflect.String, n.Kind())
|
|
assert.Equal(reflect.Int, a.Kind())
|
|
}
|
|
|
|
func TestField_IsSlice(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
assert := internal.NewAssert(t, "TestField_IsSlice")
|
|
|
|
type Parent struct {
|
|
Name string
|
|
arr []int
|
|
}
|
|
|
|
p1 := &Parent{arr: []int{1, 2, 3}}
|
|
s := New(p1)
|
|
a, _ := s.Field("arr")
|
|
|
|
assert.Equal(true, a.IsSlice())
|
|
}
|
|
|
|
func TestField_IsTargetType(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
assert := internal.NewAssert(t, "TestField_IsTargetType")
|
|
|
|
type Parent struct {
|
|
Name string
|
|
arr []int
|
|
}
|
|
|
|
p1 := &Parent{Name: "test", arr: []int{1, 2, 3}}
|
|
s := New(p1)
|
|
n, _ := s.Field("Name")
|
|
a, _ := s.Field("arr")
|
|
|
|
assert.Equal(true, n.IsTargetType(reflect.String))
|
|
assert.Equal(true, a.IsTargetType(reflect.Slice))
|
|
}
|
|
|
|
func TestField_MapValue(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
assert := internal.NewAssert(t, "TestField_MapValue")
|
|
|
|
t.Run("nested struct", func(t *testing.T) {
|
|
type Child struct {
|
|
Name string `json:"name"`
|
|
}
|
|
type Parent struct {
|
|
Name string `json:"name"`
|
|
Child *Child `json:"child"`
|
|
}
|
|
|
|
c1 := &Child{"11-1"}
|
|
p1 := &Parent{
|
|
Name: "11",
|
|
Child: c1,
|
|
}
|
|
|
|
s := New(p1)
|
|
f, ok := s.Field("Child")
|
|
val := f.mapValue(f.Value())
|
|
|
|
assert.Equal(true, ok)
|
|
assert.Equal(map[string]any{"name": "11-1"}, val)
|
|
})
|
|
|
|
t.Run("nested ptr struct", func(t *testing.T) {
|
|
type Child struct {
|
|
Name string `json:"name"`
|
|
}
|
|
type Parent struct {
|
|
Name string `json:"name"`
|
|
Child any `json:"child"`
|
|
}
|
|
c1 := &Child{"11-1"}
|
|
c2 := &c1
|
|
c3 := &c2
|
|
p1 := &Parent{
|
|
Name: "11",
|
|
Child: c3,
|
|
}
|
|
|
|
s := New(p1)
|
|
f, ok := s.Field("Child")
|
|
val := f.mapValue(f.Value())
|
|
|
|
assert.Equal(true, ok)
|
|
assert.Equal(map[string]any{"name": "11-1"}, val)
|
|
})
|
|
|
|
t.Run("nested array", func(t *testing.T) {
|
|
type Parent struct {
|
|
Name string `json:"name"`
|
|
Child []int `json:"child"`
|
|
}
|
|
|
|
p1 := &Parent{
|
|
Name: "11",
|
|
Child: []int{1, 2, 3},
|
|
}
|
|
|
|
s := New(p1)
|
|
f, ok := s.Field("Child")
|
|
val := f.mapValue(f.Value())
|
|
|
|
assert.Equal(true, ok)
|
|
assert.Equal([]int{1, 2, 3}, val)
|
|
})
|
|
|
|
t.Run("nested array struct", func(t *testing.T) {
|
|
type Child struct {
|
|
Name string `json:"name"`
|
|
}
|
|
type Parent struct {
|
|
Name string `json:"name"`
|
|
Child []*Child `json:"child"`
|
|
}
|
|
|
|
c1 := &Child{"11-1"}
|
|
c2 := &Child{"11-2"}
|
|
|
|
p1 := &Parent{
|
|
Name: "11",
|
|
Child: []*Child{c1, c2},
|
|
}
|
|
|
|
s := New(p1)
|
|
f, ok := s.Field("Child")
|
|
val := f.mapValue(f.Value())
|
|
|
|
assert.Equal(true, ok)
|
|
arr := []any{map[string]any{"name": "11-1"}, map[string]any{"name": "11-2"}}
|
|
assert.Equal(arr, val)
|
|
})
|
|
|
|
t.Run("nested ptr array struct", func(t *testing.T) {
|
|
type Child struct {
|
|
Name string `json:"name"`
|
|
}
|
|
type Parent struct {
|
|
Name string `json:"name"`
|
|
Child *[]*Child `json:"child"`
|
|
}
|
|
|
|
c1 := &Child{"11-1"}
|
|
c2 := &Child{"11-2"}
|
|
|
|
p1 := &Parent{
|
|
Name: "11",
|
|
Child: &[]*Child{c1, c2},
|
|
}
|
|
|
|
s := New(p1)
|
|
f, ok := s.Field("Child")
|
|
val := f.mapValue(f.Value())
|
|
|
|
assert.Equal(true, ok)
|
|
arr := []any{map[string]any{"name": "11-1"}, map[string]any{"name": "11-2"}}
|
|
assert.Equal(arr, val)
|
|
})
|
|
|
|
t.Run("nested map in struct", func(t *testing.T) {
|
|
type Parent struct {
|
|
Name string `json:"name"`
|
|
Child map[string]any `json:"child"`
|
|
}
|
|
p1 := &Parent{
|
|
Name: "11",
|
|
Child: map[string]any{"a": 1, "b": map[string]any{"name": "11-1"}},
|
|
}
|
|
|
|
s := New(p1)
|
|
f, ok := s.Field("Child")
|
|
val := f.mapValue(f.Value())
|
|
assert.Equal(true, ok)
|
|
assert.Equal(map[string]any{"a": 1, "b": map[string]any{"name": "11-1"}}, val)
|
|
})
|
|
}
|