structure: add anonymous fields test, closes #5
This commit is contained in:
parent
4d9abb0de1
commit
0ec62843ec
@ -129,7 +129,6 @@ func Fields(s interface{}) []string {
|
||||
|
||||
keys := make([]string, 0)
|
||||
for i, field := range fields {
|
||||
|
||||
val := v.Field(i)
|
||||
if val.Kind() == reflect.Struct {
|
||||
// look out for embedded structs, and convert them to a
|
||||
|
||||
@ -89,7 +89,7 @@ func TestMap_Tag(t *testing.T) {
|
||||
|
||||
}
|
||||
|
||||
func TestMap_Embedded(t *testing.T) {
|
||||
func TestMap_Nested(t *testing.T) {
|
||||
type A struct {
|
||||
Name string
|
||||
}
|
||||
@ -106,6 +106,34 @@ func TestMap_Embedded(t *testing.T) {
|
||||
t.Errorf("Map should return a map type, got: %v", typ)
|
||||
}
|
||||
|
||||
in, ok := m["A"].(map[string]interface{})
|
||||
if !ok {
|
||||
t.Error("Map nested structs is not available in the map")
|
||||
}
|
||||
|
||||
if name := in["Name"].(string); name != "example" {
|
||||
t.Error("Map nested struct's name field should give example, got: %s", name)
|
||||
}
|
||||
}
|
||||
|
||||
func TestMap_Anonymous(t *testing.T) {
|
||||
type A struct {
|
||||
Name string
|
||||
}
|
||||
a := A{Name: "example"}
|
||||
|
||||
type B struct {
|
||||
A
|
||||
}
|
||||
b := &B{}
|
||||
b.A = a
|
||||
|
||||
m := Map(b)
|
||||
|
||||
if typ := reflect.TypeOf(m).Kind(); typ != reflect.Map {
|
||||
t.Errorf("Map should return a map type, got: %v", typ)
|
||||
}
|
||||
|
||||
in, ok := m["A"].(map[string]interface{})
|
||||
if !ok {
|
||||
t.Error("Embedded structs is not available in the map")
|
||||
@ -162,7 +190,7 @@ func TestValues(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestValues_Embedded(t *testing.T) {
|
||||
func TestValues_Nested(t *testing.T) {
|
||||
type A struct {
|
||||
Name string
|
||||
}
|
||||
@ -192,6 +220,37 @@ func TestValues_Embedded(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestValues_Anonymous(t *testing.T) {
|
||||
type A struct {
|
||||
Name string
|
||||
}
|
||||
a := A{Name: "example"}
|
||||
|
||||
type B struct {
|
||||
A
|
||||
C int
|
||||
}
|
||||
b := &B{C: 123}
|
||||
b.A = a
|
||||
|
||||
s := Values(b)
|
||||
|
||||
inSlice := func(val interface{}) bool {
|
||||
for _, v := range s {
|
||||
if reflect.DeepEqual(v, val) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
for _, val := range []interface{}{"example", 123} {
|
||||
if !inSlice(val) {
|
||||
t.Errorf("Values should have the value %v", val)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestFields(t *testing.T) {
|
||||
var T = struct {
|
||||
A string
|
||||
@ -225,7 +284,7 @@ func TestFields(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestFields_Embedded(t *testing.T) {
|
||||
func TestFields_Nested(t *testing.T) {
|
||||
type A struct {
|
||||
Name string
|
||||
}
|
||||
@ -255,6 +314,37 @@ func TestFields_Embedded(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestFields_Anonymous(t *testing.T) {
|
||||
type A struct {
|
||||
Name string
|
||||
}
|
||||
a := A{Name: "example"}
|
||||
|
||||
type B struct {
|
||||
A
|
||||
C int
|
||||
}
|
||||
b := &B{C: 123}
|
||||
b.A = a
|
||||
|
||||
s := Fields(b)
|
||||
|
||||
inSlice := func(val interface{}) bool {
|
||||
for _, v := range s {
|
||||
if reflect.DeepEqual(v, val) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
for _, val := range []interface{}{"Name", "A", "C"} {
|
||||
if !inSlice(val) {
|
||||
t.Errorf("Fields should have the value %v", val)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestIsValid(t *testing.T) {
|
||||
var T = struct {
|
||||
A string
|
||||
@ -284,7 +374,7 @@ func TestIsValid(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestIsValid_Embedded(t *testing.T) {
|
||||
func TestIsValid_Nested(t *testing.T) {
|
||||
type A struct {
|
||||
Name string
|
||||
D string
|
||||
@ -301,7 +391,26 @@ func TestIsValid_Embedded(t *testing.T) {
|
||||
if ok {
|
||||
t.Error("IsValid should return false because D is not initialized")
|
||||
}
|
||||
}
|
||||
|
||||
func TestIsValid_Anonymous(t *testing.T) {
|
||||
type A struct {
|
||||
Name string
|
||||
D string
|
||||
}
|
||||
a := A{Name: "example"}
|
||||
|
||||
type B struct {
|
||||
A
|
||||
C int
|
||||
}
|
||||
b := &B{C: 123}
|
||||
b.A = a
|
||||
|
||||
ok := IsValid(b)
|
||||
if ok {
|
||||
t.Error("IsValid should return false because D is not initialized")
|
||||
}
|
||||
}
|
||||
|
||||
func TestName(t *testing.T) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user