package dynvar

import (
	"testing"

	"github.com/databricks/cli/libs/dyn"
	assert "github.com/databricks/cli/libs/dyn/dynassert"
	"github.com/stretchr/testify/require"
)

func TestNewRefNoString(t *testing.T) {
	_, ok := newRef(dyn.V(1))
	require.False(t, ok, "should not match non-string")
}

func TestNewRefValidPattern(t *testing.T) {
	for in, refs := range map[string][]string{
		"${hello_world.world_world}": {"hello_world.world_world"},
		"${helloworld.world-world}":  {"helloworld.world-world"},
		"${hello-world.world-world}": {"hello-world.world-world"},
	} {
		ref, ok := newRef(dyn.V(in))
		require.True(t, ok, "should match valid pattern: %s", in)
		assert.Equal(t, refs, ref.references())
	}
}

func TestNewRefInvalidPattern(t *testing.T) {
	invalid := []string{
		"${hello_world-.world_world}",   // the first segment ending must not end with hyphen (-)
		"${hello_world-_.world_world}",  // the first segment ending must not end with underscore (_)
		"${helloworld.world-world-}",    // second segment must not end with hyphen (-)
		"${helloworld-.world-world}",    // first segment must not end with hyphen (-)
		"${helloworld.-world-world}",    // second segment must not start with hyphen (-)
		"${-hello-world.-world-world-}", // must not start or end with hyphen (-)
		"${_-_._-_.id}",                 // cannot use _- in sequence
		"${0helloworld.world-world}",    // interpolated first section shouldn't start with number
		"${helloworld.9world-world}",    // interpolated second section shouldn't start with number
		"${a-a.a-_a-a.id}",              // fails because of -_ in the second segment
		"${a-a.a--a-a.id}",              // fails because of -- in the second segment
	}
	for _, v := range invalid {
		_, ok := newRef(dyn.V(v))
		require.False(t, ok, "should not match invalid pattern: %s", v)
	}
}

func TestIsPureVariableReference(t *testing.T) {
	assert.False(t, IsPureVariableReference(""))
	assert.False(t, IsPureVariableReference("${foo.bar} suffix"))
	assert.False(t, IsPureVariableReference("prefix ${foo.bar}"))
	assert.True(t, IsPureVariableReference("${foo.bar}"))
}