micro-tests/util/reflect/reflect_test.go

181 lines
4.1 KiB
Go
Raw Normal View History

package reflect
import (
"testing"
pb "go.unistack.org/micro-tests/util/reflect/proto"
rutil "go.unistack.org/micro/v3/util/reflect"
)
func TestFieldName(t *testing.T) {
name := rutil.FieldName("NestedArgs")
if name != "nested_args" {
t.Fatalf("%s != nested_args", name)
}
}
func TestMergeBool(t *testing.T) {
type str struct {
Bool bool `json:"bool"`
}
mp := make(map[string]interface{})
mp["bool"] = "true"
s := &str{}
if err := rutil.Merge(s, mp, rutil.Tags([]string{"json"})); err != nil {
t.Fatal(err)
}
if !s.Bool {
t.Fatalf("merge bool error: %#+v\n", s)
}
mp["bool"] = "false"
if err := rutil.Merge(s, mp, rutil.Tags([]string{"json"})); err != nil {
t.Fatal(err)
}
if s.Bool {
t.Fatalf("merge bool error: %#+v\n", s)
}
mp["bool"] = 1
if err := rutil.Merge(s, mp, rutil.Tags([]string{"json"})); err != nil {
t.Fatal(err)
}
if !s.Bool {
t.Fatalf("merge bool error: %#+v\n", s)
}
}
func TestMergeString(t *testing.T) {
type str struct {
Bool string `json:"bool"`
}
mp := make(map[string]interface{})
mp["bool"] = true
s := &str{}
t.Logf("merge with true")
if err := rutil.Merge(s, mp, rutil.Tags([]string{"json"})); err != nil {
t.Fatal(err)
}
if s.Bool != "true" {
t.Fatalf("merge bool error: %#+v\n", s)
}
mp["bool"] = false
t.Logf("merge with false")
if err := rutil.Merge(s, mp, rutil.Tags([]string{"json"})); err != nil {
t.Fatal(err)
}
if s.Bool != "false" {
t.Fatalf("merge bool error: %#+v\n", s)
}
}
func TestMerge(t *testing.T) {
dst := &pb.CallReq{
Name: "name_old",
Req: "req_old",
}
mp := make(map[string]interface{})
mp["name"] = "name_new"
mp["req"] = "req_new"
mp["arg2"] = 1
mp["nested.string_args"] = []string{"args1", "args2"}
mp["nested.uint64_args"] = []uint64{1, 2, 3}
mp = rutil.FlattenMap(mp)
if err := rutil.Merge(dst, mp, rutil.Tags([]string{"protobuf"})); err != nil {
t.Fatal(err)
}
if dst.Name != "name_new" || dst.Req != "req_new" || dst.Arg2 != 1 {
t.Fatalf("merge error: %#+v", dst)
}
if dst.Nested == nil || len(dst.Nested.Uint64Args) != 3 ||
len(dst.Nested.StringArgs) != 2 || dst.Nested.StringArgs[0] != "args1" ||
len(dst.Nested.Uint64Args) != 3 || dst.Nested.Uint64Args[2].Value != 3 {
t.Fatalf("merge error: %#+v", dst.Nested)
}
nmp := make(map[string]interface{})
nmp["nested.uint64_args"] = []uint64{4}
nmp = rutil.FlattenMap(nmp)
if err := rutil.Merge(dst, nmp, rutil.SliceAppend(true), rutil.Tags([]string{"protobuf"})); err != nil {
t.Fatal(err)
}
if dst.Nested == nil || len(dst.Nested.Uint64Args) != 4 || dst.Nested.Uint64Args[3].Value != 4 {
t.Fatalf("merge error: %#+v", dst.Nested)
}
}
func TestMergeNested(t *testing.T) {
type CallReqNested struct {
StringArgs []string `json:"string_args"`
Uint64Args []uint64 `json:"uint64_args"`
Nested *CallReqNested `json:"nested2"`
}
type CallReq struct {
Name string `json:"name"`
Req string `json:"req"`
Arg2 int `json:"arg2"`
Nested *CallReqNested `json:"nested"`
}
dst := &CallReq{
Name: "name_old",
Req: "req_old",
}
mp := make(map[string]interface{})
mp["name"] = "name_new"
mp["req"] = "req_new"
mp["arg2"] = 1
mp["nested.string_args"] = []string{"args1", "args2"}
mp["nested.uint64_args"] = []uint64{1, 2, 3}
mp["nested.nested2.uint64_args"] = []uint64{1, 2, 3}
mp = rutil.FlattenMap(mp)
if err := rutil.Merge(dst, mp, rutil.Tags([]string{"json"})); err != nil {
t.Fatal(err)
}
if dst.Name != "name_new" || dst.Req != "req_new" || dst.Arg2 != 1 {
t.Fatalf("merge error: %#+v", dst)
}
if dst.Nested == nil || len(dst.Nested.Uint64Args) != 3 ||
len(dst.Nested.StringArgs) != 2 || dst.Nested.StringArgs[0] != "args1" ||
len(dst.Nested.Uint64Args) != 3 || dst.Nested.Uint64Args[2] != 3 {
t.Fatalf("merge error: %#+v", dst.Nested)
}
nmp := make(map[string]interface{})
nmp["nested.uint64_args"] = []uint64{4}
nmp = rutil.FlattenMap(nmp)
if err := rutil.Merge(dst, nmp, rutil.SliceAppend(true), rutil.Tags([]string{"json"})); err != nil {
t.Fatal(err)
}
if dst.Nested == nil || len(dst.Nested.Uint64Args) != 4 || dst.Nested.Uint64Args[3] != 4 {
t.Fatalf("merge error: %#+v", dst.Nested)
}
}