83 lines
1.8 KiB
Go
83 lines
1.8 KiB
Go
package expr
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestPathSplit(t *testing.T) {
|
|
tcc := []struct {
|
|
p string
|
|
r []string
|
|
err string
|
|
}{
|
|
{p: "a", r: []string{"a"}},
|
|
{p: "foo.bar", r: []string{"foo", "bar"}},
|
|
{p: "a.b[1]", r: []string{"a", "b", "1"}},
|
|
{p: "a.b[1].baz[0]", r: []string{"a", "b", "1", "baz", "0"}},
|
|
{p: "a.[]", err: invalidPathErr.Error()},
|
|
{p: "a[]", r: []string{"a", ""}},
|
|
{p: "a[1]bzz", err: invalidPathErr.Error()},
|
|
}
|
|
|
|
for _, tc := range tcc {
|
|
t.Run(tc.p, func(t *testing.T) {
|
|
req := require.New(t)
|
|
pp, err := PathSplit(tc.p)
|
|
if len(tc.err) == 0 {
|
|
req.NoError(err)
|
|
} else {
|
|
req.EqualError(err, tc.err)
|
|
}
|
|
|
|
req.Equal(tc.r, pp)
|
|
})
|
|
}
|
|
|
|
}
|
|
|
|
func TestVars(t *testing.T) {
|
|
var (
|
|
req = require.New(t)
|
|
|
|
vars = Must(Typify(map[string]interface{}{
|
|
"int": Must(NewInteger(42)),
|
|
"sub": map[string]interface{}{
|
|
"foo": Must(NewString("foo")),
|
|
},
|
|
"three": map[string]interface{}{
|
|
"two": map[string]interface{}{
|
|
"one": map[string]interface{}{
|
|
"go": Must(NewString("!")),
|
|
},
|
|
},
|
|
},
|
|
}))
|
|
|
|
tv = func(in interface{}) TypedValue {
|
|
switch cnv := in.(type) {
|
|
case int:
|
|
return Must(NewInteger(cnv))
|
|
case string:
|
|
return Must(NewString(cnv))
|
|
}
|
|
|
|
return Must(NewAny(in))
|
|
}
|
|
)
|
|
|
|
req.NoError(Assign(vars, "int", tv(123)))
|
|
req.Equal(int64(123), Must(Select(vars, "int")).Get().(int64))
|
|
|
|
req.NoError(Assign(vars, "sub.foo", tv("bar")))
|
|
req.Equal("bar", Must(Select(vars, "sub.foo")).Get().(string))
|
|
|
|
req.NoError(Assign(vars, "kv", &KV{}))
|
|
req.NoError(Assign(vars, "kv.foo", tv("bar")))
|
|
req.Equal("bar", Must(Select(vars, "kv.foo")).Get().(string))
|
|
|
|
req.NoError(Assign(vars, "three.two.one.go", tv("!!!")))
|
|
req.Equal("!!!", Must(Select(vars, "three.two.one.go")).Get().(string))
|
|
}
|