package cdc

import (
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestGetValidTags(t *testing.T) {
	testcases := []struct {
		name           string
		input          map[string]string
		expectedOutput map[string]string
	}{
		{
			name:           "nil map",
			input:          nil,
			expectedOutput: map[string]string{},
		},
		{
			name:           "empty map",
			input:          map[string]string{},
			expectedOutput: map[string]string{},
		},
		{
			name: "invalid prefix",
			input: map[string]string{
				"-abc": "a",
				"1abc": "a",
				"_abc": "a",
				"abc":  "a",
			},
			expectedOutput: map[string]string{
				"abc": "a",
			},
		},
		{
			name: "invalid character",
			input: map[string]string{
				"aAa": "a",
				"a.a": "a",
				"^a":  "a",
				"a?":  "a",
				"abc": "a",
			},
			expectedOutput: map[string]string{
				"abc": "a",
			},
		},
		{
			name: "invalid length",
			input: map[string]string{
				"": "a",
				"aaaaaaaaaabbbbbbbbbb11111111112222222222": "a",
				"abc": "a",
			},
			expectedOutput: map[string]string{
				"abc": "a",
			},
		},
		{
			name: "valid tags",
			input: map[string]string{
				"component": "ticdc",
				"a":         "a",
				"a1":        "a",
				"a-a-1":     "a",
				"a_a_1":     "a",
				"a_1-1-_":   "a",
			},
			expectedOutput: map[string]string{
				"component": "ticdc",
				"a":         "a",
				"a1":        "a",
				"a-a-1":     "a",
				"a_a_1":     "a",
				"a_1-1-_":   "a",
			},
		},
	}

	for _, tc := range testcases {
		t.Run(tc.name, func(t *testing.T) {
			tags := getValidTags(tc.input)
			assert.Equal(t, tc.expectedOutput, tags)
		})
	}
}
