package treeprint import ( "fmt" "testing" "github.com/stretchr/testify/assert" ) type nameStruct struct { One string `json:"one" tree:"one"` Two int `tree:"two"` Three struct { SubOne []string SubTwo []interface{} SubThree struct { InnerOne *float64 `tree:"inner_one,omitempty"` InnerTwo *struct{} `tree:",omitempty"` InnerThree *float64 `tree:"inner_three"` } } } func TestFromStructName(t *testing.T) { assert := assert.New(t) tree, err := FromStruct(nameStruct{}, StructNameTree) assert.NoError(err) actual := tree.String() expected := `. ├── one ├── two └── Three ├── SubOne ├── SubTwo └── SubThree └── inner_three ` assert.Equal(expected, actual) } func TestFromStructTags(t *testing.T) { assert := assert.New(t) tree, err := FromStruct(nameStruct{}, StructTagTree) assert.NoError(err) actual := tree.String() expected := `. ├── [json:"one"] one ├── [] two └── [] Three ├── [] SubOne ├── [] SubTwo └── [] SubThree └── [] inner_three ` assert.Equal(expected, actual) } type typeStruct struct { One string `json:"one" tree:"one"` Two int `tree:"two"` Three subtypeStruct } type subtypeStruct struct { SubOne []string SubTwo []interface{} SubThree subsubTypeStruct } type subsubTypeStruct struct { InnerOne *float64 `tree:"inner_one,omitempty"` InnerTwo *struct{} `tree:",omitempty"` InnerThree *float64 `tree:"inner_three"` } func TestFromStructType(t *testing.T) { assert := assert.New(t) tree, err := FromStruct(typeStruct{}, StructTypeTree) assert.NoError(err) actual := tree.String() expected := `. ├── [string] one ├── [int] two └── [treeprint.subtypeStruct] Three ├── [[]string] SubOne ├── [[]interface {}] SubTwo └── [treeprint.subsubTypeStruct] SubThree └── [*float64] inner_three ` assert.Equal(expected, actual) } func TestFromStructTypeSize(t *testing.T) { assert := assert.New(t) tree, err := FromStruct(typeStruct{}, StructTypeSizeTree) assert.NoError(err) actual := tree.String() expected := `. ├── [16] one ├── [8] two └── [72] Three ├── [24] SubOne ├── [24] SubTwo └── [24] SubThree └── [8] inner_three ` assert.Equal(expected, actual) } type valueStruct struct { Name string Bio struct { Age int City string Meta interface{} } } func TestFromStructValue(t *testing.T) { assert := assert.New(t) val := valueStruct{ Name: "Max", } val.Bio.Age = 100 val.Bio.City = "NYC" val.Bio.Meta = []byte("hello") tree, err := FromStruct(val, StructValueTree) assert.NoError(err) actual := tree.String() expected := `. ├── [Max] Name └── Bio ├── [100] Age ├── [NYC] City └── [[104 101 108 108 111]] Meta ` assert.Equal(expected, actual) } func TestFromStructWithMeta(t *testing.T) { assert := assert.New(t) val := valueStruct{ Name: "Max", } val.Bio.Age = 100 val.Bio.City = "NYC" val.Bio.Meta = []byte("hello") tree, err := FromStructWithMeta(val, func(_ string, v interface{}) (string, bool) { return fmt.Sprintf("lol %T", v), true }) assert.NoError(err) actual := tree.String() expected := `. ├── [lol string] Name └── [lol struct { Age int; City string; Meta interface {} }] Bio ├── [lol int] Age ├── [lol string] City └── [lol []uint8] Meta ` assert.Equal(expected, actual) }