From 309f1b185024a6744c92706aef407d90dabe6106 Mon Sep 17 00:00:00 2001 From: unanmed <1319491857@qq.com> Date: Tue, 15 Sep 2026 10:27:59 +0800 Subject: [PATCH] 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) --- .../phases/06-unit-tests/06-COVERAGE-MAP.md | 17 +++++ .../data-base/src/map/mapLayer.test.ts | 67 +++++++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/.planning/phases/06-unit-tests/06-COVERAGE-MAP.md b/.planning/phases/06-unit-tests/06-COVERAGE-MAP.md index 976895a..6445a60 100644 --- a/.planning/phases/06-unit-tests/06-COVERAGE-MAP.md +++ b/.planning/phases/06-unit-tests/06-COVERAGE-MAP.md @@ -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` 条目。 diff --git a/packages-user/data-base/src/map/mapLayer.test.ts b/packages-user/data-base/src/map/mapLayer.test.ts index f4fec8b..745a375 100644 --- a/packages-user/data-base/src/map/mapLayer.test.ts +++ b/packages-user/data-base/src/map/mapLayer.test.ts @@ -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();