Add test for RSI Divergence

This commit is contained in:
2025-11-14 20:02:51 +07:00
parent b60295fcb2
commit ac1707c439
5 changed files with 100 additions and 0 deletions

View File

@@ -0,0 +1,58 @@
using FluentAssertions;
using Managing.Domain.Strategies.Signals;
using Xunit;
using static Managing.Common.Enums;
namespace Managing.Domain.Tests;
/// <summary>
/// Tests for RSI Divergence indicator signal generation.
/// Tests verify that the indicator produces a consistent number of signals
/// when run on the same historical data.
/// </summary>
public class RsiDivergenceTests : RunIndicatorsBase
{
[Fact]
public void RsiDivergenceIndicator_Should_Generate_Consistent_Signal_Count()
{
// Arrange
var rsiIndicator = new RsiDivergenceIndicatorBase("RSI_Divergence_Test", 14);
// Act
var signals = RunIndicatorAndGetSignals(rsiIndicator);
var signalCount = signals.Count;
// Assert
// The RSI divergence indicator should generate a consistent number of signals
// when run on the same historical ETH data.
// This test ensures that any changes to the indicator logic don't accidentally
// change the signal generation behavior.
signalCount.Should().BeGreaterThan(0, "RSI divergence indicator should generate signals from historical data");
signalCount.Should().Be(11, "RSI divergence indicator should generate exactly 11 signals with the current ETH dataset");
}
[Fact]
public void RsiDivergenceIndicator_Should_Generate_Valid_Signals()
{
// Arrange
var rsiIndicator = new RsiDivergenceIndicatorBase("RSI_Divergence_Test", 14);
// Act
var signals = RunIndicatorAndGetSignals(rsiIndicator);
// Assert
signals.Should().NotBeNull();
signals.Should().NotBeEmpty();
// Verify each signal has required properties
foreach (var signal in signals)
{
signal.Should().NotBeNull();
signal.Date.Should().NotBe(default(DateTime));
// Enums cannot be null by definition, so we just verify they have valid values
signal.Direction.Should().BeOneOf(TradeDirection.Long, TradeDirection.Short);
signal.Ticker.Should().NotBe(Ticker.Unknown);
signal.Confidence.Should().BeOneOf(Confidence.Low, Confidence.Medium, Confidence.High);
}
}
}

View File

@@ -0,0 +1,33 @@
using Managing.Core;
using Managing.Domain.Candles;
using Managing.Domain.Indicators;
using Managing.Domain.Strategies;
namespace Managing.Domain.Tests;
public class RunIndicatorsBase
{
protected readonly List<Candle> TestCandles;
public RunIndicatorsBase()
{
// Load the ETH Fifteen Minutes candles data for indicator testing
TestCandles = FileHelpers.ReadJson<List<Candle>>("Data/ETH-FifteenMinutes-candles-20:44:15 +00:00-.json");
}
/// <summary>
/// Runs an indicator on the test candles and returns the signals generated
/// </summary>
/// <param name="indicator">The indicator to run</param>
/// <returns>List of signals generated by the indicator</returns>
protected List<LightSignal> RunIndicatorAndGetSignals(IndicatorBase indicator)
{
// Convert list to HashSet as expected by the Run method
var candleSet = TestCandles.ToHashSet();
// Run the indicator
var signals = indicator.Run(candleSet);
return signals ?? new List<LightSignal>();
}
}

View File

@@ -30,6 +30,9 @@
<None Update="Data\ETH-FifteenMinutes-candles-large.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Data\ETH-FifteenMinutes-candles-20:44:15 +00:00-.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>