From 7cfa85a7ccdc8fef2c41b0575533d1efb4ed19b7 Mon Sep 17 00:00:00 2001 From: hjhan Date: Wed, 19 Aug 2026 09:28:27 +0800 Subject: [PATCH] =?UTF-8?q?test(swap):=20EQD-6968=20=E8=A1=A5=E5=89=8D?= =?UTF-8?q?=E4=B8=80=E8=90=A5=E4=B8=9A=E6=97=A5=E5=9F=BA=E5=87=86=E7=BB=84?= =?UTF-8?q?=E5=90=88+=E7=AE=97=E5=B0=BE=E9=9D=9E=E9=87=8D=E7=BD=AE?= =?UTF-8?q?=E6=97=A5=E6=94=BE=E8=A1=8C=EF=BC=88=E6=96=B9=E6=A1=88=E4=B8=80?= =?UTF-8?q?=E5=9C=BA=E6=99=AF2/3=E8=90=BD=E6=A0=BC=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - PrevBizDay_TailCalced×2:算尾(11)+rule=-1+当日(7/20)未发布 → 放行(取价日回拨至7/17已发布) - PrevBizDay_NoTail:不算尾(10)+rule=-1+当日未发布 → 放行 - PrevBizDay_FixingDayMissing:rule=-1 但取价日(7/17)本身缺价 → 仍拦(真实依赖守卫) - TailCalced_NonResetDay×2:算尾(11)+当日非重置日(7/22)+当日缺价 → 放行(非重置日不取当日价) 新增 Fr007MarketPrevBizDay 市场:重置日7/6、7/13、7/20 回拨取价日7/3、7/10、7/17 验证:GLMS20260817Fr007UnwindMorningTest 23/23 内存全绿 --- .../GLMS20260817Fr007UnwindMorningTest.cs | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/UnitTestProject/Modules/SwapModule/GLMS20260817Fr007UnwindMorningTest.cs b/UnitTestProject/Modules/SwapModule/GLMS20260817Fr007UnwindMorningTest.cs index 4c678b3e..2eb3c689 100644 --- a/UnitTestProject/Modules/SwapModule/GLMS20260817Fr007UnwindMorningTest.cs +++ b/UnitTestProject/Modules/SwapModule/GLMS20260817Fr007UnwindMorningTest.cs @@ -29,6 +29,14 @@ namespace YLErp.Modules.SwapModule [new DateTime(2026, 7, 13)] = 0.01425, [new DateTime(2026, 7, 20)] = 0.0143, }; + /// interest_rule=-1(前一营业日基准)取价日市场:重置日 7/6、7/13、7/20(周一) + /// 经 GetFixingDate 回拨至前一营业日 7/3、7/10、7/17(周五)。 + private static readonly Dictionary Fr007MarketPrevBizDay = new() + { + [new DateTime(2026, 7, 3)] = 0.0142, + [new DateTime(2026, 7, 10)] = 0.01425, + [new DateTime(2026, 7, 17)] = 0.0143, + }; private const double PreviousResetRate = 0.01425; private const decimal Notional = 279486108.21m; @@ -344,5 +352,62 @@ namespace YLErp.Modules.SwapModule preEod: BuildPreEod(new DateTime(2026, 7, 13))), "不算尾(10)+本次平仓指定算尾+当日有价 → 应成功"); } + + // ── 前一营业日基准(interest_rule=-1,EQD-6968 方案一场景2)── + // 取价日=重置日前一营业日,当日(7/20)定盘未发布也用不到 → 放行; + // 但取价日(前一营业日)本身缺价 → 仍是真实依赖,必须拦截。 + + [TestMethod] + public void PrevBizDay_TailCalced_ResetDayTodayMissing_Succeeds() + { + AssertNoThrow(Run(InterestTypeEnum.复利, includeCloseDate: true, calcMode: "11", interestRule: -1, + omitDate: CloseDate, market: Fr007MarketPrevBizDay, preEod: BuildPreEod(new DateTime(2026, 7, 13))), + "算尾(11)+前一营业日基准+当日(7/20)未发布 → 应放行(取价日7/17已发布)"); + } + + [TestMethod] + public void PrevBizDay_TailCalced_Simple_ResetDayTodayMissing_Succeeds() + { + AssertNoThrow(Run(InterestTypeEnum.单利, includeCloseDate: true, calcMode: "11", interestRule: -1, + omitDate: CloseDate, market: Fr007MarketPrevBizDay, preEod: BuildPreEod(new DateTime(2026, 7, 13))), + "单利 算尾(11)+前一营业日基准+当日未发布 → 应放行"); + } + + [TestMethod] + public void PrevBizDay_NoTail_ResetDayTodayMissing_Succeeds() + { + AssertNoThrow(Run(InterestTypeEnum.复利, includeCloseDate: true, interestRule: -1, + omitDate: CloseDate, market: Fr007MarketPrevBizDay, preEod: BuildPreEod(new DateTime(2026, 7, 13))), + "不算尾(10)+前一营业日基准+当日未发布 → 应放行"); + } + + [TestMethod] + public void PrevBizDay_TailCalced_FixingDayMissing_StillThrows() + { + var o = Run(InterestTypeEnum.复利, includeCloseDate: true, calcMode: "11", interestRule: -1, + omitDate: new DateTime(2026, 7, 17), market: Fr007MarketPrevBizDay, + preEod: BuildPreEod(new DateTime(2026, 7, 13))); + Assert.IsTrue(o.Threw, "算尾(11)+前一营业日基准+取价日(7/17)本身缺价 → 仍应拦截(真实依赖)"); + StringAssert.Contains(o.Ex.Message, "FR007"); + } + + // ── 算尾+当前营业日+当日非重置日(EQD-6968 方案一场景3)── + // 当日价未被任何计息段消费(末段重置日7/20是历史日),当日(7/22)缺价 → 放行。 + + [TestMethod] + public void TailCalced_NonResetDay_TodayMissing_Succeeds() + { + AssertNoThrow(Run(InterestTypeEnum.复利, includeCloseDate: true, calcMode: "11", closeDate: NonIntCloseDate, + preEod: BuildPreEod(new DateTime(2026, 7, 13))), + "算尾(11)+当日非重置日+当日(7/22)缺价 → 应放行(非重置日不取当日价)"); + } + + [TestMethod] + public void TailCalced_NonResetDay_Simple_TodayMissing_Succeeds() + { + AssertNoThrow(Run(InterestTypeEnum.单利, includeCloseDate: true, calcMode: "11", closeDate: NonIntCloseDate, + preEod: BuildPreEod(new DateTime(2026, 7, 13))), + "单利 算尾(11)+当日非重置日+当日缺价 → 应放行"); + } } }