test(06-11): cover static-dynamic-move-static full chain (G-06-06-A)

- mapLayer.test.ts: both keepEvent branches verified after a real-timer move,
  with exact event maps, dirty flags, block write-back and dynamic index updates
- 06-COVERAGE-MAP.md: append the 06-11 gap-fill section (create-or-append)
This commit is contained in:
unanmed 2026-09-15 10:27:59 +08:00
parent 41da613f0b
commit 309f1b1850
2 changed files with 84 additions and 0 deletions

View File

@ -282,3 +282,20 @@ D-40:真实英雄操作经 `replay.route.add(...)`(mover 方向步)录制
| G-06-07-A | `computes one exact damage and turn for the maximum pipeline monster`、`produces a different result once the support pipeline is removed` | `data-state/test/enemyCombination.test.ts` | 06-10 |
本计划无 `it.skip`/`it.todo`(预期无需新增),`06-TEST-FINDINGS.md` 无 `#06-10-N` 条目。
## 06-11 勇士与地图缺口补测(D-46)
本计划为**覆盖缺口补测**(G-06-05-A、G-06-06-A/B/C),**不引入任何新码**,复用既有可达码;
阶段结构为 构件(多槽装备合并 + createMap 内容生成)→ 组合(多 zIndex 图层并存)→
完整/集成(静态→动态→移动→静态 全链路,keepEvent 两分支)。
| 缺口 | 用例 | 文件 | 计划 |
| --- | --- | --- | --- |
| G-06-05-A | `merges the final attributes of two equipped slots` | `data-base/src/hero/equipment.test.ts` | 06-11 |
| G-06-06-B | `generates and reads content on a map created by createMap` | `data-base/src/map/mapState.test.ts` | 06-11 |
| G-06-06-C | `keeps layers of different z-index coexisting with independent data` | `data-base/src/map/gameMap.test.ts` | 06-11 |
| G-06-06-A | `keeps the moved dynamic events across a full static round trip`、`drops the moved dynamic events across a full static round trip` | `data-base/src/map/mapLayer.test.ts` | 06-11 |
本计划**无新增码**,复用既有可达码(84/121/127/128/129/131 等的既有覆盖保持不变),
不削弱也不删除任何既有用例或跳过;无 `it.skip`/`it.todo` 新增,
`06-TEST-FINDINGS.md` 无 `#06-11-N` 条目。

View File

@ -459,6 +459,73 @@ describe('MapLayer dynamic conversion', () => {
expect(restored.tileEvent().dirty()).toBe(false);
});
// 验证静态→动态→移动→静态全链路的 keepEvent=true 分支保留移动后的动态专属事件
it('keeps the moved dynamic events across a full static round trip', async () => {
const { layer } = createFixture([1, 2, 1, 2]);
layer.getTile(0, 0);
const tile = layer.transferToDynamic(0, 0)!;
const controller = tile.step(FaceDirection.Right);
expect(controller).not.toBeNull();
expect(tile.mover.moving).toBe(true);
await controller!.onEnd;
expect(tile.x).toBe(1);
expect(tile.y).toBe(0);
expect([...layer.getDynamicTilesAt(1, 0)]).toContain(tile);
expect([...layer.getDynamicTilesAt(0, 0)]).toEqual([]);
expect(layer.getBlock(1, 0)).toBe(2);
tile.tileEvent().set(30, 'moved-event');
const result = logger.catch(() => layer.transferToStatic(tile, true)!);
const restored = result.ret;
expect(restored.num()).toBe(1);
expect(layer.getBlock(1, 0)).toBe(1);
expect(layer.getBlock(0, 0)).toBe(0);
expect(restored.tileEvent().get()).toEqual(
new Map([
[10, 'base-event'],
[30, 'moved-event']
])
);
expect(restored.tileEvent().dirty()).toBe(true);
expect([...layer.getDynamicTilesAt(1, 0)]).toEqual([]);
});
// 验证移动后转静态的 keepEvent=false 分支丢弃动态专属事件并按写回块 num 重推默认事件
it('drops the moved dynamic events across a full static round trip', async () => {
const { layer } = createFixture([1, 2, 1, 2]);
layer.getTile(0, 0);
const tile = layer.transferToDynamic(0, 0)!;
const controller = tile.step(FaceDirection.Right);
expect(controller).not.toBeNull();
await controller!.onEnd;
expect(tile.x).toBe(1);
expect(tile.y).toBe(0);
expect([...layer.getDynamicTilesAt(1, 0)]).toContain(tile);
expect([...layer.getDynamicTilesAt(0, 0)]).toEqual([]);
expect(layer.getBlock(1, 0)).toBe(2);
tile.tileEvent().set(30, 'moved-event');
const result = logger.catch(() => layer.transferToStatic(tile, false)!);
const restored = result.ret;
expect(restored.num()).toBe(1);
expect(layer.getBlock(1, 0)).toBe(1);
expect(layer.getBlock(0, 0)).toBe(0);
expect(restored.tileEvent().get()).toEqual(
new Map([[10, 'base-event']])
);
expect(restored.tileEvent().get().has(30)).toBe(false);
expect(restored.tileEvent().dirty()).toBe(false);
expect([...layer.getDynamicTilesAt(1, 0)]).toEqual([]);
});
// 验证 transferToStatic 对越界坐标告警 128 并拒绝转换
it('warns code 128 when transferToStatic is out of bounds', () => {
const { layer } = createFixture();