using System; using System.Threading; using System.Threading.Tasks; using FinlyticCore.Dtos.Fundamentals; using FinlyticCore.Dtos.Sentiment; using FinlyticCore.Dtos.TechnicalAnalysis; using FinlyticCore.Dtos.Trading; using FinlyticEngine.Services.Ai; using FinlyticEngine.Services.Derivatives; using FinlyticEngine.Services.Scoring; namespace FinlyticEngine.Tests.TestSupport; /// /// Fakes for the three dependencies /// (scoring, AI gate, derivative resolution) that are only reachable through /// EvaluateAssetAsync. The tenant-boundary tests in this suite never call that method, so these /// fakes deliberately throw if invoked: a passing test that happened to call one of them without anyone /// noticing would be a silent, false-positive gap. /// public class NeverInvokedCompositeOpportunityScorer : ICompositeOpportunityScorer { public Task CalculateCompositeScoreAsync( StrategyResultDto setup, IsinSentimentSummaryDto? sentiment, AssetFundamentalsDto? fundamentals, FinlyticCore.Dtos.Simulation.StrategyAssetReliabilityDto? reliability = null, CancellationToken cancellationToken = default) => throw new InvalidOperationException("Not expected to be called by the tenant-boundary tests."); } public class NeverInvokedAiReasoningGateService : IAiReasoningGateService { public Task ValidateOpportunityAsync( StrategyResultDto setup, IsinSentimentSummaryDto? sentiment, AssetFundamentalsDto? fundamentals, ScoringResult score, FinlyticCore.Dtos.Simulation.StrategyAssetReliabilityDto? reliability = null, CancellationToken cancellationToken = default) => throw new InvalidOperationException("Not expected to be called by the tenant-boundary tests."); } public class NeverInvokedKnockOutDerivativeResolver : IKnockOutDerivativeResolver { public Task ResolveOptimalTurboAsync( string underlyingIsin, SignalDirection direction, decimal chartStopLoss, decimal currentPrice, CancellationToken cancellationToken = default) => throw new InvalidOperationException("Not expected to be called by the tenant-boundary tests."); }