package flags

import (
	"flag"
	"reflect"
	"testing"

	"github.com/hashicorp/nomad/ci"
	"github.com/stretchr/testify/require"
)

func TestStringFlag_implements(t *testing.T) {
	ci.Parallel(t)

	var raw interface{}
	raw = new(StringFlag)
	if _, ok := raw.(flag.Value); !ok {
		t.Fatalf("StringFlag should be a Value")
	}
}

func TestStringFlagSet(t *testing.T) {
	ci.Parallel(t)

	sv := new(StringFlag)
	err := sv.Set("foo")
	if err != nil {
		t.Fatalf("err: %s", err)
	}

	err = sv.Set("bar")
	if err != nil {
		t.Fatalf("err: %s", err)
	}

	expected := []string{"foo", "bar"}
	if !reflect.DeepEqual([]string(*sv), expected) {
		t.Fatalf("Bad: %#v", sv)
	}
}
func TestStringFlagSet_Append(t *testing.T) {
	ci.Parallel(t)

	var (
		// A test to make sure StringFlag can replace AppendSliceValue
		// for autopilot flags inherited from Consul.
		hosts StringFlag
	)

	flagSet := flag.NewFlagSet("test", flag.PanicOnError)
	flagSet.Var(&hosts, "host", "host, specify more than once")

	args := []string{"-host", "foo", "-host", "bar", "-host", "baz"}
	err := flagSet.Parse(args)
	require.NoError(t, err)

	result := hosts.String()
	require.Equal(t, "foo,bar,baz", result)
}
