Files
QuanTAlib/lib/momentum/rsi/Rsi.Quantower.Tests.cs
T

99 lines
2.8 KiB
C#

using Xunit;
using TradingPlatform.BusinessLayer;
using QuanTAlib;
namespace QuanTAlib.Tests;
public class RsiIndicatorTests
{
[Fact]
public void RsiIndicator_Constructor_SetsDefaults()
{
var indicator = new RsiIndicator();
Assert.Equal("RSI - Relative Strength Index", indicator.Name);
Assert.True(indicator.SeparateWindow);
Assert.True(indicator.OnBackGround);
Assert.Equal(14, indicator.Period);
}
[Fact]
public void RsiIndicator_MinHistoryDepths_EqualsPeriod()
{
var indicator = new RsiIndicator
{
Period = 20
};
Assert.Equal(0, RsiIndicator.MinHistoryDepths);
IWatchlistIndicator watchlistIndicator = indicator;
Assert.Equal(0, watchlistIndicator.MinHistoryDepths);
}
[Fact]
public void RsiIndicator_ShortName_IncludesPeriod()
{
var indicator = new RsiIndicator
{
Period = 20
};
indicator.Initialize();
Assert.Contains("RSI(20)", indicator.ShortName);
}
[Fact]
public void RsiIndicator_SourceCodeLink_IsValid()
{
var indicator = new RsiIndicator();
Assert.Contains("github.com", indicator.SourceCodeLink);
Assert.Contains("Rsi.Quantower.cs", indicator.SourceCodeLink);
}
[Fact]
public void RsiIndicator_Initialize_CreatesInternalRsi()
{
var indicator = new RsiIndicator();
// Initialize should not throw
indicator.Initialize();
// After init, line series should exist (RSI)
Assert.Single(indicator.LinesSeries);
}
[Fact]
public void RsiIndicator_ProcessUpdate_HistoricalBar_ComputesValue()
{
var indicator = new RsiIndicator
{
Period = 2 // Short period for testing
};
indicator.Initialize();
// Add historical data
var now = DateTime.UtcNow;
indicator.HistoricalData.AddBar(now, 100, 105, 95, 100);
indicator.HistoricalData.AddBar(now.AddMinutes(1), 100, 105, 95, 102); // Gain 2
indicator.HistoricalData.AddBar(now.AddMinutes(2), 100, 105, 95, 101); // Loss 1
// Process updates
var args = new UpdateArgs(UpdateReason.HistoricalBar);
// We need to process updates sequentially to build state
// But the mock might not support full stateful replay easily without calling ProcessUpdate multiple times
// Let's just verify it runs without error and produces a value
indicator.ProcessUpdate(args); // Bar 0
indicator.ProcessUpdate(args); // Bar 1
indicator.ProcessUpdate(args); // Bar 2
// Line series should have a value
double rsi = indicator.LinesSeries[0].GetValue(0);
// We just check it's a valid number (0-100)
Assert.True(rsi >= 0 && rsi <= 100);
}
}