fix: 步骤3-b 多字段连续手动编辑应累计REV(不再仅最后赢)
根因:applyBondManualEdit 每次调用先重置全部 bondRev 再只标当前字段,
导致连续手动编辑多字段(不回车)时只有最后编辑的字段留 REV,
中间手工编辑字段的 REV 被静默抹掉,UI 与步骤3-b需求不符。
修复:applyBondManualEdit 改为累计 REV(仅置当前字段、保留其它已手工编辑字段的 REV),
driver/AUTO 仍清。单字段编辑(步骤2/3)行为不变,无回归。
配套:
- 更新 a2d2bb31 中3个旧断言("仅最后留REV")为断言累加,避免测试守护错误行为
- 文档约定3 补充"连续编辑多字段时各手动字段累计REV"
swapCalc.js 为独立 script(?v=JsVersion),部署 dotnet publish 即生效,无需重建 bundle。
测试:bondCalc 全套 72 例通过。
This commit is contained in:
@@ -674,7 +674,7 @@ describe('约定1/2/3 状态机:端到端转换', () => {
|
||||
|
||||
// ---- 以下为步骤3-b 及多字段组合场景(文档明确列出但此前缺失) ----
|
||||
|
||||
test('Step3-b 回车CP→改DP→改YD(均不回车) → 仅最后字段(YD)留REV,前面REV被覆盖', () => {
|
||||
test('Step3-b 回车CP→改DP→改YD(均不回车) → DP与YD均累计REV(修复后行为)', () => {
|
||||
const item = makeBondItem();
|
||||
// 步骤1:回车净价(CP)
|
||||
SwapCalc.applyBondCalcSuccess(item, 'CP');
|
||||
@@ -685,20 +685,19 @@ describe('约定1/2/3 状态机:端到端转换', () => {
|
||||
SwapCalc.applyBondManualEdit(item, 'DP');
|
||||
expect(item.bondRev).toEqual({ CP: false, DP: true, YD: false });
|
||||
|
||||
// ★ 步骤3-b:不回车,又改收益率(YD) → DP的REV被覆盖,仅YD留REV
|
||||
// ★ 步骤3-b:不回车,又改收益率(YD) → DP的REV保留、YD也标REV(累计,不再被覆盖)
|
||||
SwapCalc.applyBondManualEdit(item, 'YD');
|
||||
expect(item.bondDriverType).toBeNull(); // 源已被清
|
||||
expect(item.bondAuto).toEqual({ CP: false, DP: false, YD: false }); // AUTO 已清
|
||||
// ⚠️ 核心断言:applyBondManualEdit 每次重置全部 REV 再只标当前字段
|
||||
// 故多字段连续编辑时"最后赢",中间字段的 REV 静默丢失
|
||||
expect(item.bondRev).toEqual({ CP: false, DP: false, YD: true });
|
||||
// 核心断言:applyBondManualEdit 改为累计 REV,多字段连续手动编辑时每个改过的字段都留 REV
|
||||
expect(item.bondRev).toEqual({ CP: false, DP: true, YD: true });
|
||||
// 数值保持不变(约定3:编辑不联动)
|
||||
expect(item.PosiNetNoFeePrice).toBe(0.995); // 净价保留
|
||||
expect(item.PosiGrossPrice).toBe(1.0); // 全价保留
|
||||
expect(item.InitYtm).toBe(0.026); // 收益率保留
|
||||
});
|
||||
|
||||
test('Step3-b 变体:回车CP后连续编辑三字段(CP→DP→YD) → 仅最后(YD)留REV', () => {
|
||||
test('Step3-b 变体:回车CP后连续编辑三字段(CP→DP→YD) → 三个字段均累计REV', () => {
|
||||
const item = makeBondItem();
|
||||
SwapCalc.applyBondCalcSuccess(item, 'CP');
|
||||
|
||||
@@ -706,14 +705,14 @@ describe('约定1/2/3 状态机:端到端转换', () => {
|
||||
SwapCalc.applyBondManualEdit(item, 'CP'); // 先改源字段本身
|
||||
expect(item.bondRev).toEqual({ CP: true, DP: false, YD: false });
|
||||
|
||||
SwapCalc.applyBondManualEdit(item, 'DP'); // 再改第二个 → CP的REV被覆盖
|
||||
expect(item.bondRev).toEqual({ CP: false, DP: true, YD: false });
|
||||
SwapCalc.applyBondManualEdit(item, 'DP'); // 再改第二个 → CP的REV保留、DP也标REV
|
||||
expect(item.bondRev).toEqual({ CP: true, DP: true, YD: false });
|
||||
|
||||
SwapCalc.applyBondManualEdit(item, 'YD'); // 最后改第三个 → DP的REV被覆盖
|
||||
expect(item.bondRev).toEqual({ CP: false, DP: false, YD: true }); // 仅最后赢
|
||||
SwapCalc.applyBondManualEdit(item, 'YD'); // 最后改第三个 → 三者均累计
|
||||
expect(item.bondRev).toEqual({ CP: true, DP: true, YD: true }); // 全部累计,不再"最后赢"
|
||||
});
|
||||
|
||||
test('Step3-b 三字段轮换编辑(CP→DP→YD→CP) → 仅最终(CP)留REV', () => {
|
||||
test('Step3-b 三字段轮换编辑(CP→DP→YD→CP) → 三个字段均累计REV', () => {
|
||||
const item = makeBondItem();
|
||||
SwapCalc.applyBondCalcSuccess(item, 'CP');
|
||||
|
||||
@@ -723,8 +722,8 @@ describe('约定1/2/3 状态机:端到端转换', () => {
|
||||
SwapCalc.applyBondManualEdit(item, 'YD');
|
||||
SwapCalc.applyBondManualEdit(item, 'CP'); // 回到第一个
|
||||
|
||||
// 无论轮换多少次,只有最后一次 applyBondManualEdit 的字段留 REV
|
||||
expect(item.bondRev).toEqual({ CP: true, DP: false, YD: false });
|
||||
// 无论轮换多少次,每次编辑的字段都累计REV(不再"只有最后一次留REV")
|
||||
expect(item.bondRev).toEqual({ CP: true, DP: true, YD: true });
|
||||
expect(item.bondDriverType).toBeNull();
|
||||
expect(item.bondAuto).toEqual({ CP: false, DP: false, YD: false });
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user