// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package envvar

import (
	"os"
	"reflect"
	"testing"
)

func TestMapSliceFuncs(t *testing.T) {
	tests := []struct {
		FromMap, Map     map[string]string
		FromSlice, Slice []string
	}{
		{nil, map[string]string{}, nil, []string{}},
		{ // Empty keys are silently dropped.
			map[string]string{"": ""}, map[string]string{},
			[]string{"", "=", "=123"}, []string{},
		},
		{ // Values may be empty, slices may be missing equal sign.
			map[string]string{"A": "", "B": "", "": ""},
			map[string]string{"A": "", "B": ""},
			[]string{"A=", "B", ""},
			[]string{"A=", "B="},
		},
		{ // Values may contain equal sign.
			map[string]string{"A": "=", "B": "==", "C": "=0=", "": ""},
			map[string]string{"A": "=", "B": "==", "C": "=0="},
			[]string{"A==", "B===", "C==0=", ""},
			[]string{"A==", "B===", "C==0="},
		},
		{ // Duplicates in slice takes last element.
			map[string]string{"A": "1", "": ""},
			map[string]string{"A": "1"},
			[]string{"A=9", "A=1", ""},
			[]string{"A=1"},
		},
		{ // Slice items are sorted.
			map[string]string{"A": "2", "B": "1", "C": "3", "": ""},
			map[string]string{"A": "2", "B": "1", "C": "3"},
			[]string{"C=3", "A=9", "B=1", "A=2", ""},
			[]string{"A=2", "B=1", "C=3"},
		},
		{ // A bunch of different items.
			map[string]string{"A": "2", "B": "", "C": "=3=", "": ""},
			map[string]string{"A": "2", "B": "", "C": "=3="},
			[]string{"C==3=", "A=9", "B=1", "B", "", "A=2"},
			[]string{"A=2", "B=", "C==3="},
		},
	}
	for _, test := range tests {
		// Test map to slice conversions.
		if got, want := MapToSlice(test.FromMap), test.Slice; !reflect.DeepEqual(got, want) {
			t.Errorf("MapToSlice(%v) got %v, want %v", test.FromMap, got, want)
		}
		if got, want := MapToSlice(test.Map), test.Slice; !reflect.DeepEqual(got, want) {
			t.Errorf("MapToSlice(%v) got %v, want %v", test.Map, got, want)
		}
		// Test slice to map conversions.
		if got, want := SliceToMap(test.FromSlice), test.Map; !reflect.DeepEqual(got, want) {
			t.Errorf("SliceToMap(%v) got %v, want %v", test.FromSlice, got, want)
		}
		if got, want := SliceToMap(test.Slice), test.Map; !reflect.DeepEqual(got, want) {
			t.Errorf("SliceToMap(%v) got %v, want %v", test.Slice, got, want)
		}
		// Test MergeMaps merging each map multiple times.
		var maps []map[string]string
		for ix := 0; ix < 3; ix++ {
			maps = append(maps, test.FromMap, test.Map)
		}
		if got, want := MergeMaps(maps...), test.Map; !reflect.DeepEqual(got, want) {
			t.Errorf("MergeMaps got %v, want %v", got, want)
		}
		// Test MergeSlices merging each slice multiple times.
		var slices [][]string
		for ix := 0; ix < 3; ix++ {
			slices = append(slices, test.FromSlice, test.Slice)
		}
		if got, want := MergeSlices(slices...), test.Slice; !reflect.DeepEqual(got, want) {
			t.Errorf("MergeSlices got %v, want %v", got, want)
		}
		// Test MergeMaps with a single map performs a copy.
		mergedMap := MergeMaps(test.Map)
		mergedMap["Z"] = "zzz"
		if reflect.DeepEqual(mergedMap, test.Map) {
			t.Errorf("MergeMaps(%v) failed copy semantics", mergedMap)
		}
		// TestMergeSlices with a single slice performs a copy.
		mergedSlice := MergeSlices(test.Slice)
		if len(mergedSlice) > 0 {
			mergedSlice[0] = "Z=zzz"
			if reflect.DeepEqual(mergedSlice, test.Slice) {
				t.Errorf("MergeSlices(%v) failed copy semantics", mergedSlice)
			}
		}
	}
}

