package schedulingconfigs

import "testing"

func TestRoundRobinScheduling_Next(t *testing.T) {
	s := &RoundRobinScheduling{}
	s.Add(&TestCandidate{
		Name:   "a",
		Weight: 5,
	})
	s.Add(&TestCandidate{
		Name:   "b",
		Weight: 10,
	})
	s.Add(&TestCandidate{
		Name:   "c",
		Weight: 20,
	})
	s.Add(&TestCandidate{
		Name:   "d",
		Weight: 30,
	})
	s.Start()

	for _, c := range s.Candidates {
		t.Log(c.(*TestCandidate).Name, c.CandidateWeight())
	}

	t.Log(s.currentWeights)

	for i := 0; i < 100; i ++ {
		t.Log("===", "round", i, "===")
		t.Log(s.Next(nil))
		t.Log(s.currentWeights)
		t.Log(s.rawWeights)
	}
}

func TestRoundRobinScheduling_Two(t *testing.T) {
	s := &RoundRobinScheduling{}
	s.Add(&TestCandidate{
		Name:   "a",
		Weight: 10,
	})
	s.Add(&TestCandidate{
		Name:   "b",
		Weight: 10,
	})
	s.Start()

	for _, c := range s.Candidates {
		t.Log(c.(*TestCandidate).Name, c.CandidateWeight())
	}

	t.Log(s.currentWeights)

	for i := 0; i < 100; i ++ {
		t.Log("===", "round", i, "===")
		t.Log(s.Next(nil))
		t.Log(s.currentWeights)
		t.Log(s.rawWeights)
	}
}

func TestRoundRobinScheduling_NextPerformance(t *testing.T) {
	s := &RoundRobinScheduling{}
	s.Add(&TestCandidate{
		Name:   "a",
		Weight: 1,
	})
	s.Add(&TestCandidate{
		Name:   "b",
		Weight: 2,
	})
	s.Add(&TestCandidate{
		Name:   "c",
		Weight: 3,
	})
	s.Add(&TestCandidate{
		Name:   "d",
		Weight: 6,
	})
	s.Start()

	for _, c := range s.Candidates {
		t.Log(c.(*TestCandidate).Name, c.CandidateWeight())
	}

	t.Log(s.currentWeights)

	hits := map[string]uint{}
	for _, c := range s.Candidates {
		hits[c.(*TestCandidate).Name] = 0
	}
	for i := 0; i < 100*10000; i ++ {
		c := s.Next(nil)
		hits[c.(*TestCandidate).Name] ++
	}

	t.Log(hits)
}
