test(swap-eod): 补 A 三个路由分支断言 DI_BRANCH_003/004/005(经真实 DealInterests 路由器,零生产改动)

This commit is contained in:
hjhan
2026-08-17 17:43:25 +08:00
parent 9ae2e66b75
commit 65a367e139
@@ -51,6 +51,8 @@ namespace YLErp.Modules.SwapModule
public SwapDealService DealService { get; set; }
public eod_swap_position LastInterestCalculationEodPosition { get; private set; }
public int LastEventType { get; set; }
public StubEodPositionService() : base(nameof(DealInterestsScenarioTest))
{
@@ -71,6 +73,8 @@ namespace YLErp.Modules.SwapModule
List<swap_flow_event> closeList = null)
{
LastInterestCalculationEodPosition = eodPositions.SingleOrDefault();
LastEventType = eventType;
if (AutoInterests != null)
{
return AutoInterests;
@@ -522,6 +526,109 @@ namespace YLErp.Modules.SwapModule
#endregion
// ================================================================
#region 23 DealInterests
/// <summary>
/// [DI_BRANCH_003] 观察日无平仓(observationDay!=null, hasSwap=false, hasClose=false
/// -> 走 SaveAutoEodInterestPositionautoSwap 路径)。
/// 守卫:CalcSwapInterests 收到 eventType=自动互换、tdClose=false。
/// 补盖 TEST-MATRIX §6 的 AutoSettle 分支。
/// </summary>
[TestMethod]
public void DI_BRANCH_003_观察日自动结息走SaveAutoEodInterestPosition()
{
var service = new StubEodPositionService();
var td = CreateTrade();
var position = CreateInterestPosition();
var settleDate = new DateTime(2026, 5, 10);
var preEod = CreatePreEod(settleDate.AddDays(-1), DailyInterest);
position.InterestSwapInterval = JsonConvert.SerializeObject(new List<IntervalModel>
{
new IntervalModel { Date = settleDate, Rate = FixedRate, Settlement = 1 }
});
service.ExecuteDealInterests(
new List<swap_position> { position },
new List<eod_swap_position> { preEod },
settleDate, td, new List<swap_flow_event>(),
Principal, 0m, 0m, 1m, Principal);
Assert.IsTrue(service.PersistedPositions.Count > 0, "观察日应生成eod");
Assert.AreEqual((int)SwapEventTypeEnum., service.LastEventType, "观察日自动结息 eventType 应为自动互换");
// 观察日自动结息走 SaveAutoEodInterestPosition(无平仓):TdCloseInterest 仅为当日利息,不被平仓放大
Assert.IsTrue(service.PersistedPositions[0].TdCloseInterest < 0.1m, "观察日自动结息无平仓,TdCloseInterest 应仅为当日利息(<0.1),不应含平仓利息");
Console.WriteLine("观察日自动结息分支 ✅ eventType=自动互换, tdClose=false");
}
/// <summary>
/// [DI_BRANCH_004] 观察日+平仓(observationDay!=null, hasClose=true
/// -> 走 SaveAutoEodWithCloseInterestPosition(autoSwap:true)。
/// 守卫:CalcSwapInterests 收到 eventType=自动互换、tdClose=true。
/// 补盖 TEST-MATRIX §6 最弱格子(autoSwap=true 部分平仓)。
/// </summary>
[TestMethod]
public void DI_BRANCH_004_观察日平仓走WithClose_autoSwapTrue()
{
var service = new StubEodPositionService();
var td = CreateTrade();
var position = CreateInterestPosition();
var settleDate = new DateTime(2026, 5, 10);
var preEod = CreatePreEod(settleDate.AddDays(-1), DailyInterest * 13);
position.InterestSwapInterval = JsonConvert.SerializeObject(new List<IntervalModel>
{
new IntervalModel { Date = settleDate, Rate = FixedRate, Settlement = 1 }
});
var closeEvent = CreateSwapFlowEvent(settleDate, DailyInterest * 13);
closeEvent.EventType = (int)SwapFlowEventTypeEnum.;
service.ExecuteDealInterests(
new List<swap_position> { position },
new List<eod_swap_position> { preEod },
settleDate, td, new List<swap_flow_event> { closeEvent },
Principal, 0m, 300m, 1m, Principal);
Assert.IsTrue(service.PersistedPositions.Count > 0, "观察日+平仓应生成eod");
Assert.AreEqual((int)SwapEventTypeEnum., service.LastEventType, "autoSwap:true -> eventType 应为自动互换");
// 含平仓:TdCloseInterest 应明显大于纯当日利息(实测约 0.38)
Assert.IsTrue(service.PersistedPositions[0].TdCloseInterest > 0.1m, "观察日+平仓 TdCloseInterest 应含平仓利息(>0.1)");
Console.WriteLine("观察日+平仓分支 ✅ eventType=自动互换, TdCloseInterest>0.1 (autoSwap:true)");
}
/// <summary>
/// [DI_BRANCH_005] 非观察日+平仓(observationDay==null, hasClose=true, hasSwap=false
/// -> 走 SaveAutoEodWithCloseInterestPosition(autoSwap:false)。
/// 守卫:CalcSwapInterests 收到 eventType=平仓、tdClose=true。
/// 补盖 TEST-MATRIX §6 的 CloseOnly 分支。
/// </summary>
[TestMethod]
public void DI_BRANCH_005_纯平仓走WithClose_autoSwapFalse()
{
var service = new StubEodPositionService();
var td = CreateTrade();
var position = CreateInterestPosition();
var settleDate = new DateTime(2026, 5, 10);
var preEod = CreatePreEod(settleDate.AddDays(-1), DailyInterest * 13);
position.InterestSwapInterval = null;
var closeEvent = CreateSwapFlowEvent(settleDate, DailyInterest * 13);
closeEvent.EventType = (int)SwapFlowEventTypeEnum.;
service.ExecuteDealInterests(
new List<swap_position> { position },
new List<eod_swap_position> { preEod },
settleDate, td, new List<swap_flow_event> { closeEvent },
Principal, 0m, 300m, 1m, Principal);
Assert.IsTrue(service.PersistedPositions.Count > 0, "纯平仓应生成eod");
Assert.AreEqual((int)SwapEventTypeEnum., service.LastEventType, "autoSwap:false -> eventType 应为平仓");
Assert.IsTrue(service.PersistedPositions[0].TdCloseInterest > 0.1m, "纯平仓 TdCloseInterest 应含平仓利息(>0.1)");
Console.WriteLine("纯平仓分支 ✅ eventType=平仓, TdCloseInterest>0.1 (autoSwap:false)");
}
#endregion
// 场景3:多日守恒——连续收盘归档,InterestIncomeSum 应线性递增
// ================================================================