Files
lancet/structs/field_test.go
duckjiangwei 11214986cc add new func & docs error repair (#153)
* feat: add method IsTargetType()

* docs:document error repair
2023-12-28 10:27:32 +08:00

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