package controller

import (
	"reflect"
	"testing"

	"github.com/stretchr/testify/assert"

	"github.com/argoproj/argo-cd/gitops-engine/pkg/sync/common"
	. "github.com/argoproj/argo-cd/gitops-engine/pkg/utils/testing"
	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
)

func TestFilterObjectsForDeletion(t *testing.T) {
	tests := []struct {
		input []string
		want  []string
	}{
		{[]string{"1", "5", "7", "7", "4"}, []string{"7", "7"}},
		{[]string{"1", "5", "2", "2", "4"}, []string{"5"}},
		{[]string{"1"}, []string{"1"}},
		{[]string{}, []string{}},
	}
	for _, tt := range tests {
		in := sliceOfObjectsWithSyncWaves(tt.input)
		need := sliceOfObjectsWithSyncWaves(tt.want)
		got := FilterObjectsForDeletion(in)
		assert.True(t, reflect.DeepEqual(got, need), "Received unexpected objects for deletion")
	}
}

func podWithSyncWave(wave string) *unstructured.Unstructured {
	return Annotate(NewPod(), common.AnnotationSyncWave, wave)
}

func sliceOfObjectsWithSyncWaves(waves []string) []*unstructured.Unstructured {
	objects := make([]*unstructured.Unstructured, 0)
	for _, wave := range waves {
		objects = append(objects, podWithSyncWave(wave))
	}
	return objects
}
