3
0
corteza/pkg/expr/expr_test.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))
}