using PkmnLib.Static;

namespace PkmnLib.Tests.Static;

public class GrowthRateTests
{
    [Test]
    public void EmptyLookupGrowthRateTestShouldThrowArgumentException()
    {
        Action act = () => _ = new LookupGrowthRate("Test", []);
        act.Should().Throw<ArgumentException>().WithMessage("Experience table must have at least one entry.");
    }
    
    [Test]
    public void NonZeroLookupGrowthRateTestShouldThrowArgumentException()
    {
        Action act = () => _ = new LookupGrowthRate("Test", [1]);
        act.Should().Throw<ArgumentException>().WithMessage("Experience table must start at 0.");
    }
    
    [Test]
    public void TooLargeLookupGrowthRateTestShouldThrowArgumentException()
    {
        Action act = () => _ = new LookupGrowthRate("Test", Enumerable.Range(0, LevelInt.MaxValue + 1).Select(i => (uint)i));
        act.Should().Throw<ArgumentException>().WithMessage($"Experience table may have at most {LevelInt.MaxValue} entries.");
    }
    
    [Test]
    public void LookupGrowthRateTest()
    {
        var growthRate = new LookupGrowthRate("Test", [0, 1, 2, 3, 4, 5]);
        growthRate.CalculateLevel(0).Should().Be(1);
        growthRate.CalculateLevel(1).Should().Be(2);
        growthRate.CalculateLevel(2).Should().Be(3);
        growthRate.CalculateLevel(3).Should().Be(4);
        growthRate.CalculateLevel(4).Should().Be(5);
        growthRate.CalculateLevel(5).Should().Be(6);
        
        growthRate.CalculateExperience(1).Should().Be(0);
        growthRate.CalculateExperience(2).Should().Be(1);
        growthRate.CalculateExperience(3).Should().Be(2);
        growthRate.CalculateExperience(4).Should().Be(3);
        growthRate.CalculateExperience(5).Should().Be(4);
        growthRate.CalculateExperience(6).Should().Be(5);
    }
}