2022-04-22 09:24:34 +03:00
|
|
|
package reflect
|
|
|
|
|
|
|
|
import (
|
2024-12-06 19:05:27 +03:00
|
|
|
"fmt"
|
2022-04-22 09:24:34 +03:00
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
2024-12-06 19:05:27 +03:00
|
|
|
func TestMergeMapStringInterface(t *testing.T) {
|
|
|
|
var dst interface{} //nolint:gosimple
|
|
|
|
dst = map[string]interface{}{
|
|
|
|
"xx": 11,
|
|
|
|
}
|
|
|
|
|
|
|
|
src := map[string]interface{}{
|
|
|
|
"zz": "aa",
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := Merge(dst, src); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
mp, ok := dst.(map[string]interface{})
|
|
|
|
if !ok || mp == nil {
|
|
|
|
t.Fatalf("xxx %#+v\n", dst)
|
|
|
|
}
|
|
|
|
|
|
|
|
if fmt.Sprintf("%v", mp["xx"]) != "11" {
|
|
|
|
t.Fatalf("xxx zzzz %#+v", mp)
|
|
|
|
}
|
|
|
|
|
|
|
|
if fmt.Sprintf("%v", mp["zz"]) != "aa" {
|
|
|
|
t.Fatalf("xxx zzzz %#+v", mp)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-09-20 19:22:20 +03:00
|
|
|
func TestMergeMap(t *testing.T) {
|
|
|
|
src := map[string]interface{}{
|
|
|
|
"skey1": "sval1",
|
|
|
|
"skey2": map[string]interface{}{
|
|
|
|
"skey3": "sval3",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
dst := map[string]interface{}{
|
|
|
|
"skey1": "dval1",
|
|
|
|
"skey2": map[string]interface{}{
|
|
|
|
"skey3": "dval3",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := Merge(src, dst); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
t.Logf("%#+v", src)
|
|
|
|
}
|
|
|
|
|
2022-04-22 09:24:34 +03:00
|
|
|
func TestFieldName(t *testing.T) {
|
|
|
|
src := "SomeVar"
|
|
|
|
chk := "some_var"
|
|
|
|
dst := FieldName(src)
|
|
|
|
if dst != chk {
|
|
|
|
t.Fatalf("FieldName error %s != %s", src, chk)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestMergeBool(t *testing.T) {
|
|
|
|
type str struct {
|
|
|
|
Bool bool `json:"bool"`
|
|
|
|
}
|
|
|
|
|
|
|
|
mp := make(map[string]interface{})
|
|
|
|
mp["bool"] = "true"
|
|
|
|
s := &str{}
|
|
|
|
|
|
|
|
if err := Merge(s, mp, Tags([]string{"json"})); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if !s.Bool {
|
|
|
|
t.Fatalf("merge bool error: %#+v\n", s)
|
|
|
|
}
|
|
|
|
|
|
|
|
mp["bool"] = "false"
|
|
|
|
|
|
|
|
if err := Merge(s, mp, Tags([]string{"json"})); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if s.Bool {
|
|
|
|
t.Fatalf("merge bool error: %#+v\n", s)
|
|
|
|
}
|
|
|
|
|
|
|
|
mp["bool"] = 1
|
|
|
|
|
|
|
|
if err := Merge(s, mp, 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{}
|
|
|
|
|
|
|
|
if err := Merge(s, mp, Tags([]string{"json"})); err != nil {
|
|
|
|
t.Fatalf("merge with true err: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if s.Bool != "true" {
|
|
|
|
t.Fatalf("merge bool error: %#+v\n", s)
|
|
|
|
}
|
|
|
|
|
|
|
|
mp["bool"] = false
|
|
|
|
if err := Merge(s, mp, Tags([]string{"json"})); err != nil {
|
|
|
|
t.Fatalf("merge with falst err: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if s.Bool != "false" {
|
|
|
|
t.Fatalf("merge bool error: %#+v\n", s)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestMergeNested(t *testing.T) {
|
|
|
|
type CallReqNested struct {
|
2024-12-09 16:23:25 +03:00
|
|
|
Nested *CallReqNested `json:"nested2"`
|
2022-04-22 09:24:34 +03:00
|
|
|
StringArgs []string `json:"string_args"`
|
|
|
|
Uint64Args []uint64 `json:"uint64_args"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type CallReq struct {
|
2024-12-09 16:23:25 +03:00
|
|
|
Nested *CallReqNested `json:"nested"`
|
2022-04-22 09:24:34 +03:00
|
|
|
Name string `json:"name"`
|
|
|
|
Req string `json:"req"`
|
|
|
|
Arg2 int `json:"arg2"`
|
|
|
|
}
|
|
|
|
|
|
|
|
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 = FlattenMap(mp)
|
|
|
|
|
|
|
|
if err := Merge(dst, mp, 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 = FlattenMap(nmp)
|
|
|
|
|
|
|
|
if err := Merge(dst, nmp, SliceAppend(true), 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)
|
|
|
|
}
|
|
|
|
}
|
2023-09-12 10:30:19 +03:00
|
|
|
|
|
|
|
func TestEqual(t *testing.T) {
|
|
|
|
type tstr struct {
|
|
|
|
Key1 string
|
|
|
|
Key2 string
|
|
|
|
}
|
|
|
|
|
|
|
|
src := &tstr{Key1: "val1", Key2: "micro:generate"}
|
|
|
|
dst := &tstr{Key1: "val1", Key2: "val2"}
|
|
|
|
if !Equal(src, dst, "Key2") {
|
|
|
|
t.Fatal("invalid Equal test")
|
|
|
|
}
|
|
|
|
}
|