diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index 3844cc0..49d234c 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -244,7 +244,7 @@ Plans: - [x] 06-10-PLAN.md — combat/enemy combination gaps: G-06-01-A/B/C + G-06-07-A - [x] 06-11-PLAN.md — hero/map gaps: G-06-05-A + G-06-06-A/B/C - [x] 06-12-PLAN.md — replay/enemy gaps: G-06-04-B (runnable) + G-06-04-A/G-06-03-A (correct-expectation skip) -- [ ] 06-13-PLAN.md — save/load gaps: G-06-09-A/B (only plan testing saveState/loadState, D-32) +- [x] 06-13-PLAN.md — save/load gaps: G-06-09-A/B (only plan testing saveState/loadState, D-32) **Wave 4** *(G-06-04-C follow-up gap-fill, D-46; serialized after 06-12 because it shares `array.test.ts`)* @@ -262,4 +262,4 @@ Phases execute in numeric order: 1 → 2 → 3 → 4 → 5 → 6 | 3. 数据端完成 | 19/19 | Complete | 2026-09-12 | | 4. 渲染适配与双布局 | 0/TBD | Not started | - | | 5. Legacy 移植 | 0/TBD | Not started | - | -| 6. 单元测试 | 12/13 | In Progress| | +| 6. 单元测试 | 13/14 | In Progress| | diff --git a/.planning/STATE.md b/.planning/STATE.md index 893215a..c8db7a9 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -4,16 +4,16 @@ milestone: v1.0 current_phase: 06 current_phase_name: unit-tests status: executing -stopped_at: Completed 06-12-PLAN.md (replay + enemy-model gap-fill) -last_updated: "2026-09-15T02:45:50.273Z" +stopped_at: Completed 06-13-PLAN.md (save/load coverage gap-fill) +last_updated: "2026-09-15T03:30:34.572Z" last_activity: 2026-09-15 last_activity_desc: Phase 06 execution started -state_head: e2c163899d24c0e327af9631215802cc468feb51 +state_head: 992ca9d585ab012267d030ef94daba00f5e80623 progress: total_phases: 6 completed_phases: 0 - total_plans: 50 - completed_plans: 49 + total_plans: 51 + completed_plans: 50 milestone_name: milestone --- @@ -29,9 +29,9 @@ See: .planning/PROJECT.md (updated 2026-09-10) ## Current Position Phase: 06 (unit-tests) — EXECUTING -Plan: 12 of 13 (06-12 gap-fill complete; 06-13 pending) -Status: Phase 06 gap-fill batch (D-46) in progress — 06-12 (G-06-04-A/B, G-06-03-A) complete; pnpm test:ci green (66 files / 644 passed / 22 skipped) -Last activity: 2026-09-15 — Completed 06-12-PLAN.md +Plan: 13 of 14 (06-13 gap-fill complete; 06-14 pending) +Status: Phase 06 gap-fill batch (D-46) in progress — 06-13 (G-06-09-A/B) complete; pnpm test:ci green (66 files / 646 passed / 25 skipped) +Last activity: 2026-09-15 — Completed 06-13-PLAN.md Progress: [█████░░░░░] 50% @@ -90,6 +90,7 @@ Progress: [█████░░░░░] 50% | Phase 06 P10 | 15min | 3 tasks | 4 files | | Phase 06 P11 | 10min | 3 tasks | 5 files | | Phase 06 P12 | 13min | 3 tasks | 3 files | +| Phase 06 P13 | 14min | 3 tasks | 4 files | ## Accumulated Context @@ -189,6 +190,9 @@ Recent decisions affecting current work: - [Phase 06]: 06-11:G-06-06-C 的 compareWith 参考数组必须等于各图层当前内容(含非零格),全零参考会把 low/mid 判脏;缺口补测按 D-43 三阶段执行,无新增码、无疑似 bug、无 it.skip - [Phase 06]: 06-12:G-06-04-B 异质多命令序列读回只比较 command/params(读流 index = position + 1、get index = i),不整体 toEqual - [Phase 06]: 06-12:G-06-04-A/G-06-03-A 复用既有 #06-04-1/#06-04-2/#06-03-1 锚点,按 D-05 写正确预期 it.skip,不新建 #06-12-N 条目(无新疑似 bug) +- [Phase 06]: 06-13:G-06-09-A 顶层全关键状态严格一致 + 录像 10 步多样化(8 类命令 + number/boolean/string 参数)逐条 exact;G-06-09-B 接受 compression 的类三档循环、无参类经 HeroState/CoreState 容器三档确认 +- [Phase 06]: 06-13:EquipmentState 百分比 Low/High 命中既有 #06-09-1、HeroEquipment 经容器三档命中既有 #06-09-2,按 D-05 拆成正确预期 it.skip(经临时取消 skip 验证真实失败),既有 #06-09-1..5 skip 保持原样 +- [Phase 06]: 06-13:flags/replay 的 saveState 不接受 compression 参数,按 plan 经 CoreState.saveState(compression)/loadState(snapshot, compression) 容器三档确认;本计划无新增码、无新增 finding 条目 ### Pending Todos @@ -218,6 +222,6 @@ None yet. ## Session Continuity -Last session: 2026-09-15T02:45:50.033Z -Stopped at: Completed 06-12-PLAN.md (replay + enemy-model gap-fill) +Last session: 2026-09-15T03:30:34.572Z +Stopped at: Completed 06-13-PLAN.md (save/load coverage gap-fill) Resume file: None diff --git a/.planning/WINDOWS.md b/.planning/WINDOWS.md index 32b172c..f479ab7 100644 --- a/.planning/WINDOWS.md +++ b/.planning/WINDOWS.md @@ -1,10 +1,10 @@ --- schema_version: 1 -open_count: 16 +open_count: 18 waived_count: 0 fixed_count: 8 -total_count: 24 -last_updated: 2026-09-15T02:46:32.772Z +total_count: 26 +last_updated: 2026-09-15T03:31:00.000Z --- # Broken Windows Ledger @@ -39,6 +39,8 @@ last_updated: 2026-09-15T02:46:32.772Z | 22 | 06 | skipped-test | packages-user/data-common/src/common/mover.test.ts | | backward(count>1) 方向摆动、净位移为零(#06-08-1),已 it.skip 待用户确认 | open | | 2026-09-14T09:03:38.649Z | | | 23 | 06 | skipped-test | packages-user/data-common/src/replay/array.test.ts | | 受阻塞缺口 G-06-04-A:多字节 bigint / 超 int32 int64 编解码缺陷 #06-04-1/#06-04-2 未修复,正确预期用例保持 it.skip | open | | 2026-09-15T02:46:32.026Z | | | 24 | 06 | skipped-test | packages-user/data-base/src/enemy/manager.test.ts | | 受阻塞缺口 G-06-03-A:复用映射未接入 createEnemy/createEnemyById(#06-03-1),四朝向复用生成独立怪物的正确预期用例保持 it.skip | open | | 2026-09-15T02:46:32.772Z | | +| 25 | 06 | skipped-test | packages-user/data-base/src/hero/saveLoad.test.ts | | 受阻塞缺口 G-06-09-B:压缩档 loadDiff 未回退装备原始定义(#06-09-1),EquipmentState 百分比加成 Low/High 档正确预期用例保持 it.skip | open | | 2026-09-15T03:31:00.000Z | | +| 26 | 06 | skipped-test | packages-user/data-base/src/hero/saveLoad.test.ts | | 受阻塞缺口 G-06-09-B:HeroEquipment.saveState 未深拷贝 equipped/slots(#06-09-2),经 HeroState 容器三档恢复装备映射的正确预期用例保持 it.skip | open | | 2026-09-15T03:31:01.000Z | | ````json [ @@ -329,6 +331,30 @@ last_updated: 2026-09-15T02:46:32.772Z "reason": "", "recorded_at": "2026-09-15T02:46:32.772Z", "resolved_at": null + }, + { + "id": 25, + "kind": "skipped-test", + "phase": "06", + "file": "packages-user/data-base/src/hero/saveLoad.test.ts", + "line": null, + "description": "受阻塞缺口 G-06-09-B:压缩档 loadDiff 未回退装备原始定义(#06-09-1),EquipmentState 百分比加成 Low/High 档正确预期用例保持 it.skip", + "status": "open", + "reason": "", + "recorded_at": "2026-09-15T03:31:00.000Z", + "resolved_at": null + }, + { + "id": 26, + "kind": "skipped-test", + "phase": "06", + "file": "packages-user/data-base/src/hero/saveLoad.test.ts", + "line": null, + "description": "受阻塞缺口 G-06-09-B:HeroEquipment.saveState 未深拷贝 equipped/slots(#06-09-2),经 HeroState 容器三档恢复装备映射的正确预期用例保持 it.skip", + "status": "open", + "reason": "", + "recorded_at": "2026-09-15T03:31:01.000Z", + "resolved_at": null } ] ```` diff --git a/.planning/phases/06-unit-tests/06-13-SUMMARY.md b/.planning/phases/06-unit-tests/06-13-SUMMARY.md new file mode 100644 index 0000000..d633acd --- /dev/null +++ b/.planning/phases/06-unit-tests/06-13-SUMMARY.md @@ -0,0 +1,215 @@ +--- +phase: 06-unit-tests +plan: 13 +subsystem: testing +tags: [vitest, save-load, saveState, loadState, compression, hero, map, core-state, replay, coverage-gap, it-skip] + +# Dependency graph +requires: + - phase: 06-unit-tests + provides: 06-09 存档单测(各 saveLoad 类同实例往返 + CoreState 顶层公开 save/load 入口 D-45) + - phase: 06-unit-tests + provides: 06-05 勇士单测(HeroState/HeroItems/HeroEquipment 公开表面)与 06-06 地图单测(StaticTile/DynamicTile) +provides: + - G-06-09-A 可跑绿:CoreState 顶层往返对每类 saveable 的全部关键状态逐一严格断言;录像 10 步多样化命令逐条 exact 断言 + - G-06-09-B 可跑绿:接受 compression 的类(EquipmentState/HeroItems/HeroState/StaticTile/DynamicTile)三档循环;无参类(HeroLocation/HeroRendering/FlagSystem/ReplaySystem)经 HeroState/CoreState 容器三档确认 + - G-06-09-B 受阻塞的正确预期 it.skip:EquipmentState 百分比加成 Low/High 压缩档(锚定 #06-09-1)、HeroEquipment 经容器三档(锚定 #06-09-2) + - 06-COVERAGE-MAP.md 06-13 小节(缺口 → 用例 → 文件 → 计划 映射) +affects: [06-verify-work, 06-unit-tests 缺口收口] + +# Actuals (#2632) — pairs with the plan's `estimate` to calibrate future estimates. +actuals: + tokens: 7700 + tasks: 3 + commits: 3 +plan_head_before: 60be0c0a24e56e1d69f78943c165662b6d34b637 + +tech-stack: + added: [] + patterns: + - "三档压缩覆盖:接受 compression 参数的类 for (const compression of SAVE_COMPRESSIONS) 循环;不接受的类经 HeroState/CoreState 容器三档确认读取正确(G-06-09-B)" + - "已知缺陷档位:按正确预期拆成独立 it,受阻塞档位 it.skip + 中文注释锚定既有 #06-09-N,绝不弱化为通过(D-05)" + - "顶层关键状态逐一严格断言:seedState/mutateState/assertRestored 三者字段一一对应,录像以期望表逐条 exact 比对 command/params/index(D-13)" + +key-files: + created: [] + modified: + - packages-user/data-base/src/hero/saveLoad.test.ts + - packages-user/data-base/src/map/saveLoad.test.ts + - packages-user/data-state/test/saveablesRoundTrip.test.ts + - .planning/phases/06-unit-tests/06-COVERAGE-MAP.md + +key-decisions: + - "EquipmentState 百分比三档化:NoCompression 跑绿,Low/High 因 loadDiff 未回退装备原始定义(#06-09-1)而丢失未修改加成,按正确预期拆成 it.skip 而非弱化断言" + - "HeroEquipment 经 HeroState 容器三档:saveState 未深拷贝 equipped/slots(#06-09-2),同实例容器往返必然丢失,按正确预期 it.skip 锚定既有条目" + - "录像 10 步命令(0/1/2/3 移动、4 Teleport、5 UseItem×2、6 Equip、7 Unequip)参数类型含 number/boolean/string,确保命令不全相同且组合多样" + - "flags/replay 不接受 compression 参数,经 CoreState.saveState(compression)/loadState(snapshot, compression) 三档容器往返满足 G-06-09-B" + +patterns-established: + - "roundTripPercentageModifier(compression) 文件内 helper:同一往返逻辑供三档(含 skip 档)复用,避免断言漂移" + +requirements-completed: [TEST-01] + +coverage: + - id: D1 + description: "G-06-09-A:CoreState 顶层对每类 saveable 的全部关键状态逐一严格断言,录像 ≥10 步多样化命令逐条 exact" + requirement: "TEST-01" + verification: + - kind: unit + ref: "packages-user/data-state/test/saveablesRoundTrip.test.ts#round-trips every registered saveable across all compressions" + status: pass + human_judgment: false + - id: D2 + description: "G-06-09-B:hero 单档类三档化 + 经 HeroState 容器覆盖无 compression 参数类" + requirement: "TEST-01" + verification: + - kind: unit + ref: "packages-user/data-base/src/hero/saveLoad.test.ts#restores a percentage modifier on the same instance in NoCompression" + status: pass + - kind: unit + ref: "packages-user/data-base/src/hero/saveLoad.test.ts#restores constant and consumable item tables across all compressions" + status: pass + - kind: unit + ref: "packages-user/data-base/src/hero/saveLoad.test.ts#restores attributes, modifiers and location across all compressions" + status: pass + - kind: unit + ref: "packages-user/data-base/src/hero/saveLoad.test.ts#restores location and rendering through the container across all compressions" + status: pass + human_judgment: false + - id: D3 + description: "G-06-09-B:map StaticTile/DynamicTile 三档化" + requirement: "TEST-01" + verification: + - kind: unit + ref: "packages-user/data-base/src/map/saveLoad.test.ts#restores covered events across all compressions (StaticTile)" + status: pass + - kind: unit + ref: "packages-user/data-base/src/map/saveLoad.test.ts#restores covered events across all compressions (DynamicTile)" + status: pass + human_judgment: false + - id: D4 + description: "G-06-09-B:flags/replay 经 CoreState 容器三档确认读取正确" + requirement: "TEST-01" + verification: + - kind: unit + ref: "packages-user/data-state/test/saveablesRoundTrip.test.ts#restores flags and replay through the container across all compressions" + status: pass + human_judgment: false + - id: D5 + description: "受既有缺陷阻塞的档位:EquipmentState 百分比 Low/High(#06-09-1)与 HeroEquipment 容器三档(#06-09-2)的正确预期已登记,只能 it.skip" + requirement: "TEST-01" + verification: + - kind: unit + ref: "packages-user/data-base/src/hero/saveLoad.test.ts#restores a percentage modifier on the same instance in LowCompression (it.skip)" + status: unknown + - kind: unit + ref: "packages-user/data-base/src/hero/saveLoad.test.ts#restores a percentage modifier on the same instance in HighCompression (it.skip)" + status: unknown + - kind: unit + ref: "packages-user/data-base/src/hero/saveLoad.test.ts#restores the equipped mapping through the container across all compressions (it.skip)" + status: unknown + human_judgment: true + rationale: "既有缺陷 #06-09-1(压缩档不回退装备原始定义)与 #06-09-2(saveState 未深拷贝)未修复;三条 skip 经临时取消 skip 验证均为真实失败,跳过不代表通过,需人工确认是否进入修复批次。" + +duration: 14min +completed: 2026-09-15 +status: complete +--- + +# Phase 06 Plan 13: 存档缺口补测(G-06-09-A/B)Summary + +**按 D-43 三阶段补齐 G-06-09-A(CoreState 顶层全关键状态严格一致 + 录像 ≥10 步多样化)与 G-06-09-B(所有 saveState/loadState 类三档覆盖,无参类经容器三档),只扩展 3 个 `*.test.ts` 与覆盖表,无任何生产代码改动。本计划是本批次唯一测试 `saveState`/`loadState` 的计划(D-32)。** + +## Performance + +- **Duration:** 14min +- **Started:** 2026-09-15T11:14:00Z +- **Completed:** 2026-09-15T11:28:00Z +- **Tasks:** 3 +- **Files modified:** 4(3 个测试文件 + 1 个覆盖表) + +## Accomplishments + +- **阶段 1(构件级,`hero/saveLoad.test.ts`)**:`EquipmentState` 百分比加成按档拆分——NoCompression 跑绿,Low/High 命中既有 `#06-09-1` 按正确预期 `it.skip`;`HeroItems` 永久/消耗分表与 `HeroState` 属性/修饰器/位置改为 `for (const compression of SAVE_COMPRESSIONS)` 三档循环;新增「经 `HeroState` 容器三档」用例覆盖 `HeroLocation`/`HeroRendering`,`HeroEquipment` 经容器的正确预期因 `#06-09-2` 以 `it.skip` 登记。既有 `#06-09-1`/`#06-09-2` skip 原样保留。 +- **阶段 2(组合,`map/saveLoad.test.ts`)**:`StaticTile` 与 `DynamicTile` 的覆盖事件往返改为三档循环(每档新建 fixture/tile),断言覆盖事件映射恢复与 `saved.num`;既有 `#06-09-3` skip 原样保留;既有 `MapLayer`/`GameMap`/`MapState` 三档用例未回归。 +- **阶段 3(完整/集成,`saveablesRoundTrip.test.ts`)**:`seedState`/`mutateState`/`assertRestored` 扩为逐类 saveable 的**全部关键状态**并严格断言——勇士 base hp/atk/def/money/exp + 修饰器最终 atk(15) + 位置/楼层/朝向;flags score/coins/stage;地图两块 `(0,0)=5`/`(1,1)=7` + 激活状态;enemy hp 30/atk 9;录像 **10 步多样化命令**逐条 exact(command/params/index)。新增 flags/replay 容器三档用例;既有 `#06-09-5` skip 原样保留。 +- `06-COVERAGE-MAP.md` 以 create-or-append 方式追加 06-13 小节(缺口 → 用例 → 文件 → 计划),明确「本计划无新增码」。 + +## Task Commits + +Each task was committed atomically: + +1. **Task 1: 阶段 1(构件级)hero 三档化 + 容器覆盖无参类** - `6d7e57a` (test) +2. **Task 2: 阶段 2(组合)map tile 三档化** - `8a7cda9` (test) +3. **Task 3: 阶段 3(完整/集成)CoreState 全关键状态 + 录像 10 步 + 覆盖表** - `992ca9d` (test) + +**Plan metadata:** _(docs: complete 06-13 plan — 见最终提交)_ + +## Files Created/Modified + +- `packages-user/data-base/src/hero/saveLoad.test.ts` - 新增 `roundTripPercentageModifier` helper;`EquipmentState` 百分比按档拆分(1 绿 + 2 正确预期 skip);`HeroItems`/`HeroState` 三档循环;新增容器覆盖 describe(location/rendering 绿 + equip 正确预期 skip) +- `packages-user/data-base/src/map/saveLoad.test.ts` - `StaticTile`/`DynamicTile` 覆盖事件往返三档化,改名 `restores covered events across all compressions` +- `packages-user/data-state/test/saveablesRoundTrip.test.ts` - 新增 `REPLAY_STEPS` 期望表与 `seedReplay`;`seedState`/`mutateState`/`assertRestored` 扩为全关键状态;新增 flags/replay 容器三档 describe +- `.planning/phases/06-unit-tests/06-COVERAGE-MAP.md` - create-or-append 06-13 小节 + +## Decisions Made + +- **已知缺陷档位不弱化**:`EquipmentState` 百分比在 Low/High 读档后修饰器消失(`loadDiff` 未回退 `item.equip`,`#06-09-1`);`HeroEquipment` 经容器三档丢失装备映射(`saveState` 未深拷贝,`#06-09-2`)。二者均按正确预期写成独立 `it.skip`,不复用 NoCompression 的通过断言掩盖缺陷。 +- **无 compression 参数类经容器确认**:`FlagSystem`/`ReplaySystem` 的 `saveState` 不接受压缩档,按 plan 要求经 `CoreState.saveState(compression)`/`loadState(snapshot, compression)` 三档容器往返确认读取正确。 +- **录像多样化**:10 步覆盖 8 种命令码中的 8 类(含 Teleport/UseItem/Equip/Unequip),参数类型含 number/boolean/string;逐条 `toEqual({ command, params, index })`。 +- **不新建 finding**:三条新 skip 均复用既有 `#06-09-1`/`#06-09-2` 锚点,`06-TEST-FINDINGS.md` 无新增 `#06-13-N` 缺陷条目。 + +## Deviations from Plan + +**1. [Rule 3 — 计划措辞与实现的类型约束] `EquipmentState` 百分比用例改为三档拆分而非单条 for 循环** + +- **Found during:** Task 1 +- **Issue:** Plan 要求把「百分比加成恢复」用例改为 `for (const compression of SAVE_COMPRESSIONS)` 三档循环,但 Low/High 档命中既有缺陷 `#06-09-1`(`loadDiff` 清空后未回退装备原始定义)。若保留单条循环并弱化断言即违反 D-05(不得弱化为通过);若整条 skip 则会连带取消 NoCompression 的既有跑绿覆盖。 +- **Fix:** 抽取 `roundTripPercentageModifier(compression)`,拆成 3 条 `it`(NoCompression 跑绿;Low/High 正确预期 `it.skip` 锚定 `#06-09-1`)。plan 的 execution_rules 明确授权「若某档命中已知缺陷,按 D-05 将该档改为正确预期 `it.skip` 并锚定既有 `#06-09-N`」。 +- **Files modified:** `packages-user/data-base/src/hero/saveLoad.test.ts` +- **Commit:** `6d7e57a` + +**2. [Rule 3 — 类型约束] `roundTripPercentageModifier` 返回类型取 `unknown`** + +- **Found during:** Task 1(D-44 类型门禁) +- **Issue:** `IHeroModifier` 的 `getValue()` 实际返回 `unknown`(`IHeroModifier`),标注为 `number | undefined` 触发 `TS2322`。 +- **Fix:** 返回类型改为 `unknown`,断言侧仍用 `toBe(0.5)`,不引入 `as`。 +- **Files modified:** `packages-user/data-base/src/hero/saveLoad.test.ts` +- **Commit:** `6d7e57a` + +## Issues Encountered + +None. 三阶段均先聚焦跑绿再进入下一阶段,未出现阻断后续阶段的 bug;未触碰任何生产/核心源码。 + +## Verification Evidence + +- **阶段 1 聚焦运行**:`pnpm exec vitest run packages-user/data-base/src/hero/saveLoad.test.ts` → 1 file passed / 14 passed / 6 skipped(新增 3 条正确预期 skip)。 +- **阶段 2 聚焦运行**:`pnpm exec vitest run packages-user/data-base/src/map/saveLoad.test.ts` → 1 file passed / 8 passed / 1 skipped(既有 `#06-09-3` 不变)。 +- **阶段 3 聚焦运行**:`pnpm exec vitest run packages-user/data-state/test/saveablesRoundTrip.test.ts` → 1 file passed / 8 passed / 1 skipped(既有 `#06-09-5` 不变)。 +- **D-44 门禁(每次提交前)**: + - `pnpm exec eslint --fix <改动文件>` 后 `pnpm exec eslint <改动文件>` → exit 0(3 次均 0 错误)。 + - `pnpm exec vue-tsc --noEmit` 输出按三个改动测试文件路径过滤 → 0 匹配(阶段 1 曾出现 1 处 `TS2322`,按 deviation 2 修正后归零);全局既有无关错误 28 行不在本门禁范围。 + - `pnpm test:ci` → 全绿:阶段 1 后 66 文件 / 645 通过 / 25 跳过;阶段 3 后 **66 文件 / 646 通过 / 25 跳过**,无失败。 +- **skip 真实性**:三条新增 `it.skip` 经临时取消 skip 运行确认均为真实失败(百分比档读回 `undefined` 修饰器值;容器 equip 档 `getEquipped(0)` 为 `undefined`),随后恢复 skip。 +- **变更范围**:`git status` 仅显示 3 个 `*.test.ts` 与 `06-COVERAGE-MAP.md`;无生产/核心源码改动。既有 `#06-09-1..5` 的 skip 全部保持原样。 + +## Known Stubs + +None - 无桩代码;3 条 `it.skip` 为受既有缺陷阻塞的正确预期登记(D-05/D-46),锚定 `06-TEST-FINDINGS.md` 既有 `#06-09-1`/`#06-09-2`。 + +## Next Phase Readiness + +- 06-09(存档)人工评审发现的覆盖缺口 G-06-09-A/B 已全部收口(可跑绿部分补齐;受既有缺陷阻塞的档位以正确预期 skip 登记)。 +- 后续若修复 `#06-09-1`(压缩档回退装备原始定义)与 `#06-09-2`(`saveState` 深拷贝),需取消对应 3 条 `it.skip` 并转为回归用例(D-05)。 +- Wave 4 的 06-14(G-06-04-C 录像读取流)仍待执行。 + +## Self-Check: PASSED + +- FOUND: .planning/phases/06-unit-tests/06-13-SUMMARY.md +- FOUND: 6d7e57a (Task 1) +- FOUND: 8a7cda9 (Task 2) +- FOUND: 992ca9d (Task 3) + +--- +*Phase: 06-unit-tests* +*Completed: 2026-09-15* diff --git a/.planning/phases/06-unit-tests/06-TEST-FINDINGS.md b/.planning/phases/06-unit-tests/06-TEST-FINDINGS.md index ed658b8..78202a9 100644 --- a/.planning/phases/06-unit-tests/06-TEST-FINDINGS.md +++ b/.planning/phases/06-unit-tests/06-TEST-FINDINGS.md @@ -207,3 +207,32 @@ type」语义不同;本计划按 plan 措辞以文件内联语义 reducer 断 **本计划未发现新疑似 bug**,无新增 `#06-12-N` 条目;受阻塞缺口复用既有 `#06-04-1`/`#06-04-2`/`#06-03-1` 锚点(详见上文 `## #06-04` 与 `## #06-03` 小节)。 + +## #06-13 存档缺口补测(D-46) + +本计划按 D-43 三阶段(构件 → 组合 → 完整/集成)补齐 G-06-09-A、G-06-09-B, +只扩展 `*.test.ts` 与 `06-COVERAGE-MAP.md`,未改动任何生产/核心源码;三个测试文件聚焦运行通过, +`pnpm test:ci` 全绿(66 文件 / **646 通过** / **25 跳过**)。 + +- 阶段 1 构件级(`data-base/src/hero/saveLoad.test.ts`):G-06-09-B —— + `EquipmentState` 百分比加成按档拆分(NoCompression 跑绿;Low/High 命中既有 `#06-09-1` + 缺陷,按 D-05 写正确预期 `it.skip`);`HeroItems` 永久/消耗分表与 `HeroState` + 属性/修饰器/位置均在 `NoCompression`/`LowCompression`/`HighCompression` 三档循环并跑绿; + 新增「经 `HeroState` 容器三档」用例覆盖无 compression 参数的 `HeroLocation`/`HeroRendering`, + `HeroEquipment` 经容器的正确预期因既有 `#06-09-2`(存档未深拷贝)以 `it.skip` 登记。 +- 阶段 2 组合(`data-base/src/map/saveLoad.test.ts`):G-06-09-B —— `StaticTile` 与 + `DynamicTile` 的覆盖事件往返均改为三档循环并跑绿;既有 `#06-09-3` skip 保持原样。 +- 阶段 3 完整/集成(`data-state/test/saveablesRoundTrip.test.ts`):G-06-09-A —— + `seedState`/`mutateState`/`assertRestored` 覆盖每类 saveable 的全部关键状态并逐一严格断言 + (勇士 base hp/atk/def/money/exp + 修饰器最终 atk + 位置/楼层/朝向;flags score/coins/stage; + 地图两块 + 激活状态;enemy hp/atk;录像 10 步),录像构造 **10 步多样化命令** + (0/1/2/3 移动、4 Teleport、5 UseItem(数字与字符串参数各一)、6 Equip、7 Unequip, + 参数类型含 number/boolean/string),读档后逐条 exact 断言 `command`/`params`/`index`。 + G-06-09-B(flags/replay 容器三档):新增用例经 `CoreState.saveState(compression)`/ + `loadState(snapshot, compression)` 三档往返并断言 flags 字段与录像步数/逐条命令。 + 既有 `#06-09-5` skip 保持原样。 + +**本计划未发现新疑似 bug**,无新增 `#06-13-N` 条目。新增的 3 条 `it.skip` 均复用既有锚点 +(`#06-09-1` 两条百分比加成压缩档、`#06-09-2` 一条 HeroEquipment 容器三档), +并已逐条临时取消 skip 验证确为真实失败(断言分别得到 `undefined` 修饰器值与 `undefined` 已装备 uid)。 +既有 `#06-09-1..5` 的 skip 全部保持不变,未取消、未改写、未弱化。