From 5ca297a73c92a8acdd2af8a1032b21ad91ed5d4e Mon Sep 17 00:00:00 2001 From: hjhan Date: Sat, 8 Aug 2026 12:26:27 +0800 Subject: [PATCH] =?UTF-8?q?test(swap):=20=E8=A1=A5=E5=85=85=E5=9B=BA?= =?UTF-8?q?=E5=AE=9A=E5=80=BC=E8=85=BF=E4=B8=9A=E5=8A=A1=E5=9C=BA=E6=99=AF?= =?UTF-8?q?4-2=E4=B8=A4=E6=AE=B5=E5=BC=8F=E5=B9=B3=E4=BB=93=E8=A6=86?= =?UTF-8?q?=E7=9B=96(GLMS-=E5=80=BA=E5=88=B8TRS=E6=9C=9F=E9=97=B4=E7=BB=93?= =?UTF-8?q?=E7=AE=97260702=E7=BC=BA=E5=8F=A3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 业务场景4_2_固定值腿_部分平仓后再全平_两段利息均随比例线性缩放 覆盖「国联民生-债券TRS期间结算功能测试260702.xlsx」Sheet1 矩阵中唯一标记为 「未测」的格子:固定值腿(mode=1) 部分平仓一次后隔数日再全平。 - 断言两段利息各自随平仓比例线性缩放(30%/70%对照同日期全平),守护 d1badfe4 的固定值腿平仓比例缩放修复;修复前 newClosePercent=1 会让部分平仓利息等于全平。 - 现有利息测试 75 例全绿(场景1/2/3/4 + 单笔 + 固定值腿 + 多步守恒)。 - 0601 缺陷测试-利息(场景1-4 + 单笔0007/0006) 与 20260807 同源,已由上述套件覆盖。 --- ...SwapFixedInterestLegClosePercentBugTest.cs | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/UnitTestProject/Modules/SwapModule/SwapFixedInterestLegClosePercentBugTest.cs b/UnitTestProject/Modules/SwapModule/SwapFixedInterestLegClosePercentBugTest.cs index 774059a2..3bdd657c 100644 --- a/UnitTestProject/Modules/SwapModule/SwapFixedInterestLegClosePercentBugTest.cs +++ b/UnitTestProject/Modules/SwapModule/SwapFixedInterestLegClosePercentBugTest.cs @@ -154,6 +154,78 @@ namespace UnitTestProject.Modules.SwapModule #endregion + /// 与 CallProductionPath 相同,但允许指定平仓日期(用于两段式生命周期) + private static swap_flow_event CallWithDate(trade td, swap_position leg, decimal closePercent, DateTime closeDate) + { + var svc = new StubSvc(); + var stockEqvNotional = Notional; + var posiLongNotionalValue = Notional; + var posiShortNotionalValue = 0m; + var closePosiNotionalValue = stockEqvNotional * closePercent; + var orginPv = stockEqvNotional; + + var interests = svc.GetInterests( + td, td.trade_extend, closeDate, closeDate, + new List(), + new List { leg }, + stockEqvNotional, + posiLongNotionalValue, + posiShortNotionalValue, + closePosiNotionalValue, + closePercent, + (int)SwapEventTypeEnum.平仓, + tdClose: false, + needPrice: false, + grossPrice: 0m, + orginPv: orginPv, + add: true, + settment: false); + + Assert.AreEqual(1, interests.Count, "应返回 1 条利息腿"); + return interests[0]; + } + + #region 业务场景4-2:固定值腿 部分平仓后再全平(两段式,GLMS-债券TRS期间结算 260702「未测」缺口) + + /// + /// 覆盖「国联民生-债券TRS期间结算功能测试260702.xlsx」Sheet1 矩阵中唯一标记为「未测」的格子: + /// 业务场景4-2(固定值腿,部分平仓一次后经过数日再全平)。 + /// 同时守护 d1badfe4 的固定值腿平仓比例缩放修复—— + /// 修复前 newClosePercent=1,部分平仓利息与全平完全相同(界面改比例利息腿不变)。 + /// 本测试断言两段利息各自随平仓比例线性缩放(30% / 70%),正是该场景的回归守卫。 + /// + [DataTestMethod] + [DataRow("11")] // 算头算尾 + [DataRow("10")] // 算头不算尾 + public void 业务场景4_2_固定值腿_部分平仓后再全平_两段利息均随比例线性缩放(string calcMode) + { + var td = CreateTrade(calcMode); + var leg = CreateLeg((int)InterestModeEnum.固定值, InterestTypeEnum.单利); + + // 单步全平(100%)作为基准 + var full = CallProductionPath(td, leg, 1m); + Assert.AreNotEqual(0m, full.InterestAmount, "全平利息不应为 0,否则用例无区分度"); + + var partialDate = new DateTime(2026, 5, 11); + // 第一段:部分平仓 30%(较早日期 2026-05-11) + var i30 = CallWithDate(td, leg, 0.3m, partialDate); + // 第二段:剩余 70% 全平(到期日,算尾) + var i70 = CallWithDate(td, leg, 0.7m, Maturity); + // 各段对照「同日期全平」基准:缩放必须在相同日期范围内比较 + var fullAtPartial = CallWithDate(td, leg, 1m, partialDate); + var fullAtMaturity = CallWithDate(td, leg, 1m, Maturity); + + Console.WriteLine($"[场景4-2 mode=1 calcMode={calcMode}] 5/11全平={fullAtPartial.InterestAmount} 30%={i30.InterestAmount} 到期全平={fullAtMaturity.InterestAmount} 70%={i70.InterestAmount}"); + + // 核心断言:两段利息必须各自随平仓比例线性缩放(守护 mode-1 修复,修复前会等于全平) + Assert.AreEqual((double)(fullAtPartial.InterestAmount * 0.3m), (double)i30.InterestAmount, 0.01, + "固定值腿第一段(30%)利息应≈同日期全平×30%(修复前会等于全平,即 Bug)"); + Assert.AreEqual((double)(fullAtMaturity.InterestAmount * 0.7m), (double)i70.InterestAmount, 0.01, + "固定值腿第二段(70%)利息应≈同日期全平×70%"); + } + + #endregion + #region 对照组:标的期初全价(9) —— 正确行为,比例线性缩放 [DataTestMethod]