package loadbalancer

import (
	"testing"

	loadbalance "github.com/yusing/go-proxy/internal/net/http/loadbalancer/types"
	. "github.com/yusing/go-proxy/internal/utils/testing"
)

func TestRebalance(t *testing.T) {
	t.Parallel()
	t.Run("zero", func(t *testing.T) {
		lb := New(new(loadbalance.Config))
		for range 10 {
			lb.AddServer(&Server{})
		}
		lb.rebalance()
		ExpectEqual(t, lb.sumWeight, maxWeight)
	})
	t.Run("less", func(t *testing.T) {
		lb := New(new(loadbalance.Config))
		lb.AddServer(&Server{Weight: loadbalance.Weight(float64(maxWeight) * .1)})
		lb.AddServer(&Server{Weight: loadbalance.Weight(float64(maxWeight) * .2)})
		lb.AddServer(&Server{Weight: loadbalance.Weight(float64(maxWeight) * .3)})
		lb.AddServer(&Server{Weight: loadbalance.Weight(float64(maxWeight) * .2)})
		lb.AddServer(&Server{Weight: loadbalance.Weight(float64(maxWeight) * .1)})
		lb.rebalance()
		// t.Logf("%s", U.Must(json.MarshalIndent(lb.pool, "", "  ")))
		ExpectEqual(t, lb.sumWeight, maxWeight)
	})
	t.Run("more", func(t *testing.T) {
		lb := New(new(loadbalance.Config))
		lb.AddServer(&Server{Weight: loadbalance.Weight(float64(maxWeight) * .1)})
		lb.AddServer(&Server{Weight: loadbalance.Weight(float64(maxWeight) * .2)})
		lb.AddServer(&Server{Weight: loadbalance.Weight(float64(maxWeight) * .3)})
		lb.AddServer(&Server{Weight: loadbalance.Weight(float64(maxWeight) * .4)})
		lb.AddServer(&Server{Weight: loadbalance.Weight(float64(maxWeight) * .3)})
		lb.AddServer(&Server{Weight: loadbalance.Weight(float64(maxWeight) * .2)})
		lb.AddServer(&Server{Weight: loadbalance.Weight(float64(maxWeight) * .1)})
		lb.rebalance()
		// t.Logf("%s", U.Must(json.MarshalIndent(lb.pool, "", "  ")))
		ExpectEqual(t, lb.sumWeight, maxWeight)
	})
}