mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-25 05:48:06 +00:00
feat(tests): enhance tests with GBM for noise generation and improve tolerance for MAMA validation
feat(trends): implement IDisposable in Bessel and Conv classes to manage event subscriptions fix(trends): add validation for period and parameters in Kama and MGDI calculations fix(trends): clamp logarithmic calculations in JMA to avoid -Infinity
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
using System;
|
||||
using Xunit;
|
||||
using QuanTAlib;
|
||||
|
||||
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: 8);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user