func TestSplitJoinKeyValue(t *testing.T) {
	tests := []struct {
		KV, Key, Value string
	}{
		{"", "", ""},
		{"=", "", ""},
		{"=123", "", "123"},
		{"A=123", "A", "123"},
		{"A==123", "A", "=123"},
		{"A==123=", "A", "=123="},
		{"A=a b c", "A", "a b c"},
		{"A==a b c", "A", "=a b c"},
	}
	for _, test := range tests {
		key, value := SplitKeyValue(test.KV)
		if got, want := key, test.Key; got != want {
			t.Errorf("SplitKeyValue got key %q, want %q", got, want)
		}
		if got, want := value, test.Value; got != want {
			t.Errorf("SplitKeyValue got value %q, want %q", got, want)
		}
		if test.KV == "" {
			continue
		}
		if got, want := JoinKeyValue(key, value), test.KV; got != want {
			t.Errorf("JoinKeyValue got %q, want %q", got, want)
		}
	}
}

func TestSplitJoinTokens(t *testing.T) {
	tests := []struct {
		Sep, FromValue, Value string
		FromTokens, Tokens    []string
	}{
		{":", "", "", nil, nil},
		{":", ":::", "", nil, nil},
		{":", ":ABC:", "ABC", []string{"", "ABC", ""}, []string{"ABC"}},
		{":", ":A:B:C:", "A:B:C", []string{"", "A", "", "B", "", "C", ""}, []string{"A", "B", "C"}},
	}
	for _, test := range tests {
		if got, want := SplitTokens(test.FromValue, test.Sep), test.Tokens; !reflect.DeepEqual(got, want) {
			t.Errorf("SplitTokens(%v) got %v, want %v", test.FromValue, got, want)
		}
		if got, want := SplitTokens(test.Value, test.Sep), test.Tokens; !reflect.DeepEqual(got, want) {
			t.Errorf("SplitTokens(%v) got %v, want %v", test.Value, got, want)
		}
		if got, want := JoinTokens(test.FromTokens, test.Sep), test.Value; got != want {
			t.Errorf("JoinTokens(%v) got %v, want %v", test.FromTokens, got, want)
		}
		if got, want := JoinTokens(test.Tokens, test.Sep), test.Value; got != want {
			t.Errorf("JoinTokens(%v) got %v, want %v", test.Tokens, got, want)
		}
	}
}

func TestSortByKey(t *testing.T) {
	tests := []struct {
		In, Sorted []string
	}{
		{nil, nil},
		{[]string{}, []string{}},
		{[]string{"A"}, []string{"A"}},
		{
			[]string{"C=foo", "A", "B="},
			[]string{"A", "B=", "C=foo"},
		},
		{
			[]string{"A1=b", "AB=d", "A=a", "AZ=e", "A2=c"},
			[]string{"A=a", "A1=b", "A2=c", "AB=d", "AZ=e"},
		},
	}
	for _, test := range tests {
		var in []string
		if test.In != nil {
			in = make([]string, len(test.In))
			copy(in, test.In)
		}
		SortByKey(in)
		if got, want := in, test.Sorted; !reflect.DeepEqual(got, want) {
			t.Errorf("got %#v, want %#v", got, want)
		}
	}
}

