package network

import (
	"reflect"
	"testing"

	"github.com/pingcap/tidb-operator/pkg/apis/pingcap/v1alpha1"
	"github.com/stretchr/testify/assert"
)

func TestTracker(t *testing.T) {
	cases := []struct {
		desc   string
		added  TypeAndKey
		check  TypeAndKey
		result bool
	}{
		{
			desc: "normal case",
			added: TypeAndKey{
				Type: reflect.TypeOf(&v1alpha1.Backup{}),
				Name: "aaa",
			},
			check: TypeAndKey{
				Type: reflect.TypeOf(&v1alpha1.Backup{}),
				Name: "aaa",
			},
			result: true,
		},
		{
			desc: "name is not matched",
			added: TypeAndKey{
				Type: reflect.TypeOf(&v1alpha1.Backup{}),
				Name: "aaa",
			},
			check: TypeAndKey{
				Type: reflect.TypeOf(&v1alpha1.Backup{}),
				Name: "bbb",
			},
			result: false,
		},
		{
			desc: "type is not matched",
			added: TypeAndKey{
				Type: reflect.TypeOf(&v1alpha1.Backup{}),
				Name: "aaa",
			},
			check: TypeAndKey{
				Type: reflect.TypeOf(&v1alpha1.Restore{}),
				Name: "aaa",
			},
			result: false,
		},
		{
			desc: "all names are tracked",
			added: TypeAndKey{
				Type: reflect.TypeOf(&v1alpha1.Backup{}),
			},
			check: TypeAndKey{
				Type: reflect.TypeOf(&v1alpha1.Backup{}),
				Name: "aaa",
			},
			result: true,
		},
	}

	for _, c := range cases {
		tr := NewTracker()
		tr.Add(&c.added)

		assert.Equal(t, c.result, tr.Has(&c.check))
	}
}
