using YLErp.DBModels;
using YLErp.DBModels.Enums;
using YLErp.Model;
namespace YLErp.Modules.SwapModule
{
///
/// SwapEodPositionService 的可测试化基类(纯内存,不连库)。
/// ============================================================================
/// 收敛各 ScenarioTest 中 Stub 子类的重复 override:
/// - PersistEodSwapPosition:收集到列表,不写库
/// - SaveAllChanges:no-op
/// - GetCurrencyRate:返回 1.0(本币)
/// - 统一构造函数(注入 OptUserInfo,标记 UnitTest 来源)
///
/// 暴露 PersistedPositions / SaveChangesCount / ClientCashCalls 等输出捕获属性,
/// 供断言使用。各测试子类按需再 override 业务 seam(FindTrade/GetUnderlyingPrice 等)。
///
/// 设计原则:
/// - 只收敛 8/8 Stub 都重复的高频 override,不预设业务数据注入方式
/// (ComposePage 用属性字典、SwapPositionCompose 用构造函数 List,差异留给子类)
/// - 不提供 Execute* 包装器(签名各异且大多只出现 1-2 次,留在各子类避免基类膨胀)
/// ============================================================================
///
public class TestableSwapEodPositionService : SwapEodPositionService
{
/// 捕获所有持久化的 eod 持仓(按调用顺序)
public List PersistedPositions { get; } = new();
/// SaveAllChanges 调用次数
public int SaveChangesCount { get; private set; }
/// AddClientCash 调用记录(金额, 操作)
public List<(double amount, string action)> ClientCashCalls { get; } = new();
/// 自增 id 模拟器(新增 eod 时分配 id)
private int _nextId = 1;
protected TestableSwapEodPositionService(string testName)
: base(new OptUserInfo(0, testName ?? nameof(TestableSwapEodPositionService), OptUserFrom.UnitTest))
{
}
// ===== 高频 seam override(8/8 Stub 都重复,收敛到基类)=====
protected override void PersistEodSwapPosition(eod_swap_position position)
{
if (position.id == 0) position.id = _nextId++;
PersistedPositions.Add(position);
}
protected override void SaveAllChanges()
{
SaveChangesCount++;
}
protected override double GetCurrencyRate(string quoteCurrency, string settlementCurrency, DateTime valueDate, bool seekPreday, CurrencyRateType currencyRateType)
{
return 1.0; // 本币,汇率=1
}
protected override int AddClientCash(trade td, double amount, string action, DateTime valueDate)
{
ClientCashCalls.Add((amount, action));
return _nextId++;
}
}
}