
namespace QuanTAlib.Tests;

public class JmaZeroDivTests
{
    [Fact]
    public void Period1_DoesNotProduceInfinityOrNaN()
    {
        // Arrange
        var jma = new Jma(period: 1);
        double[] values = { 100, 101, 102, 101, 100 };

        // Act & Assert
        foreach (var v in values)
        {
            var result = jma.Update(new TValue(DateTime.UtcNow, v));
            Assert.False(double.IsNaN(result.Value), $"JMA(1) produced NaN for input {v}");
            Assert.False(double.IsInfinity(result.Value), $"JMA(1) produced Infinity for input {v}");
            // For period 1, JMA should ideally track price very closely
            Assert.Equal(v, result.Value, precision: 1);
        }
    }

    [Fact]
    public void Period1_LogValuesAreFinite()
    {
        // This test inspects private fields via reflection or just checks behavior
        // Since we can't easily access private fields, we'll rely on the calculation logic check
        // If the fix is applied, we shouldn't see -Infinity in internal calculations if we could see them.
        // But we can check if the output is exactly the input, which implies adapt=0 (if logic holds).

        var jma = new Jma(period: 1);
        var result = jma.Update(new TValue(DateTime.UtcNow, 100));
        Assert.Equal(100, result.Value);

        result = jma.Update(new TValue(DateTime.UtcNow, 200));
        // If adapt is 0 (due to -Infinity log), bands snap to price.
        // If JMA(1) is identity, result should be 200.
        // With clamping, adapt is slightly non-zero (approx 1e-12), so result is very close to 200.
        Assert.Equal(200, result.Value, precision: 7);
    }
}
