test(swap): SwapDealSettlementTest补部分平仓+含预付金场景(借鉴testable)

借鉴 testable 分支 SwapUnwindScenarioTest.Scenario2,补当前分支缺失的2个场景:

SD_007 部分平仓:CloseMethod=部分平仓 → HasPartialUnWind=1,TradeStatus不变,
  StockEqvNotional/TradeAmount按比例扣减(原100万-50万=50万)
SD_008 含预付金平仓:SwapMarginAmount≠0 → 2条资金流水(平仓费+应付预付金)

SwapDealSettlementTest 现8场景,SwapModule 173测试全绿(+2),无回归。
This commit is contained in:
hjhan
2026-07-03 18:03:38 +08:00
parent 9da3a1ed91
commit 99958f9b43
@@ -223,6 +223,73 @@ namespace YLErp.Modules.SwapModule
Console.WriteLine($"SD_003 通过:TradeStatus={td.TradeStatus}StockEqvNotional={td.StockEqvNotional} ✅");
}
// ================================================================
// SD_007SwapUnwind 部分平仓 —— HasPartialUnWind=1TradeStatus 不变
// ================================================================
/// <summary>
/// [SD_007] SwapUnwind 部分平仓(借鉴 testable SwapUnwindScenarioTest.Scenario2
/// ------------------------------------------------------------
/// 部分平仓(CloseMethod≠全部平仓 且 ClosePercent≠1)走 else 分支:
/// td.HasPartialUnWind = 1TradeStatus 保持"确认成交"不变
/// StockEqvNotional/TradeAmount 仍按 CloseNotionalValue/CloseQty 扣减
/// </summary>
[TestMethod]
public void SD_007_SwapUnwind_部分平仓_设HasPartialUnWind且TradeStatus不变()
{
var td = CreateTrade();
var service = new StubDealService(td);
// 部分平仓:ClosePercent=0.5, CloseQty=5000, CloseNotionalValue=500000
var unwindData = CreateUnwindData(
swapRealizedPnL: 3000m, swapMarginAmount: 0m,
closeMethod: (int)CloseMethodEnum., closePercent: 0.5m,
closeQty: 5000m, closeNotionalValue: 500000m, positionQty: 10000m);
service.SwapUnwind(unwindData);
// 部分平仓:设 HasPartialUnWind=1TradeStatus 不变
Assert.AreEqual(1, td.HasPartialUnWind, "部分平仓应设 HasPartialUnWind=1");
Assert.AreEqual("确认成交", td.TradeStatus, "部分平仓 TradeStatus 保持不变");
// 持仓扣减:原 StockEqvNotional=1000000 - 500000 = 500000
Assert.AreEqual(500000.0, td.StockEqvNotional, 0.001, "StockEqvNotional 扣减后=500000");
Assert.AreEqual(5000.0, td.TradeAmount, 0.001, "TradeAmount 扣减后=5000");
// 资金流水仍有(部分平仓也产生平仓费流水)
Assert.AreEqual(1, service.ClientCashCalls.Count, "部分平仓应1条资金流水");
Assert.AreEqual(-3000.0, service.ClientCashCalls[0].amount, 0.001, "资金流水=-SwapRealizedPnL");
Console.WriteLine($"SD_007 通过:HasPartialUnWind={td.HasPartialUnWind}TradeStatus={td.TradeStatus}StockEqvNotional={td.StockEqvNotional} ✅");
}
// ================================================================
// SD_008SwapUnwind 含预付金 —— 两条资金流水(平仓费+应付预付金)
// ================================================================
/// <summary>
/// [SD_008] SwapUnwind 含预付金返还(SwapMarginAmount≠0
/// ------------------------------------------------------------
/// SwapUnwind 内部:SwapMarginAmount≠0 时追加一条"应付预付金"资金流水。
/// 验证:2条流水(平仓费 + 应付预付金),金额和操作类型正确。
/// </summary>
[TestMethod]
public void SD_008_SwapUnwind_含预付金_两条资金流水()
{
var td = CreateTrade();
var service = new StubDealService(td);
var unwindData = CreateUnwindData(
swapRealizedPnL: 5000m, swapMarginAmount: 2000m,
closeMethod: (int)CloseMethodEnum., closePercent: 1m,
closeQty: 10000m, closeNotionalValue: 1000000m, positionQty: 10000m);
service.SwapUnwind(unwindData);
// 2条资金流水:平仓费 + 应付预付金
Assert.AreEqual(2, service.ClientCashCalls.Count, "含预付金时应2条资金流水");
Assert.AreEqual(-5000.0, service.ClientCashCalls[0].amount, 0.001, "第1条=平仓费 -SwapRealizedPnL");
Assert.AreEqual(ClientCashInCashOut._平仓费, service.ClientCashCalls[0].action);
Assert.AreEqual(2000.0, service.ClientCashCalls[1].amount, 0.001, "第2条=应付预付金 SwapMarginAmount");
Assert.AreEqual(ClientCashInCashOut._应付预付金, service.ClientCashCalls[1].action);
Console.WriteLine($"SD_008 通过:2条流水,平仓费={service.ClientCashCalls[0].amount},应付预付金={service.ClientCashCalls[1].amount} ✅");
}
// ================================================================
// SD_004DealFloatPosition 含费价重算正确(后端唯二真做计算的地方)
// ================================================================