// expectVarsA expects vars to contain A=123
func expectVarsA(t *testing.T, vars *Vars) {
	if got, want := vars.Contains("A"), true; got != want {
		t.Errorf(`Contains("A") got %v, want %v`, got, want)
	}
	if got, want := vars.Contains("B"), false; got != want {
		t.Errorf(`Contains("B") got %v, want %v`, got, want)
	}
	if got, want := vars.Contains("C"), false; got != want {
		t.Errorf(`Contains("C") got %v, want %v`, got, want)
	}
	if got, want := vars.Contains("D"), false; got != want {
		t.Errorf(`Contains("D") got %v, want %v`, got, want)
	}
	if got, want := vars.Get("A"), "123"; got != want {
		t.Errorf(`Get("A") got %v, want %v`, got, want)
	}
	if got, want := vars.Get("B"), ""; got != want {
		t.Errorf(`Get("B") got %v, want %v`, got, want)
	}
	if got, want := vars.Get("C"), ""; got != want {
		t.Errorf(`Get("C") got %v, want %v`, got, want)
	}
	if got, want := vars.Get("D"), ""; got != want {
		t.Errorf(`Get("D") got %v, want %v`, got, want)
	}
	if got, want := vars.GetTokens("A", ":"), []string{"123"}; !reflect.DeepEqual(got, want) {
		t.Errorf(`GetTokens("A") got %v, want %v`, got, want)
	}
	if got, want := vars.GetTokens("B", ":"), []string(nil); !reflect.DeepEqual(got, want) {
		t.Errorf(`GetTokens("B") got %v, want %v`, got, want)
	}
	if got, want := vars.GetTokens("C", ":"), []string(nil); !reflect.DeepEqual(got, want) {
		t.Errorf(`GetTokens("C") got %v, want %v`, got, want)
	}
	if got, want := vars.GetTokens("D", ":"), []string(nil); !reflect.DeepEqual(got, want) {
		t.Errorf(`GetTokens("D") got %v, want %v`, got, want)
	}
	if got, want := vars.ToMap(), map[string]string{"A": "123"}; !reflect.DeepEqual(got, want) {
		t.Errorf(`ToMap() got %v, want %v`, got, want)
	}
	if got, want := vars.ToSlice(), []string{"A=123"}; !reflect.DeepEqual(got, want) {
		t.Errorf(`ToSlice() got %v, want %v`, got, want)
	}
}

// expectVarsAB expects vars to contain A=123 B=x:y:z
func expectVarsAB(t *testing.T, vars *Vars) {
	if got, want := vars.Contains("A"), true; got != want {
		t.Errorf(`Contains("A") got %v, want %v`, got, want)
	}
	if got, want := vars.Contains("B"), true; got != want {
		t.Errorf(`Contains("B") got %v, want %v`, got, want)
	}
	if got, want := vars.Contains("C"), false; got != want {
		t.Errorf(`Contains("C") got %v, want %v`, got, want)
	}
	if got, want := vars.Contains("D"), false; got != want {
		t.Errorf(`Contains("D") got %v, want %v`, got, want)
	}
	if got, want := vars.Get("A"), "123"; got != want {
		t.Errorf(`Get("A") got %v, want %v`, got, want)
	}
	if got, want := vars.Get("B"), "x:y:z"; got != want {
		t.Errorf(`Get("B") got %v, want %v`, got, want)
	}
	if got, want := vars.Get("C"), ""; got != want {
		t.Errorf(`Get("C") got %v, want %v`, got, want)
	}
	if got, want := vars.Get("D"), ""; got != want {
		t.Errorf(`Get("D") got %v, want %v`, got, want)
	}
	if got, want := vars.GetTokens("A", ":"), []string{"123"}; !reflect.DeepEqual(got, want) {
		t.Errorf(`GetTokens("A") got %v, want %v`, got, want)
	}
	if got, want := vars.GetTokens("B", ":"), []string{"x", "y", "z"}; !reflect.DeepEqual(got, want) {
		t.Errorf(`GetTokens("B") got %v, want %v`, got, want)
	}
	if got, want := vars.GetTokens("C", ":"), []string(nil); !reflect.DeepEqual(got, want) {
		t.Errorf(`GetTokens("C") got %v, want %v`, got, want)
	}
	if got, want := vars.GetTokens("D", ":"), []string(nil); !reflect.DeepEqual(got, want) {
		t.Errorf(`GetTokens("D") got %v, want %v`, got, want)
	}
	if got, want := vars.ToMap(), map[string]string{"A": "123", "B": "x:y:z"}; !reflect.DeepEqual(got, want) {
		t.Errorf(`ToMap() got %v, want %v`, got, want)
	}
	if got, want := vars.ToSlice(), []string{"A=123", "B=x:y:z"}; !reflect.DeepEqual(got, want) {
		t.Errorf(`ToSlice() got %v, want %v`, got, want)
	}
}

