extern alias volatility; extern alias averages; extern alias statistics; extern alias momentum; extern alias oscillators; extern alias volume; extern alias experiments; using Xunit; using System.Reflection; using System.Diagnostics.CodeAnalysis; using TradingPlatform.BusinessLayer; using statistics::QuanTAlib; using averages::QuanTAlib; using volatility::QuanTAlib; using momentum::QuanTAlib; using oscillators::QuanTAlib; using volume::QuanTAlib; using experiments::QuanTAlib; namespace QuanTAlib { public class QuantowerTests { private static void TestIndicator<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.NonPublicFields)] T>(string fieldName = "ma") where T : Indicator, new() { var indicator = new T(); try { var onInitMethod = typeof(T).GetMethod("OnInit", BindingFlags.NonPublic | BindingFlags.Instance); Assert.NotNull(onInitMethod); onInitMethod.Invoke(indicator, null); var onUpdateMethod = typeof(T).GetMethod("OnUpdate", BindingFlags.NonPublic | BindingFlags.Instance); Assert.NotNull(onUpdateMethod); var field = typeof(T).GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance); Assert.NotNull(field); var fieldValue = field.GetValue(indicator); Assert.NotNull(fieldValue); Assert.NotNull(indicator.ShortName); Assert.NotEmpty(indicator.ShortName); Assert.NotNull(indicator.Name); Assert.NotEmpty(indicator.Name); Assert.NotNull(indicator.Description); Assert.NotEmpty(indicator.Description); Assert.IsAssignableFrom(indicator); } catch (Exception ex) { throw new Xunit.Sdk.XunitException($"Test failed for {typeof(T).Name}: {ex.Message}"); } } private static void TestIndicatorMultipleFields<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.NonPublicFields)] T>(string[] fieldNames) where T : Indicator, new() { var indicator = new T(); try { var onInitMethod = typeof(T).GetMethod("OnInit", BindingFlags.NonPublic | BindingFlags.Instance); Assert.NotNull(onInitMethod); onInitMethod.Invoke(indicator, null); var onUpdateMethod = typeof(T).GetMethod("OnUpdate", BindingFlags.NonPublic | BindingFlags.Instance); Assert.NotNull(onUpdateMethod); foreach (var fieldName in fieldNames) { var field = typeof(T).GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance); Assert.NotNull(field); var fieldValue = field.GetValue(indicator); Assert.NotNull(fieldValue); } Assert.NotNull(indicator.ShortName); Assert.NotEmpty(indicator.ShortName); Assert.NotNull(indicator.Name); Assert.NotEmpty(indicator.Name); Assert.NotNull(indicator.Description); Assert.NotEmpty(indicator.Description); Assert.IsAssignableFrom(indicator); } catch (Exception ex) { throw new Xunit.Sdk.XunitException($"Test failed for {typeof(T).Name}: {ex.Message}"); } } // Averages Indicators [Fact] public void Afirma() => TestIndicator(); [Fact] public void Alma() => TestIndicator(); [Fact] public void Dema() => TestIndicator(); [Fact] public void Dsma() => TestIndicator(); [Fact] public void Dwma() => TestIndicator(); [Fact] public void Ema() => TestIndicator(); [Fact] public void Epma() => TestIndicator(); [Fact] public void Frama() => TestIndicator(); [Fact] public void Fwma() => TestIndicator(); [Fact] public void Gma() => TestIndicator(); [Fact] public void Hma() => TestIndicator(); [Fact] public void Htit() => TestIndicator(); [Fact] public void Hwma() => TestIndicator(); [Fact] public void Jma() => TestIndicator(); [Fact] public void Kama() => TestIndicator(); [Fact] public void Ltma() => TestIndicator(); [Fact] public void Maaf() => TestIndicator(); [Fact] public void Mama() => TestIndicator(); [Fact] public void Mgdi() => TestIndicator(); [Fact] public void Mma() => TestIndicator(); [Fact] public void Pwma() => TestIndicator(); [Fact] public void Qema() => TestIndicator(); [Fact] public void Rema() => TestIndicator(); [Fact] public void Rma() => TestIndicator(); [Fact] public void Sinema() => TestIndicator(); [Fact] public void Sma() => TestIndicator(); [Fact] public void Smma() => TestIndicator(); [Fact] public void T3() => TestIndicator(); [Fact] public void Tema() => TestIndicator(); [Fact] public void Trima() => TestIndicator(); [Fact] public void Vidya() => TestIndicator(); [Fact] public void Wma() => TestIndicator(); [Fact] public void Zlema() => TestIndicator(); // Statistics Indicators [Fact] public void Curvature() => TestIndicator("curvature"); [Fact] public void Entropy() => TestIndicator("entropy"); [Fact] public void Kurtosis() => TestIndicator("kurtosis"); [Fact] public void Max() => TestIndicator("ma"); [Fact] public void Median() => TestIndicator("med"); [Fact] public void Min() => TestIndicator("mi"); [Fact] public void Mode() => TestIndicator("mode"); [Fact] public void Percentile() => TestIndicator("percentile"); [Fact] public void Skew() => TestIndicator("skew"); [Fact] public void Slope() => TestIndicator("slope"); [Fact] public void Stddev() => TestIndicator("stddev"); [Fact] public void Variance() => TestIndicator("variance"); [Fact] public void Zscore() => TestIndicator("zScore"); // Volatility Indicators [Fact] public void Atr() => TestIndicator("atr"); [Fact] public void Cmo() => TestIndicator("cmo"); [Fact] public void Cvi() => TestIndicator("cvi"); [Fact] public void Historical() => TestIndicator("historical"); [Fact] public void Jbands() => TestIndicatorMultipleFields(new[] { "jmaUp", "jmaLo" }); [Fact] public void Jvolty() => TestIndicator("jma"); [Fact] public void Realized() => TestIndicator("realized"); [Fact] public void Rvi() => TestIndicator("rvi"); // Momentum Indicators [Fact] public void Adx() => TestIndicator("adx"); [Fact] public void Adxr() => TestIndicator("adxr"); [Fact] public void Apo() => TestIndicator("apo"); [Fact] public void Dmi() => TestIndicator("dmi"); [Fact] public void Dmx() => TestIndicator("dmx"); [Fact] public void Dpo() => TestIndicator("dpo"); [Fact] public void Macd() => TestIndicator("macd"); [Fact] public void Mom() => TestIndicator("Series"); [Fact] public void Pmo() => TestIndicator("Series"); [Fact] public void Po() => TestIndicator("Series"); [Fact] public void Ppo() => TestIndicator("Series"); [Fact] public void Roc() => TestIndicator("Series"); [Fact] public void Trix() => TestIndicator("Series"); [Fact] public void Vel() => TestIndicator("Series"); [Fact] public void Vortex() => TestIndicatorMultipleFields(new[] { "PlusLine", "MinusLine" }); // Oscillators Indicators [Fact] public void Cti() => TestIndicator("Series"); } }