package util

import (
	"sort"
	"testing"

	"github.com/stretchr/testify/require"
	"go.skia.org/infra/go/testutils/unittest"
)

func TestStringSets(t *testing.T) {
	unittest.SmallTest(t)
	ret := NewStringSet([]string{"abc", "abc"}, []string{"efg", "abc"}).Keys()
	sort.Strings(ret)
	require.Equal(t, []string{"abc", "efg"}, ret)

	require.Empty(t, NewStringSet().Keys())
	require.Equal(t, []string{"abc"}, NewStringSet([]string{"abc"}).Keys())
	require.Equal(t, []string{"abc"}, NewStringSet([]string{"abc", "abc", "abc"}).Keys())
}

func TestStringSetCopy(t *testing.T) {
	unittest.SmallTest(t)
	someKeys := []string{"gamma", "beta", "alpha"}
	orig := NewStringSet(someKeys)
	copy := orig.Copy()

	delete(orig, "alpha")
	orig["mu"] = true

	require.True(t, copy["alpha"])
	require.True(t, copy["beta"])
	require.True(t, copy["gamma"])
	require.False(t, copy["mu"])

	delete(copy, "beta")
	copy["nu"] = true

	require.False(t, orig["alpha"])
	require.True(t, orig["beta"])
	require.True(t, orig["gamma"])
	require.True(t, orig["mu"])
	require.False(t, orig["nu"])

	require.Nil(t, (StringSet(nil)).Copy())
}

func TestStringSetKeys(t *testing.T) {
	unittest.SmallTest(t)
	expectedKeys := []string{"gamma", "beta", "alpha"}
	s := NewStringSet(append(expectedKeys, expectedKeys...))
	keys := s.Keys()
	require.Equal(t, 3, len(keys))
	require.True(t, In("alpha", keys))
	require.True(t, In("beta", keys))
	require.True(t, In("gamma", keys))

	s = nil
	keys = s.Keys()
	require.Empty(t, keys)
}

func TestStringSetIntersect(t *testing.T) {
	unittest.SmallTest(t)
	someKeys := []string{"gamma", "beta", "alpha"}
	otherKeys := []string{"mu", "nu", "omicron"}
	a := NewStringSet(append(someKeys, otherKeys...))
	b := NewStringSet(someKeys)
	c := a.Intersect(b)

	keys := c.Keys()
	require.Equal(t, 3, len(keys))
	require.True(t, In("alpha", keys))
	require.True(t, In("beta", keys))
	require.True(t, In("gamma", keys))

	d := b.Intersect(a)
	keys = d.Keys()
	require.Equal(t, 3, len(keys))
	require.True(t, In("alpha", keys))
	require.True(t, In("beta", keys))
	require.True(t, In("gamma", keys))
}

func TestStringSetComplement(t *testing.T) {
	unittest.SmallTest(t)
	someKeys := []string{"gamma", "beta", "alpha"}
	otherKeys := []string{"mu", "nu", "omicron"}
	a := NewStringSet(append(someKeys, otherKeys...))
	b := NewStringSet(someKeys)
	c := a.Complement(b)

	keys := c.Keys()
	require.Equal(t, 3, len(keys))
	require.True(t, In("mu", keys))
	require.True(t, In("nu", keys))
	require.True(t, In("omicron", keys))

	d := b.Complement(a)
	require.Empty(t, d.Keys())
}

func TestStringSetUnion(t *testing.T) {
	unittest.SmallTest(t)
	someKeys := []string{"gamma", "beta", "alpha", "zeta"}
	otherKeys := []string{"mu", "nu", "omicron", "zeta"}
	a := NewStringSet(otherKeys)
	b := NewStringSet(someKeys)
	c := a.Union(b)

	keys := c.Keys()
	require.Equal(t, 7, len(keys))
	require.True(t, In("alpha", keys))
	require.True(t, In("beta", keys))
	require.True(t, In("gamma", keys))
	require.True(t, In("zeta", keys))
	require.True(t, In("mu", keys))
	require.True(t, In("nu", keys))
	require.True(t, In("omicron", keys))

	d := b.Union(a)
	keys = d.Keys()
	require.Equal(t, 7, len(keys))
	require.True(t, In("alpha", keys))
	require.True(t, In("beta", keys))
	require.True(t, In("gamma", keys))
	require.True(t, In("zeta", keys))
	require.True(t, In("mu", keys))
	require.True(t, In("nu", keys))
	require.True(t, In("omicron", keys))
}

func TestStringSetEqual(t *testing.T) {
	unittest.SmallTest(t)
	require.True(t, StringSet(nil).Equals(nil))
	require.True(t, NewStringSet(nil).Equals(nil))
	require.True(t, NewStringSet(nil).Equals(NewStringSet(nil)))
	require.True(t, NewStringSet([]string{}).Equals(nil))
	someKeys := []string{"gamma", "beta", "alpha", "zeta"}
	require.True(t, NewStringSet(someKeys).Equals(NewStringSet(someKeys)))
	require.False(t, NewStringSet(someKeys).Equals(NewStringSet(someKeys[:3])))
	require.False(t, NewStringSet(someKeys[:3]).Equals(NewStringSet(someKeys)))
	require.True(t, NewStringSet(someKeys[:1]).Equals(NewStringSet(someKeys[:1])))
	require.False(t, NewStringSet(someKeys[:1]).Equals(NewStringSet(someKeys[1:2])))
	require.False(t, NewStringSet(someKeys[0:1]).Equals(NewStringSet(someKeys[2:3])))
}
