package resources

import (
	"testing"

	. "github.com/onsi/gomega"
)

func TestCountScaleUpNumber(t *testing.T) {
	cases := []struct {
		TotalTasks        int
		MaxTasksPerEngine int
		AvailableEngine   int
		Expected          int
	}{
		{
			TotalTasks:        10,
			MaxTasksPerEngine: 5,
			AvailableEngine:   2,
			Expected:          0,
		},
		{
			TotalTasks:        11,
			MaxTasksPerEngine: 5,
			AvailableEngine:   2,
			Expected:          1,
		},
		{
			TotalTasks:        15,
			MaxTasksPerEngine: 5,
			AvailableEngine:   2,
			Expected:          1,
		},
	}

	for _, c := range cases {
		t.Run("", func(t *testing.T) {
			g := NewGomegaWithT(t)
			g.Expect(c.Expected).Should(Equal(countScaleUpNumber(c.TotalTasks, c.MaxTasksPerEngine, c.AvailableEngine)),
				"totalTasks: %d, maxTasksPerEngine: %d, availableEngine: %d", c.TotalTasks, c.MaxTasksPerEngine, c.AvailableEngine)
		})
	}
}

func TestCountScaleDownNumber(t *testing.T) {
	cases := []struct {
		TotalTasks        int
		MinTasksPerEngine int
		AvailableEngine   int
		Expected          int
	}{
		{
			TotalTasks:        10,
			MinTasksPerEngine: 5,
			AvailableEngine:   2,
			Expected:          0,
		},
		{
			TotalTasks:        9,
			MinTasksPerEngine: 5,
			AvailableEngine:   2,
			Expected:          0,
		},
		{
			TotalTasks:        9,
			MinTasksPerEngine: 5,
			AvailableEngine:   3,
			Expected:          1,
		},
		{
			TotalTasks:        4,
			MinTasksPerEngine: 5,
			AvailableEngine:   2,
			Expected:          1,
		},
		{
			TotalTasks:        0,
			MinTasksPerEngine: 5,
			AvailableEngine:   2,
			Expected:          2,
		},
	}

	for _, c := range cases {
		t.Run("", func(t *testing.T) {
			g := NewGomegaWithT(t)
			g.Expect(c.Expected).Should(Equal(countScaleDownNumber(c.TotalTasks, c.MinTasksPerEngine, c.AvailableEngine)),
				"totalTasks: %d, minTasksPerEngine: %d, availableEngine: %d", c.TotalTasks, c.MinTasksPerEngine, c.AvailableEngine)
		})
	}
}
