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:
@@ -223,6 +223,73 @@ namespace YLErp.Modules.SwapModule
|
||||
Console.WriteLine($"SD_003 通过:TradeStatus={td.TradeStatus},StockEqvNotional={td.StockEqvNotional} ✅");
|
||||
}
|
||||
|
||||
// ================================================================
|
||||
// SD_007:SwapUnwind 部分平仓 —— HasPartialUnWind=1,TradeStatus 不变
|
||||
// ================================================================
|
||||
|
||||
/// <summary>
|
||||
/// [SD_007] SwapUnwind 部分平仓(借鉴 testable SwapUnwindScenarioTest.Scenario2)
|
||||
/// ------------------------------------------------------------
|
||||
/// 部分平仓(CloseMethod≠全部平仓 且 ClosePercent≠1)走 else 分支:
|
||||
/// td.HasPartialUnWind = 1,TradeStatus 保持"确认成交"不变
|
||||
/// 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=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 含预付金 —— 两条资金流水(平仓费+应付预付金)
|
||||
// ================================================================
|
||||
|
||||
/// <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_004:DealFloatPosition 含费价重算正确(后端唯二真做计算的地方)
|
||||
// ================================================================
|
||||
|
||||
Reference in New Issue
Block a user