config: test nested function calls

This commit is contained in:
Mitchell Hashimoto 2014-07-22 16:16:46 -07:00
parent 7dfd4f5a3c
commit bff5c09164
2 changed files with 57 additions and 2 deletions

View File

@ -49,6 +49,39 @@ func TestExprParse(t *testing.T) {
}, },
false, false,
}, },
{
"lookup(var.foo, lookup(var.baz, var.bar))",
&FunctionInterpolation{
Func: nil, // Funcs["lookup"]
Args: []Interpolation{
&VariableInterpolation{
Variable: &UserVariable{
Name: "foo",
key: "var.foo",
},
},
&FunctionInterpolation{
Func: nil, // Funcs["lookup"]
Args: []Interpolation{
&VariableInterpolation{
Variable: &UserVariable{
Name: "baz",
key: "var.baz",
},
},
&VariableInterpolation{
Variable: &UserVariable{
Name: "bar",
key: "var.bar",
},
},
},
},
},
},
false,
},
} }
for i, tc := range cases { for i, tc := range cases {
@ -59,8 +92,22 @@ func TestExprParse(t *testing.T) {
// This is jank, but reflect.DeepEqual never has functions // This is jank, but reflect.DeepEqual never has functions
// being the same. // being the same.
if f, ok := actual.(*FunctionInterpolation); ok { f, ok := actual.(*FunctionInterpolation)
f.Func = nil if ok {
fs := make([]*FunctionInterpolation, 1)
fs[0] = f
for len(fs) > 0 {
f := fs[0]
fs = fs[1:]
f.Func = nil
for _, a := range f.Args {
f, ok := a.(*FunctionInterpolation)
if ok {
fs = append(fs, f)
}
}
}
} }
if !reflect.DeepEqual(actual, tc.Result) { if !reflect.DeepEqual(actual, tc.Result) {

View File

@ -98,6 +98,10 @@ func (i *FunctionInterpolation) Interpolate(
return i.Func(vs, args...) return i.Func(vs, args...)
} }
func (i *FunctionInterpolation) GoString() string {
return fmt.Sprintf("*%#v", *i)
}
func (i *FunctionInterpolation) Variables() map[string]InterpolatedVariable { func (i *FunctionInterpolation) Variables() map[string]InterpolatedVariable {
result := make(map[string]InterpolatedVariable) result := make(map[string]InterpolatedVariable)
for _, a := range i.Args { for _, a := range i.Args {
@ -130,6 +134,10 @@ func (i *VariableInterpolation) Interpolate(
return v, nil return v, nil
} }
func (i *VariableInterpolation) GoString() string {
return fmt.Sprintf("*%#v", *i)
}
func (i *VariableInterpolation) Variables() map[string]InterpolatedVariable { func (i *VariableInterpolation) Variables() map[string]InterpolatedVariable {
return map[string]InterpolatedVariable{i.Variable.FullKey(): i.Variable} return map[string]InterpolatedVariable{i.Variable.FullKey(): i.Variable}
} }