package entity

import (
	"context"
	"math"
	"testing"

	"github.com/stretchr/testify/assert"

	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
)

func TestCluster_CalculateRealMaxRcuWithBurstyRatio(t *testing.T) {
	type args struct {
		maxRcu      uint32
		burstyRatio float32
	}
	tests := []struct {
		name string
		args args
		want uint32
	}{
		{
			name: "10000 x 0.9 want 10000",
			args: args{
				maxRcu:      10000,
				burstyRatio: 0.9,
			},
			want: 10000,
		},
		{
			name: "10000 x 1 want 10000",
			args: args{
				maxRcu:      10000,
				burstyRatio: 1,
			},
			want: 10000,
		},
		{
			name: "10000 x 1.2 want 10000",
			args: args{
				maxRcu:      10000,
				burstyRatio: 1.2,
			},
			want: 12000,
		},
		{
			name: "21032 x 1.2 want 25239",
			args: args{
				maxRcu:      21032,
				burstyRatio: 1.2,
			},
			want: 25239,
		},
		{
			name: "32434 x 1.1 want 35678",
			args: args{
				maxRcu:      32434,
				burstyRatio: 1.1,
			},
			want: 35678,
		},
		{
			name: "12120 x 2.1 want 25452",
			args: args{
				maxRcu:      12120,
				burstyRatio: 2.1,
			},
			want: 25452,
		},
		{
			name: "229496720 x 1.1 want 252446392",
			args: args{
				maxRcu:      229496720,
				burstyRatio: 1.1,
			},
			want: 252446392,
		},
		{
			name: "math.MaxUint32 x 1.1 want math.MaxUint32",
			args: args{
				maxRcu:      math.MaxUint32,
				burstyRatio: 1.1,
			},
			want: math.MaxUint32,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			cluster := &Cluster{
				Cluster: &globalngv1.Cluster{
					MaxRcu: int64(tt.args.maxRcu),
				},
			}
			assert.Equal(t, tt.want, cluster.CalculateRealMaxRcuWithBurstyRatio(context.TODO(),
				tt.args.burstyRatio),
				"calculateRealMaxRcuWithBurstyRatio(%v, %v)",
				tt.args.maxRcu, tt.args.burstyRatio)
		})
	}
}
