blob: 48d4a1323350a57c16c4a1ce3acb450c964e7725 [file] [log] [blame]
package json
import (
"encoding/json"
"testing"
"github.com/google/go-cmp/cmp"
"github.com/zclconf/go-cty/cty/function"
"github.com/zclconf/go-cty/cty/function/stdlib"
)
func TestDescribeFunction(t *testing.T) {
// NOTE: This test case is referring to some real functions in other
// packages. and so if those functions change signature later it will
// probably make some cases here fail. If that is the cause of the failure,
// it's fine to update the test here to match rather than to revert the
// change to the function signature, as long as the change to the
// function signature is otherwise within the bounds of our compatibility
// promises.
tests := map[string]struct {
Function function.Function
Want *Function
}{
"upper": {
Function: stdlib.UpperFunc,
Want: &Function{
Name: "upper",
Params: []FunctionParam{
{
Name: "str",
Type: json.RawMessage(`"string"`),
},
},
ReturnType: json.RawMessage(`"string"`),
},
},
"coalesce": {
Function: stdlib.CoalesceFunc,
Want: &Function{
Name: "coalesce",
Params: []FunctionParam{},
VariadicParam: &FunctionParam{
Name: "vals",
Type: json.RawMessage(`"dynamic"`),
},
ReturnType: json.RawMessage(`"dynamic"`),
},
},
"join": {
Function: stdlib.JoinFunc,
Want: &Function{
Name: "join",
Params: []FunctionParam{
{
Name: "separator",
Type: json.RawMessage(`"string"`),
},
},
VariadicParam: &FunctionParam{
Name: "lists",
Type: json.RawMessage(`["list","string"]`),
},
ReturnType: json.RawMessage(`"string"`),
},
},
"jsonencode": {
Function: stdlib.JSONEncodeFunc,
Want: &Function{
Name: "jsonencode",
Params: []FunctionParam{
{
Name: "val",
Type: json.RawMessage(`"dynamic"`),
},
},
ReturnType: json.RawMessage(`"string"`),
},
},
}
for name, test := range tests {
t.Run(name, func(t *testing.T) {
got := DescribeFunction(name, test.Function)
want := test.Want
if diff := cmp.Diff(want, got); diff != "" {
t.Errorf("wrong result\n%s", diff)
}
})
}
}