// expectVarsAC expects vars to contain A=123 C=foo
func expectVarsAC(t *testing.T, vars *Vars) {
	if got, want := vars.Contains("A"), true; got != want {
		t.Errorf(`Contains("A") got %v, want %v`, got, want)
	}
	if got, want := vars.Contains("B"), false; got != want {
		t.Errorf(`Contains("B") got %v, want %v`, got, want)
	}
	if got, want := vars.Contains("C"), true; got != want {
		t.Errorf(`Contains("C") got %v, want %v`, got, want)
	}
	if got, want := vars.Contains("D"), false; got != want {
		t.Errorf(`Contains("D") got %v, want %v`, got, want)
	}
	if got, want := vars.Get("A"), "123"; got != want {
		t.Errorf(`Get("A") got %v, want %v`, got, want)
	}
	if got, want := vars.Get("B"), ""; got != want {
		t.Errorf(`Get("B") got %v, want %v`, got, want)
	}
	if got, want := vars.Get("C"), "foo"; got != want {
		t.Errorf(`Get("C") got %v, want %v`, got, want)
	}
	if got, want := vars.Get("D"), ""; got != want {
		t.Errorf(`Get("D") got %v, want %v`, got, want)
	}
	if got, want := vars.GetTokens("A", ":"), []string{"123"}; !reflect.DeepEqual(got, want) {
		t.Errorf(`GetTokens("A") got %v, want %v`, got, want)
	}
	if got, want := vars.GetTokens("B", ":"), []string(nil); !reflect.DeepEqual(got, want) {
		t.Errorf(`GetTokens("B") got %v, want %v`, got, want)
	}
	if got, want := vars.GetTokens("C", ":"), []string{"foo"}; !reflect.DeepEqual(got, want) {
		t.Errorf(`GetTokens("C") got %v, want %v`, got, want)
	}
	if got, want := vars.GetTokens("D", ":"), []string(nil); !reflect.DeepEqual(got, want) {
		t.Errorf(`GetTokens("D") got %v, want %v`, got, want)
	}
	if got, want := vars.ToMap(), map[string]string{"A": "123", "C": "foo"}; !reflect.DeepEqual(got, want) {
		t.Errorf(`ToMap() got %v, want %v`, got, want)
	}
	if got, want := vars.ToSlice(), []string{"A=123", "C=foo"}; !reflect.DeepEqual(got, want) {
		t.Errorf(`ToSlice() got %v, want %v`, got, want)
	}
}

var v123, vxyz, vfoo = "123", "x:y:z", "foo"

func TestZeroVars(t *testing.T) {
	var vars Vars
	if got, want := vars.Contains("A"), false; got != want {
		t.Errorf(`Contains("A") got %v, want %v`, got, want)
	}
	if got, want := vars.Get("A"), ""; got != want {
		t.Errorf(`Get("A") got %v, want %v`, got, want)
	}
	if got, want := vars.GetTokens("A", ":"), []string(nil); !reflect.DeepEqual(got, want) {
		t.Errorf(`GetTokens("A") got %v, want %v`, got, want)
	}
	if got, want := vars.ToMap(), map[string]string{}; !reflect.DeepEqual(got, want) {
		t.Errorf(`ToMap() got %v, want %v`, got, want)
	}
	if got, want := vars.ToSlice(), []string{}; !reflect.DeepEqual(got, want) {
		t.Errorf(`ToSlice() got %v, want %v`, got, want)
	}
	if got, want := vars.Deltas(), map[string]*string{}; !reflect.DeepEqual(got, want) {
		t.Errorf(`Deltas() got %v, want %v`, got, want)
	}
	// Mutate some values.
	vars.Set("A", "123")
	vars.SetTokens("B", []string{"x", "y", "z"}, ":")
	vars.Delete("C")
	expectVarsAB(t, &vars)
	if got, want := vars.Deltas(), map[string]*string{"A": &v123, "B": &vxyz, "C": nil}; !reflect.DeepEqual(got, want) {
		t.Errorf(`Deltas() got %v, want %v`, got, want)
	}
	// Delete an existing value.
	vars.Delete("B")
	expectVarsA(t, &vars)
	if got, want := vars.Deltas(), map[string]*string{"A": &v123, "B": nil, "C": nil}; !reflect.DeepEqual(got, want) {
		t.Errorf(`Deltas() got %v, want %v`, got, want)
	}
	// Set a previously deleted value.
	vars.Set("C", "foo")
	expectVarsAC(t, &vars)
	if got, want := vars.Deltas(), map[string]*string{"A": &v123, "B": nil, "C": &vfoo}; !reflect.DeepEqual(got, want) {
		t.Errorf(`Deltas() got %v, want %v`, got, want)
	}
}

