using Wabbajack.Lib;
using Xunit;

namespace Wabbajack.Test
{
    public class ABatchProcessorTests
    {
        #region CalculateThreadsToUse
        [Fact]
        public void Manual_OverRecommended()
        {
            Assert.Equal(8, ABatchProcessor.CalculateThreadsToUse(
                recommendedCount: 8,
                manual: true,
                manualMax: byte.MaxValue,
                targetUsage: 1.0d));
        }

        [Fact]
        public void Manual_NeedsTrimming()
        {
            Assert.Equal(5, ABatchProcessor.CalculateThreadsToUse(
                recommendedCount: 8,
                manual: true,
                manualMax: 5,
                targetUsage: 1.0d));
        }

        [Fact]
        public void Manual_Zero()
        {
            Assert.Equal(1, ABatchProcessor.CalculateThreadsToUse(
                recommendedCount: 8,
                manual: true,
                manualMax: 0,
                targetUsage: 1.0d));
        }

        [Fact]
        public void Auto_Full()
        {
            Assert.Equal(8, ABatchProcessor.CalculateThreadsToUse(
                recommendedCount: 8,
                manual: false,
                manualMax: byte.MaxValue,
                targetUsage: 1.0d));
        }

        [Fact]
        public void Auto_Half()
        {
            Assert.Equal(4, ABatchProcessor.CalculateThreadsToUse(
                recommendedCount: 8,
                manual: false,
                manualMax: byte.MaxValue,
                targetUsage: 0.5d));
        }

        [Fact]
        public void Auto_Zero()
        {
            Assert.Equal(1, ABatchProcessor.CalculateThreadsToUse(
                recommendedCount: 8,
                manual: false,
                manualMax: byte.MaxValue,
                targetUsage: 0d));
        }

        [Fact]
        public void Auto_OverAllowed()
        {
            Assert.Equal(8, ABatchProcessor.CalculateThreadsToUse(
                recommendedCount: 8,
                manual: false,
                manualMax: byte.MaxValue,
                targetUsage: 2d));
        }

        [Fact]
        public void Auto_UnderAllowed()
        {
            Assert.Equal(8, ABatchProcessor.CalculateThreadsToUse(
                recommendedCount: 8,
                manual: false,
                manualMax: byte.MaxValue,
                targetUsage: -2d));
        }
        #endregion
    }
}