namespace Bit.Test.Common.Helpers;

public static class TestCaseHelper
{
    public static IEnumerable<IEnumerable<T>> GetCombinations<T>(params T[] items)
    {
        var count = Math.Pow(2, items.Length);
        for (var i = 0; i < count; i++)
        {
            var str = Convert.ToString(i, 2).PadLeft(items.Length, '0');
            List<T> combination = new();
            for (var j = 0; j < str.Length; j++)
            {
                if (str[j] == '1')
                {
                    combination.Add(items[j]);
                }
            }
            yield return combination;
        }
    }

    public static IEnumerable<IEnumerable<object>> GetCombinationsOfMultipleLists(params IEnumerable<object>[] optionLists)
    {
        if (!optionLists.Any())
        {
            yield break;
        }

        foreach (var item in optionLists.First())
        {
            var itemArray = new[] { item };

            if (optionLists.Length == 1)
            {
                yield return itemArray;
            }

            foreach (var nextCombination in GetCombinationsOfMultipleLists(optionLists.Skip(1).ToArray()))
            {
                yield return itemArray.Concat(nextCombination);
            }
        }
    }
}