Files
path/path_test.go

142 lines
2.6 KiB
Go
Raw Permalink Normal View History

2023-04-20 18:01:36 +00:00
package path_test
import (
"reflect"
"testing"
"time"
"cloud.google.com/go/civil"
"github.com/gopatchy/path"
"github.com/stretchr/testify/require"
)
type testType1 struct {
Int int
Int64 int64
UInt uint
UInt64 uint64
Float32 float32
Float64 float64
String string `json:"string2,omitempty"`
Bool bool `json:"bool2"`
BoolP *bool
Ints []int
Int64s []int64
UInts []uint
UInt64s []uint64
Float32s []float32
Float64s []float64
Strings []string
Bools []bool
Time time.Time
Times []time.Time
Date civil.Date
Dates []civil.Date
TimeP *time.Time
TimesP []*time.Time
}
type testType2 struct {
Tt1 testType1
Tt1p *testType1
}
type testType3 struct {
testType1
}
type testType4 struct {
Foo *testType5 `json:"foo"`
testType5
}
type testType5 struct {
String string `json:"string2,omitempty"`
Bool bool `json:"bool2"`
UInt uint `xtest:"foo,bar,zig"`
}
func TestSet(t *testing.T) {
t.Parallel()
tt1 := &testType1{}
err := path.Set(tt1, "int64", "1234")
require.NoError(t, err)
require.Equal(t, int64(1234), tt1.Int64)
get, err := path.Get(tt1, "int64")
require.NoError(t, err)
require.Equal(t, int64(1234), get)
err = path.Set(tt1, "time", "2022-11-01-08:00")
require.NoError(t, err)
require.Equal(t, int64(1667289600), tt1.Time.Unix())
tt2 := &testType2{}
err = path.Set(tt2, "tt1p.bool2", "true")
require.NoError(t, err)
require.Equal(t, true, tt2.Tt1p.Bool)
err = path.Set(tt2, "tt1p.string2", "foo")
require.NoError(t, err)
require.Equal(t, "foo", tt2.Tt1p.String)
err = path.Set(tt2, "tt1.boolp", "true")
require.NoError(t, err)
require.Equal(t, true, *tt2.Tt1.BoolP)
}
func TestEmbed(t *testing.T) {
t.Parallel()
tt3 := &testType3{}
err := path.Set(tt3, "int", "1234")
require.NoError(t, err)
require.Equal(t, 1234, tt3.Int)
}
func TestList(t *testing.T) {
t.Parallel()
list := path.List(&testType4{})
require.Equal(t, []string{
"UInt",
"bool2",
"foo.UInt",
"foo.bool2",
"foo.string2",
"string2",
}, list)
}
func TestGetFieldType(t *testing.T) {
t.Parallel()
typ := reflect.TypeOf(&testType4{})
typ2 := path.GetFieldType(typ, "bool2")
require.NotNil(t, typ2)
require.Equal(t, reflect.TypeOf(true), typ2)
typ2 = path.GetFieldType(typ, "foo.UInt")
require.NotNil(t, typ2)
require.Equal(t, reflect.TypeOf(uint(1)), typ2)
}
func TestFindTagValueType(t *testing.T) {
t.Parallel()
typ := reflect.TypeOf(&testType4{})
p, ok := path.FindTagValueType(typ, "xtest", "foo")
require.True(t, ok)
require.Equal(t, "UInt", p)
p, ok = path.FindTagValueType(typ, "xtest", "zag")
require.False(t, ok)
require.Empty(t, p)
}