test(swap-eod): SwapInterestScenario3And4FloatingTest 的 TdInterestPrincipal 改独立不变量(封死假绿)

场景4 原 TdInterestPrincipal 断言 = 生产公式镜像(reverseMode2 ? base*(1-cp)/cp : base),
与生产 if(calcLast && mode2) TdInterestPrincipal *= (1-cp)/cp 逐字同构,永远跟自己一致,
故 mode9 被错误反推(GLMS-20260421-0004 膨胀 ~2.3x)时测试仍绿——假绿。

改为:mode9 用独立 else if 锁死 expected=LastBaseInterestPrincipal(反推前 base),
彻底脱离 reverseMode2 布尔拼写,封死重基线陷阱。已实跑证明:注入 mode9 反推 bug 后
唯一变红 T+1浮动减点算头算尾(实测 TdInterestPrincipal=494982903.27),回滚生产恢复 24/24。
零生产改动。
This commit is contained in:
hjhan
2026-08-17 18:18:02 +08:00
parent 09fa96a93f
commit c42335363b
@@ -492,19 +492,33 @@ namespace UnitTestProject.Modules.SwapModule
_eod.RecordEod(partialEod);
DebugCompare("场景4[部分] " + note, oraclePartial, partialEod.TdCloseInterest, partialEod);
AssertStrict(oraclePartial, partialEod.TdCloseInterest, "场景4[部分] " + note);
// 覆盖 mode 2/9 分叉(SwapEodPositionService:1436-1469):部分平仓后 TdInterestPrincipal 的经济口径
// 必须 = 剩余动态本金(剩余名义本金 + 已并入本金的重置日待实现利息),mode2/9 应当一致。
// 单利:line 1491 直接取 posiNotionalValue = remainingNotional无累计利息。
// 复利:base = interests.First().InterestPrincipal(本服务 CalcSwapInterests 已捕获 LastBaseInterestPrincipal);
// mode2 仅在 calcLast 时于 1464 行反推剩余(× (1-cp)/cp)mode9 直取 baseGLMS-20260421-0004 禁止反推)。
// calcLast=false(如“算头不算尾”)或 mode9 被错误反推会膨胀 ~2.3 倍(494982903.27,下方断言精确拦截回归
// TdInterestPrincipal 独立经济不变量断言(取代原 reverseMode2 镜像布尔)。
// 生产线路(SwapEodPositionService ~:1400-1453):
// 单利:直接 TdInterestPrincipal = posiNotionalValue = remainingNotional无累计利息
// 复利:base = 计息器 CalcSwapInterests 返回的 InterestPrincipal,已由本桩捕获 LastBaseInterestPrincipal
// - mode9(标的期初全价):计息器已直接返回「剩余动态本金」,禁止任何 (1-cp)/cp 反推
// GLMS-20260421-0004误反推会 ~212135529.97 膨胀到 ~494982903.27)。
// - mode2(合约名义本金规模)仅 calcLast 时 InterestPrincipal 为已平部分,需反推剩余
// = base*(1-cp)/cp(经济恒等式 remaining = closed/cp closed,非代码镜像)。
// 下方用独立 if 锁死 mode9=base,不依赖 reverseMode2 布尔的拼写——
// 重基线时即便把 reverseMode2 错写成含 mode9mode9 仍走 base 分支,断言照红。
decimal expectedTdPrincipal;
if (!compound)
{
expectedTdPrincipal = remainingNotional;
}
else if (interestMode == (int)InterestModeEnum.)
{
// mode9 回归守卫(GLMS-20260421-0004):TdInterestPrincipal 必须等于反推前的 base
// 任何 (1-cp)/cp 反推都会把 ~212M 剩余本金膨胀到 ~495M,此断言立即红。
expectedTdPrincipal = _eod.LastBaseInterestPrincipal;
}
else
{
// mode2(合约名义本金规模):仅 calcLast 时 InterestPrincipal 为已平部分,需反推剩余
// = base*(1-cp)/cp(经济恒等式 remaining = closed/cp closed,非代码镜像)。
// !calcLast 时生产走 usesFullPreviousEodPrincipal 分支(*= (1-cp)),本测因部分平仓前一日 eod
// 差 3 天使 Days==1 不成立而跳过,故此处取 base。
var cp = partialCloseNotional / Notional; // = 0.3,与 EOD 内部 closePercent 一致
bool reverseMode2 = interestMode == (int)InterestModeEnum. && calcLast;
expectedTdPrincipal = reverseMode2