package v2 // import "github.com/docker/docker/plugin/v2"

import (
	"reflect"
	"testing"
)

func TestNewSettable(t *testing.T) {
	contexts := []struct {
		arg   string
		name  string
		field string
		value string
		err   error
	}{
		{"name=value", "name", "", "value", nil},
		{"name", "name", "", "", nil},
		{"name.field=value", "name", "field", "value", nil},
		{"name.field", "name", "field", "", nil},
		{"=value", "", "", "", errInvalidFormat},
		{"=", "", "", "", errInvalidFormat},
	}

	for _, c := range contexts {
		s, err := newSettable(c.arg)
		if err != c.err {
			t.Fatalf("expected error to be %v, got %v", c.err, err)
		}

		if s.name != c.name {
			t.Fatalf("expected name to be %q, got %q", c.name, s.name)
		}

		if s.field != c.field {
			t.Fatalf("expected field to be %q, got %q", c.field, s.field)
		}

		if s.value != c.value {
			t.Fatalf("expected value to be %q, got %q", c.value, s.value)
		}

	}
}

func TestIsSettable(t *testing.T) {
	contexts := []struct {
		allowedSettableFields []string
		set                   settable
		settable              []string
		result                bool
		err                   error
	}{
		{allowedSettableFieldsEnv, settable{}, []string{}, false, nil},
		{allowedSettableFieldsEnv, settable{field: "value"}, []string{}, false, nil},
		{allowedSettableFieldsEnv, settable{}, []string{"value"}, true, nil},
		{allowedSettableFieldsEnv, settable{field: "value"}, []string{"value"}, true, nil},
		{allowedSettableFieldsEnv, settable{field: "foo"}, []string{"value"}, false, nil},
		{allowedSettableFieldsEnv, settable{field: "foo"}, []string{"foo"}, false, nil},
		{allowedSettableFieldsEnv, settable{}, []string{"value1", "value2"}, false, errMultipleFields},
	}

	for _, c := range contexts {
		if res, err := c.set.isSettable(c.allowedSettableFields, c.settable); res != c.result {
			t.Fatalf("expected result to be %t, got %t", c.result, res)
		} else if err != c.err {
			t.Fatalf("expected error to be %v, got %v", c.err, err)
		}
	}
}

func TestUpdateSettingsEnv(t *testing.T) {
	contexts := []struct {
		env    []string
		set    settable
		newEnv []string
	}{
		{[]string{}, settable{name: "DEBUG", value: "1"}, []string{"DEBUG=1"}},
		{[]string{"DEBUG=0"}, settable{name: "DEBUG", value: "1"}, []string{"DEBUG=1"}},
		{[]string{"FOO=0"}, settable{name: "DEBUG", value: "1"}, []string{"FOO=0", "DEBUG=1"}},
		{[]string{"FOO=0", "DEBUG=0"}, settable{name: "DEBUG", value: "1"}, []string{"FOO=0", "DEBUG=1"}},
		{[]string{"FOO=0", "DEBUG=0", "BAR=1"}, settable{name: "DEBUG", value: "1"}, []string{"FOO=0", "DEBUG=1", "BAR=1"}},
	}

	for _, c := range contexts {
		updateSettingsEnv(&c.env, &c.set)

		if !reflect.DeepEqual(c.env, c.newEnv) {
			t.Fatalf("expected env to be %q, got %q", c.newEnv, c.env)
		}
	}
}
