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)
			}
		})
	}
}
