package cluster

import (
	"math"
	"testing"

	"github.com/onsi/gomega"
)

func TestIsExecutionPlanRedact(t *testing.T) {
	tests := []struct {
		name    string
		version string
		want    bool
	}{
		{
			name:    "case 1",
			version: "v7.5.4",
			want:    true,
		},
		{
			name:    "case 2",
			version: "v7.5.3",
			want:    false,
		},
		{
			name:    "case 3",
			version: "v8.1.1",
			want:    true,
		},
		{
			name:    "case 4",
			version: "v8.1.0",
			want:    false,
		},
		{
			name:    "case 5",
			version: "v8.3.0",
			want:    true,
		},
		{
			name:    "case 6",
			version: "v8.2.0",
			want:    false,
		},
		{
			name:    "case 7",
			version: "v7.5",
			want:    false,
		},
		{
			name:    "case 8",
			version: "v7.5.6",
			want:    true,
		},
		{
			name:    "case 9",
			version: "v6.5.1",
			want:    false,
		},
		{
			name:    "case 10",
			version: "v9.1.1",
			want:    true,
		},
		{
			name:    "case 11",
			version: "v8.5.4-cygames",
			want:    true,
		},
		{
			name:    "case 12",
			version: "v7.5.4-customer",
			want:    true,
		},
		{
			name:    "case 13",
			version: "v8.1.0-customer",
			want:    false,
		},
		{
			name:    "case 14",
			version: "v8.1.1+build",
			want:    true,
		},
		{
			name:    "case 15",
			version: "v8.1.x-customer",
			want:    false,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := IsExecutionPlanRedact(tt.version); got != tt.want {
				t.Errorf("IsExecutionPlanRedact() = %v, want %v", got, tt.want)
			}
		})
	}
}

func TestGetMaxValue(t *testing.T) {
	values := make([]MetricValue, 0)
	values = append(values, MetricValue{
		Component: "tidb",
		Value:     uaDouble(2.0),
	})
	values = append(values, MetricValue{
		Component: "tiflash",
		Value:     uaDouble(1.0),
	})
	values = append(values, MetricValue{
		Component: "tikv",
		Value:     uaDouble(4.0),
	})
	values = append(values, MetricValue{
		Component: "pd",
		Value:     uaDouble(3.0),
	})

	v := GetMaxValue(values)

	g := gomega.NewWithT(t)
	g.Expect(v.Component).To(gomega.Equal("tikv"))
	g.Expect(v.Value.String()).To(gomega.Equal("4.000"))

	testV := uaDouble(math.NaN())
	g.Expect(testV.String()).To(gomega.Equal("NaN"))

	g.Expect(Division(1.3, 32).String()).To(gomega.Equal("0.041"))
}

func TestGetMinValue(t *testing.T) {
	values := make([]MetricValue, 0)
	values = append(values, MetricValue{
		Component: "tidb",
		Value:     uaDouble(2.0),
	})
	values = append(values, MetricValue{
		Component: "tiflash",
		Value:     uaDouble(1.0),
	})
	values = append(values, MetricValue{
		Component: "tikv",
		Value:     uaDouble(4.0),
	})
	values = append(values, MetricValue{
		Component: "pd",
		Value:     uaDouble(3.0),
	})

	v := GetMinValue(values)

	g := gomega.NewWithT(t)
	g.Expect(v.Component).To(gomega.Equal("tiflash"))
	g.Expect(v.Value.String()).To(gomega.Equal("1.000"))
}
