package sets

import (
	"testing"

	"github.com/stretchr/testify/assert"
	"go.skia.org/infra/go/testutils/unittest"
)

func readAllFromChannel(in <-chan []int) [][]int {
	ret := [][]int{}
	for s := range in {
		ret = append(ret, s)
	}
	return ret
}

func TestCartesianProduct_EmptySlice_EmptyChannel(t *testing.T) {
	unittest.SmallTest(t)
	in, err := CartesianProduct([]int{})
	assert.NoError(t, err)
	assert.Equal(t, [][]int{}, readAllFromChannel(in))
}

func TestCartesianProduct_SliceOfLengthOne_ChannelJustCountsDown(t *testing.T) {
	unittest.SmallTest(t)
	in, err := CartesianProduct([]int{5})
	assert.NoError(t, err)
	assert.Equal(t, [][]int{
		{4},
		{3},
		{2},
		{1},
		{0},
	}, readAllFromChannel(in))
}

func TestCartesianProduct_SliceOfLengthTwoButOneCountIsOne_ChannelJustCountsDown(t *testing.T) {
	unittest.SmallTest(t)
	in, err := CartesianProduct([]int{5, 1})
	assert.NoError(t, err)
	assert.Equal(t, [][]int{
		{4, 0},
		{3, 0},
		{2, 0},
		{1, 0},
		{0, 0},
	}, readAllFromChannel(in))
}

func TestCartesianProduct_SliceOfLengthTwoButOtherCountIsOne_ChannelJustCountsDown(t *testing.T) {
	unittest.SmallTest(t)
	in, err := CartesianProduct([]int{1, 5})
	assert.NoError(t, err)
	assert.Equal(t, [][]int{
		{0, 4},
		{0, 3},
		{0, 2},
		{0, 1},
		{0, 0},
	}, readAllFromChannel(in))
}

func TestCartesianProduct_SliceOfLengthTwoButCountIsZero_ReturnsError(t *testing.T) {
	unittest.SmallTest(t)
	_, err := CartesianProduct([]int{1, 0})
	assert.Error(t, err)
}

func TestCartesianProduct_SliceOfLengthTwo_ChannelEmitsCartesianProduct(t *testing.T) {
	unittest.SmallTest(t)
	in, err := CartesianProduct([]int{3, 2})
	assert.NoError(t, err)
	assert.Equal(t, [][]int{
		{2, 1},
		{1, 1},
		{0, 1},
		{2, 0},
		{1, 0},
		{0, 0},
	}, readAllFromChannel(in))
}

func TestCartesianProduct_SliceOfLengthThree_ChannelEmitsCartesianProduct(t *testing.T) {
	unittest.SmallTest(t)
	in, err := CartesianProduct([]int{2, 2, 3})
	assert.NoError(t, err)
	assert.Equal(t, [][]int{
		{1, 1, 2},
		{0, 1, 2},
		{1, 0, 2},
		{0, 0, 2},
		{1, 1, 1},
		{0, 1, 1},
		{1, 0, 1},
		{0, 0, 1},
		{1, 1, 0},
		{0, 1, 0},
		{1, 0, 0},
		{0, 0, 0},
	}, readAllFromChannel(in))
}
