package trie

import (
	"sort"
	"testing"

	"github.com/stretchr/testify/assert"
	"go.skia.org/infra/go/deepequal/assertdeep"
	"go.skia.org/infra/go/testutils/unittest"
)

func TestTrie(t *testing.T) {
	unittest.SmallTest(t)
	trie := New()
	trie.Insert([]string{"a", "b", "c"}, "1")
	trie.Insert([]string{"a", "b"}, "2")
	trie.Insert([]string{"c", "b", "a"}, "3")
	trie.Insert([]string{}, "4")
	trie.Insert([]string{"c", "d"}, "5")
	assert.Equal(t, 5, trie.Len())
	searchSubset := func(search []string) []string {
		got := trie.SearchSubset(search)
		rv := make([]string, 0, len(got))
		for _, s := range got {
			rv = append(rv, s.(string))
		}
		sort.Strings(rv)
		return rv
	}
	searchExact := func(search []string) []string {
		got := trie.Search(search)
		rv := make([]string, 0, len(got))
		for _, s := range got {
			rv = append(rv, s.(string))
		}
		sort.Strings(rv)
		return rv
	}
	assertdeep.Equal(t, []string{"4"}, searchSubset([]string{}))
	assertdeep.Equal(t, []string{"4"}, searchExact([]string{}))
	assertdeep.Equal(t, []string{"4"}, searchSubset([]string{"a"}))
	assertdeep.Equal(t, []string{}, searchExact([]string{"a"}))
	assertdeep.Equal(t, []string{"2", "4"}, searchSubset([]string{"a", "b"}))
	assertdeep.Equal(t, []string{"2"}, searchExact([]string{"a", "b"}))
	assertdeep.Equal(t, []string{"1", "2", "3", "4"}, searchSubset([]string{"a", "b", "c"}))
	assertdeep.Equal(t, []string{"1", "3"}, searchExact([]string{"a", "b", "c"}))
	assertdeep.Equal(t, []string{"1", "2", "3", "4", "5"}, searchSubset([]string{"d", "b", "a", "c"}))
	assertdeep.Equal(t, []string{}, searchExact([]string{"d", "b", "a", "c"}))

	trie.Delete([]string{"c", "b", "a"}, "3")
	assert.Equal(t, 4, trie.Len())

	assertdeep.Equal(t, []string{"1", "2", "4"}, searchSubset([]string{"a", "b", "c"}))
	assertdeep.Equal(t, []string{"1", "2", "4", "5"}, searchSubset([]string{"d", "b", "a", "c"}))
}

func TestString(t *testing.T) {
	unittest.SmallTest(t)
	trie := New()
	assert.Equal(t, "Trie(Node([], {}))", trie.String())
	trie.Insert([]string{"a"}, "1")
	assert.Equal(t, `Trie(Node([], {
  "a": Node([1], {}),
}))`, trie.String())
	trie.Insert([]string{"b", "c"}, "2")
	assert.Equal(t, `Trie(Node([], {
  "a": Node([1], {}),
  "b": Node([], {
    "c": Node([2], {}),
  }),
}))`, trie.String())
}

func TestLen(t *testing.T) {
	unittest.SmallTest(t)
	trie := New()
	assert.Equal(t, 0, trie.Len())
	trie.Insert([]string{"a"}, "1")
	assert.Equal(t, 1, trie.Len())
	trie.Insert([]string{"b", "c"}, "2")
	assert.Equal(t, 2, trie.Len())
	trie.Delete([]string{"a"}, "1")
	trie.Delete([]string{"b", "c"}, "2")
	assert.Equal(t, 0, trie.Len())
}
