package spec_iterator_test

import (
	. "github.com/onsi/ginkgo"
	. "github.com/onsi/ginkgo/internal/spec_iterator"
	. "github.com/onsi/gomega"
)

var _ = Describe("ParallelizedIndexRange", func() {
	var startIndex, count int

	It("should return the correct index range for 4 tests on 2 nodes", func() {
		startIndex, count = ParallelizedIndexRange(4, 2, 1)
		Ω(startIndex).Should(Equal(0))
		Ω(count).Should(Equal(2))

		startIndex, count = ParallelizedIndexRange(4, 2, 2)
		Ω(startIndex).Should(Equal(2))
		Ω(count).Should(Equal(2))
	})

	It("should return the correct index range for 5 tests on 2 nodes", func() {
		startIndex, count = ParallelizedIndexRange(5, 2, 1)
		Ω(startIndex).Should(Equal(0))
		Ω(count).Should(Equal(3))

		startIndex, count = ParallelizedIndexRange(5, 2, 2)
		Ω(startIndex).Should(Equal(3))
		Ω(count).Should(Equal(2))
	})

	It("should return the correct index range for 5 tests on 3 nodes", func() {
		startIndex, count = ParallelizedIndexRange(5, 3, 1)
		Ω(startIndex).Should(Equal(0))
		Ω(count).Should(Equal(2))

		startIndex, count = ParallelizedIndexRange(5, 3, 2)
		Ω(startIndex).Should(Equal(2))
		Ω(count).Should(Equal(2))

		startIndex, count = ParallelizedIndexRange(5, 3, 3)
		Ω(startIndex).Should(Equal(4))
		Ω(count).Should(Equal(1))
	})

	It("should return the correct index range for 5 tests on 4 nodes", func() {
		startIndex, count = ParallelizedIndexRange(5, 4, 1)
		Ω(startIndex).Should(Equal(0))
		Ω(count).Should(Equal(2))

		startIndex, count = ParallelizedIndexRange(5, 4, 2)
		Ω(startIndex).Should(Equal(2))
		Ω(count).Should(Equal(1))

		startIndex, count = ParallelizedIndexRange(5, 4, 3)
		Ω(startIndex).Should(Equal(3))
		Ω(count).Should(Equal(1))

		startIndex, count = ParallelizedIndexRange(5, 4, 4)
		Ω(startIndex).Should(Equal(4))
		Ω(count).Should(Equal(1))
	})

	It("should return the correct index range for 5 tests on 5 nodes", func() {
		startIndex, count = ParallelizedIndexRange(5, 5, 1)
		Ω(startIndex).Should(Equal(0))
		Ω(count).Should(Equal(1))

		startIndex, count = ParallelizedIndexRange(5, 5, 2)
		Ω(startIndex).Should(Equal(1))
		Ω(count).Should(Equal(1))

		startIndex, count = ParallelizedIndexRange(5, 5, 3)
		Ω(startIndex).Should(Equal(2))
		Ω(count).Should(Equal(1))

		startIndex, count = ParallelizedIndexRange(5, 5, 4)
		Ω(startIndex).Should(Equal(3))
		Ω(count).Should(Equal(1))

		startIndex, count = ParallelizedIndexRange(5, 5, 5)
		Ω(startIndex).Should(Equal(4))
		Ω(count).Should(Equal(1))
	})

	It("should return the correct index range for 5 tests on 6 nodes", func() {
		startIndex, count = ParallelizedIndexRange(5, 6, 1)
		Ω(startIndex).Should(Equal(0))
		Ω(count).Should(Equal(1))

		startIndex, count = ParallelizedIndexRange(5, 6, 2)
		Ω(startIndex).Should(Equal(1))
		Ω(count).Should(Equal(1))

		startIndex, count = ParallelizedIndexRange(5, 6, 3)
		Ω(startIndex).Should(Equal(2))
		Ω(count).Should(Equal(1))

		startIndex, count = ParallelizedIndexRange(5, 6, 4)
		Ω(startIndex).Should(Equal(3))
		Ω(count).Should(Equal(1))

		startIndex, count = ParallelizedIndexRange(5, 6, 5)
		Ω(startIndex).Should(Equal(4))
		Ω(count).Should(Equal(1))

		startIndex, count = ParallelizedIndexRange(5, 6, 6)
		Ω(count).Should(Equal(0))
	})

	It("should return the correct index range for 5 tests on 7 nodes", func() {
		startIndex, count = ParallelizedIndexRange(5, 7, 6)
		Ω(count).Should(Equal(0))

		startIndex, count = ParallelizedIndexRange(5, 7, 7)
		Ω(count).Should(Equal(0))
	})

	It("should return the correct index range for 11 tests on 7 nodes", func() {
		startIndex, count = ParallelizedIndexRange(11, 7, 1)
		Ω(startIndex).Should(Equal(0))
		Ω(count).Should(Equal(2))

		startIndex, count = ParallelizedIndexRange(11, 7, 2)
		Ω(startIndex).Should(Equal(2))
		Ω(count).Should(Equal(2))

		startIndex, count = ParallelizedIndexRange(11, 7, 3)
		Ω(startIndex).Should(Equal(4))
		Ω(count).Should(Equal(2))

		startIndex, count = ParallelizedIndexRange(11, 7, 4)
		Ω(startIndex).Should(Equal(6))
		Ω(count).Should(Equal(2))

		startIndex, count = ParallelizedIndexRange(11, 7, 5)
		Ω(startIndex).Should(Equal(8))
		Ω(count).Should(Equal(1))

		startIndex, count = ParallelizedIndexRange(11, 7, 6)
		Ω(startIndex).Should(Equal(9))
		Ω(count).Should(Equal(1))

		startIndex, count = ParallelizedIndexRange(11, 7, 7)
		Ω(startIndex).Should(Equal(10))
		Ω(count).Should(Equal(1))
	})

})
