package util

import (
	"math"
	"testing"

	"github.com/stretchr/testify/require"
	"github.com/tidbcloud/dataflow-service/app/repo/entity"
)

func TestGetCDCClusterID(t *testing.T) {
	regionID := entity.ID(1)
	clusterID := entity.ID(2)
	cdcClusterID := GetCDCClusterID(regionID, clusterID)
	require.Equal(t, "cdc-1-2", cdcClusterID)
}

func TestSupportCDCMultiClusterVersion(t *testing.T) {
	cases := []struct {
		version string
		result  bool
	}{
		{"v6.2.1", true},
		{"v6.3.1", true},
		{"v6.2.0", true},
		{"v4.1.1", false},
		{"v5.4.2", false},
		{"v6.1.0", false},
		{"v6.2.0-alpha", true},
		{"v6.2.0-beta", true},
		{"v6.2.0-rc", true},
		{"v6.2.0-nightly", true},
		{"v6.1.0-nightly", false},
	}

	for _, c := range cases {
		support, err := SupportCDCMultiClusterVersion(c.version)
		require.NoError(t, err)
		require.Equal(t, c.result, support)
	}
}

func TestGetIPFromHost(t *testing.T) {
	tests := []struct {
		host    string
		isValid bool
	}{
		{
			host:    "10.0.0.1",
			isValid: true,
		},
		{
			host:    "google.com",
			isValid: true,
		},
		{
			host:    "*invaliddomain.",
			isValid: false,
		},
		{
			host:    "",
			isValid: false,
		},
	}
	for _, test := range tests {
		if ip := GetIPFromHost(test.host); test.isValid {
			require.NotNil(t, ip)
		} else {
			require.Nil(t, ip)
		}
	}
}

func TestByteToGBFloat64(t *testing.T) {
	testCases := []struct {
		input  float64
		output float64
	}{
		{
			input:  918470000,
			output: 0.855391845107,
		},
		{
			input:  8739889343,
			output: 8.1396562447771,
		},
	}
	for _, c := range testCases {
		require.Less(t, math.Abs(c.output-ByteToGBFloat64(c.input)), 0.000000001)
	}
}