func TestVarsFromMap(t *testing.T) {
	vars := VarsFromMap(map[string]string{"A": "123", "B": "x:y:z"})
	expectVarsAB(t, vars)
	if got, want := vars.Deltas(), map[string]*string{}; !reflect.DeepEqual(got, want) {
		t.Errorf(`Deltas() got %v, want %v`, got, want)
	}
	// Delete a non-existent value.
	vars.Delete("C")
	expectVarsAB(t, vars)
	if got, want := vars.Deltas(), map[string]*string{"C": nil}; !reflect.DeepEqual(got, want) {
		t.Errorf(`Deltas() got %v, want %v`, got, want)
	}
	// Delete an existing value.
	vars.Delete("B")
	expectVarsA(t, vars)
	if got, want := vars.Deltas(), map[string]*string{"B": nil, "C": nil}; !reflect.DeepEqual(got, want) {
		t.Errorf(`Deltas() got %v, want %v`, got, want)
	}
	// Set a previously deleted value.
	vars.Set("C", "foo")
	expectVarsAC(t, vars)
	if got, want := vars.Deltas(), map[string]*string{"B": nil, "C": &vfoo}; !reflect.DeepEqual(got, want) {
		t.Errorf(`Deltas() got %v, want %v`, got, want)
	}
}

func TestVarsFromSlice(t *testing.T) {
	vars := VarsFromSlice([]string{"A=123", "B=x:y:z"})
	expectVarsAB(t, vars)
	if got, want := vars.Deltas(), map[string]*string{}; !reflect.DeepEqual(got, want) {
		t.Errorf(`Deltas() got %v, want %v`, got, want)
	}
	// Delete a non-existent value.
	vars.Delete("C")
	expectVarsAB(t, vars)
	if got, want := vars.Deltas(), map[string]*string{"C": nil}; !reflect.DeepEqual(got, want) {
		t.Errorf(`Deltas() got %v, want %v`, got, want)
	}
	// Delete an existing value.
	vars.Delete("B")
	expectVarsA(t, vars)
	if got, want := vars.Deltas(), map[string]*string{"B": nil, "C": nil}; !reflect.DeepEqual(got, want) {
		t.Errorf(`Deltas() got %v, want %v`, got, want)
	}
	// Set a previously deleted value.
	vars.Set("C", "foo")
	expectVarsAC(t, vars)
	if got, want := vars.Deltas(), map[string]*string{"B": nil, "C": &vfoo}; !reflect.DeepEqual(got, want) {
		t.Errorf(`Deltas() got %v, want %v`, got, want)
	}
}

func TestVarsFromOS(t *testing.T) {
	// Set an environment variable and make sure it shows up.
	const testKey, testValue = "OS_ENV_TEST_KEY", "OS_ENV_TEST_VAL"
	if err := os.Setenv(testKey, testValue); err != nil {
		t.Fatalf("Setenv(%q, %q) failed: %v", testKey, testValue, err)
	}
	defer os.Unsetenv(testKey)
	vars := VarsFromOS()
	if got, want := vars.Contains(testKey), true; got != want {
		t.Errorf(`Contains(%q) got %v, want %v`, testKey, got, want)
	}
	if got, want := vars.Get(testKey), testValue; got != want {
		t.Errorf(`Get(%q) got %v, want %v`, testKey, got, want)
	}
	if got, want := vars.GetTokens(testKey, ":"), []string{testValue}; !reflect.DeepEqual(got, want) {
		t.Errorf(`GetTokens(%q) got %v, want %v`, testKey, got, want)
	}
	if got, want := vars.Deltas(), map[string]*string{}; !reflect.DeepEqual(got, want) {
		t.Errorf(`Deltas() got %v, want %v`, got, want)
	}
}
