diff --git a/UnitTestProject/Modules/SwapModule/SwapDealSettlementTest.cs b/UnitTestProject/Modules/SwapModule/SwapDealSettlementTest.cs index 85869479..a5c4b50a 100644 --- a/UnitTestProject/Modules/SwapModule/SwapDealSettlementTest.cs +++ b/UnitTestProject/Modules/SwapModule/SwapDealSettlementTest.cs @@ -223,6 +223,73 @@ namespace YLErp.Modules.SwapModule Console.WriteLine($"SD_003 通过:TradeStatus={td.TradeStatus},StockEqvNotional={td.StockEqvNotional} ✅"); } + // ================================================================ + // SD_007:SwapUnwind 部分平仓 —— HasPartialUnWind=1,TradeStatus 不变 + // ================================================================ + + /// + /// [SD_007] SwapUnwind 部分平仓(借鉴 testable SwapUnwindScenarioTest.Scenario2) + /// ------------------------------------------------------------ + /// 部分平仓(CloseMethod≠全部平仓 且 ClosePercent≠1)走 else 分支: + /// td.HasPartialUnWind = 1,TradeStatus 保持"确认成交"不变 + /// StockEqvNotional/TradeAmount 仍按 CloseNotionalValue/CloseQty 扣减 + /// + [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=1,TradeStatus 不变 + 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_008:SwapUnwind 含预付金 —— 两条资金流水(平仓费+应付预付金) + // ================================================================ + + /// + /// [SD_008] SwapUnwind 含预付金返还(SwapMarginAmount≠0) + /// ------------------------------------------------------------ + /// SwapUnwind 内部:SwapMarginAmount≠0 时追加一条"应付预付金"资金流水。 + /// 验证:2条流水(平仓费 + 应付预付金),金额和操作类型正确。 + /// + [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_004:DealFloatPosition 含费价重算正确(后端唯二真做计算的地方) // ================================================================