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.
ntool/nmapper/mapper_object_test.go

209 lines
5.0 KiB
Go

package nmapper_test
import (
"fmt"
"git.noahlan.cn/noahlan/ntool/nmapper"
"git.noahlan.cn/noahlan/ntool/nmapper/wrapper"
"git.noahlan.cn/noahlan/ntool/nreflect"
"reflect"
"testing"
"time"
)
type testInnerType struct {
InInt int `json:"in_int"`
}
type testType struct {
Int int `json:"int"`
Int8 int8 `json:"int8"`
UInt8 uint8 `json:"uint8"`
Float32 float32 `json:"float32"`
Float64 float64 `json:"float64"`
String string `json:"string"`
Time time.Time `json:"time,layout=2006-01-02"`
TimeNoLayout time.Time `json:"time_no_layout"`
Ignore int `json:"-"`
*testInnerType
TT *testInnerType `json:"tt"`
t *testInnerType `json:"t"`
}
func TestT(t *testing.T) {
src := &testType{
Int: 1,
Int8: 2,
UInt8: 3,
Float32: 4.2,
Float64: 5.2222222222,
String: "test",
Time: time.Now(),
TimeNoLayout: time.Now().Add(time.Hour * 24),
Ignore: 99,
testInnerType: &testInnerType{InInt: 111},
TT: &testInnerType{InInt: 222},
t: &testInnerType{InInt: 333},
}
valElem := reflect.ValueOf(src)
valElem = nreflect.Indirect(valElem)
typElem := reflect.TypeOf(src)
typElem = typElem.Elem()
for i := 0; i < valElem.NumField(); i++ {
fieldValElem := valElem.Field(i)
fieldTypElem := typElem.Field(i)
fieldElem := fieldValElem.Type()
fmt.Println(fieldElem.Name(), fieldTypElem.Anonymous, fieldTypElem.Name)
fmt.Println(fieldElem.Kind(), fieldTypElem.Type)
fmt.Println(fieldElem.String(), fieldTypElem.IsExported())
fmt.Println()
//if fieldElem.Kind() == reflect.Ptr {
// fff := fieldElem.Elem()
// fmt.Println(fff.Name())
// fmt.Println(fff.Kind())
// fmt.Println(fff.String())
//}
}
}
func TestMapper_Mapper(t *testing.T) {
mapper := nmapper.NewMapper()
dest := make(map[string]any)
src := &testType{
Int: 1,
Int8: 2,
UInt8: 3,
Float32: 4.2,
Float64: 5.2222222222,
String: "test",
Time: time.Now(),
TimeNoLayout: time.Now().Add(time.Hour * 24),
Ignore: 99,
testInnerType: &testInnerType{InInt: 111},
TT: &testInnerType{InInt: 222},
}
_ = mapper.Mapper(dest, src)
dest2 := make(map[string]string)
_ = mapper.Mapper(dest2, src)
fmt.Printf("dest1:\n%+v\n", dest)
fmt.Printf("dest2:\n%+v\n", dest2)
}
func TestMapper_Parse(t *testing.T) {
src := make(map[string]any)
src["int"] = 1
src["int8"] = 2
src["uint8"] = 3
src["float32"] = 4.2
src["float64"] = 5.2222222222
src["string"] = "test"
src["time"] = time.Now()
src["time_no_layout"] = time.Now().Add(time.Hour * 24)
src["ignore"] = "ignore"
var dest testType
mapper := nmapper.NewMapper()
_ = mapper.Parse(&dest, src, false)
fmt.Printf("%+v\n", dest)
}
func TestMapperObject_ParseStrMap(t *testing.T) {
src := make(map[string]string)
src["int"] = "1"
src["int8"] = "2"
src["uint8"] = "3"
src["float32"] = "4.2"
src["float64"] = "5.2222222222"
src["string"] = "test"
src["time"] = "2023-08-18"
src["time_no_layout"] = "2023-08-19 10:07:40"
src["ignore"] = "ignore"
var dest testType
mapper := nmapper.NewMapper()
_ = mapper.Parse(&dest, src, false)
fmt.Printf("%+v\n", dest)
}
type testFlattenInnerType struct {
A int `json:"a"`
C int `json:"c"`
}
type testFlattenInnerType2 struct {
B int `json:"b"`
AT testFlattenInnerType `json:"t"`
}
type testFlattenInnerType3 struct {
M3 map[string]string `json:"m3"`
}
type testFlattenType struct {
testFlattenInnerType
T *testFlattenInnerType `json:"t"`
TT *testFlattenInnerType `json:"tt"`
T2 testFlattenInnerType2 `json:"t2"`
T3 *testFlattenInnerType3 `json:"t3"`
M map[string]string `json:"m"`
M2 map[string]any `json:"m2"`
Int int `json:"int"`
Time time.Time `json:"time,layout=2006-01-02"`
}
func TestParseFlatten(t *testing.T) {
src := make(map[string]string)
src["a"] = "1"
src["c"] = "2"
src["t.a"] = "1"
src["tt.a"] = "11"
src["tt.c"] = "33"
src["t2.b"] = "2"
src["t2.t.a"] = "3"
src["t2.at.a"] = "4"
src["t3.m3.a"] = "a"
src["t3.m3.b"] = "b"
src["m.dd"] = "x.xx"
src["m2.a1.b1"] = "xx"
src["m2.a2.b2.c2"] = "xx"
src["int"] = "99"
src["time"] = "2010-09-18"
var dest testFlattenType
mapper := nmapper.NewMapper()
mapper.SetTypeWrapper(wrapper.StrWrapper()...)
_ = mapper.Parse(&dest, src, true)
fmt.Printf("%+v\n", dest)
}
func TestParse(t *testing.T) {
src := make(map[string]any)
src["t"] = map[string]any{"a": "1"}
src["tt"] = map[string]any{"a": "11", "c": "33"}
src["t2"] = map[string]any{"b": "2", "t": map[string]any{"a": "3"}, "at": map[string]any{"a": "4"}}
src["m"] = map[string]string{"dd": "x.xx"}
src["m2"] = map[string]any{"a1": map[string]any{"b1": "xx"}, "a2": map[string]any{"b2": map[string]any{"c2": "xx"}}}
src["int"] = "99"
src["time"] = "2010-09-18"
src["a"] = "1"
var dest testFlattenType
mapper := nmapper.NewMapper()
mapper.SetTypeWrapper(wrapper.StrWrapper()...)
_ = mapper.Parse(&dest, src, false)
fmt.Printf("%+v\n", dest)
}