package dnstree_test

import (
	"testing"

	"github.com/StackExchange/dnscontrol/v4/pkg/dnstree"
)

func Test_domaintree(t *testing.T) {
	t.Run("Single FQDN",
		executeTreeTest(
			[]string{
				"other.example.com",
			},
			[]string{"other.example.com"},
			[]string{"com", "x.example.com", "x.www.example.com", "example.com"},
		),
	)

	t.Run("Wildcard",
		executeTreeTest(
			[]string{
				"*.example.com",
			},
			[]string{"example.com", "other.example.com"},
			[]string{"com", "example.nl", "*.com"},
		),
	)

	t.Run("Combined domains",
		executeTreeTest(
			[]string{
				"*.other.example.com",
				"specific.example.com",
				"specific.example.nl",
			},
			[]string{"any.other.example.com", "specific.example.com", "specific.example.nl"},
			[]string{"com", "nl", "", "example.nl", "other.nl"},
		),
	)
}

func executeTreeTest(inputs []string, founds []string, missings []string) func(*testing.T) {
	return func(t *testing.T) {
		t.Helper()
		tree := dnstree.Create[interface{}]()
		for _, input := range inputs {
			tree.Set(input, struct{}{})
		}

		for _, found := range founds {
			if tree.Has(found) == false {
				t.Errorf("Expected %s to be found in tree, but is missing", found)
			}
		}

		for _, missing := range missings {
			if tree.Has(missing) == true {
				t.Errorf("Expected %s to be missing in tree, but is found", missing)
			}
		}
	}
}
