package pcl

import (
	"path/filepath"
	"testing"

	"github.com/pulumi/pulumi/pkg/v3/codegen/hcl2/model"
	"github.com/pulumi/pulumi/pkg/v3/codegen/schema"
	"github.com/pulumi/pulumi/pkg/v3/codegen/testing/utils"
	"github.com/stretchr/testify/assert"
	"github.com/zclconf/go-cty/cty"
)

var testdataPath = filepath.Join("..", "testing", "test", "testdata")

func BenchmarkLoadPackage(b *testing.B) {
	loader := schema.NewPluginLoader(utils.NewHost(testdataPath))

	for n := 0; n < b.N; n++ {
		_, err := NewPackageCache().loadPackageSchema(loader, "aws", "")
		if err != nil {
			b.Fatalf("failed to load package schema: %v", err)
		}
	}
}

func TestGenEnum(t *testing.T) {
	t.Parallel()
	enum := &model.EnumType{
		Elements: []cty.Value{
			cty.StringVal("foo"),
			cty.StringVal("bar"),
		},
		Type:  model.StringType,
		Token: "my:enum",
		Annotations: []interface{}{
			enumSchemaType{
				Type: &schema.EnumType{Elements: []*schema.Enum{{Value: "foo"}, {Value: "bar"}}},
			},
		},
	}
	safeEnumFunc := func(member *schema.Enum) {}
	unsafeEnumFunc := func(from model.Expression) {}

	d := GenEnum(enum, &model.LiteralValueExpression{
		Value: cty.StringVal("foo"),
	}, safeEnumFunc, unsafeEnumFunc)
	assert.Nil(t, d)

	d = GenEnum(enum, &model.LiteralValueExpression{
		Value: cty.StringVal("Bar"),
	}, safeEnumFunc, unsafeEnumFunc)
	assert.Equal(t, d.Summary, `"Bar" is not a valid value of the enum "my:enum"`)
	assert.Equal(t, d.Detail, `Valid members are "foo", "bar"`)
}