util/reflect: improve test coverage
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
		| @@ -4,7 +4,7 @@ import ( | ||||
| 	"testing" | ||||
| ) | ||||
|  | ||||
| func TestPath(t *testing.T) { | ||||
| func TestLookup(t *testing.T) { | ||||
| 	type Nested2 struct { | ||||
| 		Name string | ||||
| 	} | ||||
|   | ||||
							
								
								
									
										135
									
								
								util/reflect/reflect_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								util/reflect/reflect_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,135 @@ | ||||
| package reflect | ||||
|  | ||||
| import ( | ||||
| 	"testing" | ||||
| ) | ||||
|  | ||||
| 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 { | ||||
| 		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 = 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) | ||||
| 	} | ||||
| } | ||||
| @@ -9,7 +9,34 @@ import ( | ||||
| 	rutil "go.unistack.org/micro/v3/util/reflect" | ||||
| ) | ||||
|  | ||||
| func TestStructfields(t *testing.T) { | ||||
| func TestStructFields(t *testing.T) { | ||||
| 	type NestedStr struct { | ||||
| 		BBB string | ||||
| 		CCC int | ||||
| 	} | ||||
| 	type Str struct { | ||||
| 		Name   []string `json:"name" codec:"flatten"` | ||||
| 		XXX    string   `json:"xxx"` | ||||
| 		Nested NestedStr | ||||
| 	} | ||||
|  | ||||
| 	val := &Str{Name: []string{"first", "second"}, XXX: "ttt", Nested: NestedStr{BBB: "ddd", CCC: 9}} | ||||
| 	fields, err := rutil.StructFields(val) | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| 	var ok bool | ||||
| 	for _, field := range fields { | ||||
| 		if field.Path == "Nested.CCC" { | ||||
| 			ok = true | ||||
| 		} | ||||
| 	} | ||||
| 	if !ok { | ||||
| 		t.Fatalf("struct fields returns invalid path: %v", fields) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestStructFieldsNested(t *testing.T) { | ||||
| 	type NestedConfig struct { | ||||
| 		Value string | ||||
| 	} | ||||
| @@ -130,34 +157,7 @@ func TestStructFieldsMap(t *testing.T) { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestStructFields(t *testing.T) { | ||||
| 	type NestedStr struct { | ||||
| 		BBB string | ||||
| 		CCC int | ||||
| 	} | ||||
| 	type Str struct { | ||||
| 		Name   []string `json:"name" codec:"flatten"` | ||||
| 		XXX    string   `json:"xxx"` | ||||
| 		Nested NestedStr | ||||
| 	} | ||||
|  | ||||
| 	val := &Str{Name: []string{"first", "second"}, XXX: "ttt", Nested: NestedStr{BBB: "ddd", CCC: 9}} | ||||
| 	fields, err := rutil.StructFields(val) | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| 	var ok bool | ||||
| 	for _, field := range fields { | ||||
| 		if field.Path == "Nested.CCC" { | ||||
| 			ok = true | ||||
| 		} | ||||
| 	} | ||||
| 	if !ok { | ||||
| 		t.Fatalf("struct fields returns invalid path: %v", fields) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestStructByPath(t *testing.T) { | ||||
| func TestStructFieldByPath(t *testing.T) { | ||||
| 	type NestedStr struct { | ||||
| 		BBB string | ||||
| 		CCC int | ||||
| @@ -178,7 +178,7 @@ func TestStructByPath(t *testing.T) { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestStructByTag(t *testing.T) { | ||||
| func TestStructFieldByTag(t *testing.T) { | ||||
| 	type Str struct { | ||||
| 		Name []string `json:"name" codec:"flatten"` | ||||
| 	} | ||||
| @@ -197,7 +197,7 @@ func TestStructByTag(t *testing.T) { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestStructByName(t *testing.T) { | ||||
| func TestStructFieldByName(t *testing.T) { | ||||
| 	type Str struct { | ||||
| 		Name []string `json:"name" codec:"flatten"` | ||||
| 	} | ||||
| @@ -260,7 +260,7 @@ func TestURLSliceVars(t *testing.T) { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestURLVars(t *testing.T) { | ||||
| func TestURLMap(t *testing.T) { | ||||
| 	u, err := url.Parse("http://localhost/v1/test/call/my_name?req=key&arg1=arg1&arg2=12345&nested.string_args=str1&nested.string_args=str2&arg2=54321") | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user