diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index e4669f0..39e67e8 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -210,7 +210,7 @@ Plans: 3. 测试在本地可运行且全部通过 4. 测试由 AI 编写并运行,通过验证后可提交 -**Plans**: 9/9 plans executed replanned (D-28;旧 06-01/06-02 执行结果标记 superseded,按同号重跑;数据端切片,非数据 render/legacy 覆盖延后) +**Plans**: 9/9 原计划 executed replanned (D-28;旧 06-01/06-02 执行结果标记 superseded,按同号重跑;数据端切片,非数据 render/legacy 覆盖延后) + gap-fill 06-10..06-13 (D-46;人工评审缺口补测,只补测试不改生产代码;10/13 executed) Plans: @@ -239,6 +239,13 @@ Plans: - [x] 06-07-PLAN.md — depends on 06-02/06-04/06-06; replay recording wired by user (17d7c8f), SUMMARY complete - [x] 06-09-PLAN.md — depends on 06-03/06-05/06-06/06-08; requires user to adjust CoreState saveables + add public save/load entry +**Wave 3** *(gap-fill batch, D-46; extends existing `*.test.ts`, no production edits)* + +- [x] 06-10-PLAN.md — combat/enemy combination gaps: G-06-01-A/B/C + G-06-07-A +- [ ] 06-11-PLAN.md — hero/map gaps: G-06-05-A + G-06-06-A/B/C +- [ ] 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) + ## Progress **Execution Order:** @@ -251,4 +258,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. 单元测试 | 9/9 | In Progress| | +| 6. 单元测试 | 10/13 | In Progress| | diff --git a/.planning/STATE.md b/.planning/STATE.md index 008c4fb..5deb8f8 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -4,9 +4,9 @@ milestone: v1.0 current_phase: 06 current_phase_name: unit-tests status: executing -stopped_at: Completed 06-07-PLAN.md -last_updated: "2026-09-14T13:09:31.918Z" -last_activity: 2026-09-14 +stopped_at: Completed 06-10-PLAN.md +last_updated: "2026-09-15T02:13:48.439Z" +last_activity: 2026-09-15 last_activity_desc: Phase 06 execution started state_head: 9f9dd112234e814ea97b31fab87f395fa1308d9a progress: @@ -29,9 +29,9 @@ See: .planning/PROJECT.md (updated 2026-09-10) ## Current Position Phase: 06 (unit-tests) — EXECUTING -Plan: 9 of 9 (06-07 complete; all Phase 06 plans have SUMMARY) -Status: Phase 06 data-end unit tests complete; #06-09 test:ci regression resolved by later commits, D-44(c) green -Last activity: 2026-09-14 — Completed 06-07-PLAN.md +Plan: 10 of 13 (06-10 gap-fill complete; 06-11..06-13 pending) +Status: Phase 06 gap-fill batch (D-46) in progress — 06-10 (G-06-01-A/B/C, G-06-07-A) complete; pnpm test:ci green (66 files / 636 passed / 20 skipped) +Last activity: 2026-09-15 — Completed 06-10-PLAN.md Progress: [█████░░░░░] 50% @@ -87,6 +87,7 @@ Progress: [█████░░░░░] 50% | Phase 06 P08 | 21min | 3 tasks | 6 files | | Phase 06 P09 | 42min | 3 tasks | 9 files | | Phase 06 P07 | 40min | 4 tasks | 4 files | +| Phase 06 P10 | 15min | 3 tasks | 4 files | ## Accumulated Context @@ -177,6 +178,10 @@ Recent decisions affecting current work: - [Phase 06]: 06-07:顶层集成按 D-43 三阶段执行,2 个测试文件 24 通过 / 1 跳过;伤害/光环组合用真实 Enemy/EnemyContext/CommonAura/GuardAura/final effect 驱动,hero 属性用内联合成对象 - [Phase 06]: 06-07:录像播放期间用 replaySystem.disable()/revert() 抑制录制,二次录制经 ReplaySystem.saveState()/loadState()(IReplaySystemSave)最小重置;ReplayArray 不可存档已由用例断言 - [Phase 06]: 06-07:真实 code 覆盖 176 + 2001–2008;发现 #06-07-1(CoreState 未向寻路 finder 注入 maps/layer/predicate,顶层录像瞬移恒返回 2005),按 D-05 以 it.skip 正确预期用例登记 +- [Phase 06]: 06-10:缺口补测按 D-43 三阶段(构件→组合/流水线→完整/集成)执行,只扩展 mapDamage.test.ts/context.test.ts/enemyCombination.test.ts,未改动任何生产代码 +- [Phase 06]: 06-10:G-06-01-C 用文件内联语义 reducer(伤害求和/类型取最大/额外标记并集)断言,不导入顶层 MainMapDamageReducer;G-06-01-A/B 用内联 FakeAura/FakeConverter 驱动(D-21) +- [Phase 06]: 06-10:G-06-07-A 最大组合经真实 CoreState + MainDamageCalculator 得唯一精确 {3059,37},去支援对照 {2882,35};推导确认光环 25 为全局范围会同时加成相邻支援怪 +- [Phase 06]: 06-10:本计划无新增码、无疑似 bug、无 it.skip;06-COVERAGE-MAP.md 追加 06-10 小节(create-or-append) ### Pending Todos @@ -206,6 +211,6 @@ None yet. ## Session Continuity -Last session: 2026-09-14T13:09:31.695Z -Stopped at: Completed 06-07-PLAN.md +Last session: 2026-09-15T02:13:48.439Z +Stopped at: Completed 06-10-PLAN.md Resume file: None diff --git a/.planning/phases/06-unit-tests/06-10-SUMMARY.md b/.planning/phases/06-unit-tests/06-10-SUMMARY.md new file mode 100644 index 0000000..adf5d17 --- /dev/null +++ b/.planning/phases/06-unit-tests/06-10-SUMMARY.md @@ -0,0 +1,171 @@ +--- +phase: 06-unit-tests +plan: "10" +subsystem: testing +tags: [vitest, combat, map-damage, aura, enemy-combination, gap-fill] + +# Dependency graph +requires: + - phase: 06-unit-tests + provides: 06-01 combat L2 (EnemyContext/MapDamage) and 06-02/06-07 enemy top-level (MainDamageCalculator/CommonAura/GuardAura/MainEnemyFinalEffect) +provides: + - G-06-01-A four effect kinds together with final attribute assertions + - G-06-01-B cross-enemy nested aura with range-boundary assertions + - G-06-01-C same-point multi-source map damage stacking + - G-06-07-A maximum-pipeline single-monster exact {damage, turn} +affects: [06-verify, milestone-v1.0] + +actuals: + tokens: 5054 + tasks: 3 + commits: 3 + +tech-stack: + added: [] + patterns: + - "inline semantic map-damage reducer + typed fake view (damage sum / max type / extra union)" + - "inline fake IAuraConverter/IAuraView assembly for cross-enemy nested auras (D-21)" + - "real CoreState + real MainDamageCalculator maximum-pipeline integration with per-branch derivation comments" + +key-files: + created: [] + modified: + - packages-user/data-system/src/combat/mapDamage.test.ts + - packages-user/data-system/src/combat/context.test.ts + - packages-user/data-state/test/enemyCombination.test.ts + - .planning/phases/06-unit-tests/06-COVERAGE-MAP.md + +key-decisions: + - "G-06-01-C 以文件内联语义 reducer 断言「伤害求和 / 类型取最大 / 额外标记并集」,不导入顶层 MainMapDamageReducer" + - "G-06-01-A/B 全程用内联 FakeAura/FakeConverter 驱动,不引用顶层真实实现(D-21)" + - "G-06-07-A 用真实 CoreState + 真实 MainDamageCalculator;对照用例去掉支援怪证明支援流水线确实生效" + - "本计划不引入任何新码,06-COVERAGE-MAP.md 只追加 06-10 映射小节(create-or-append)" + +patterns-established: + - "缺口补测计划按 D-43 三阶段执行,每阶段聚焦跑绿 + D-44 门禁后才提交" + - "复杂最大组合的精确值在注释中逐项推导(基础伤害 + 各 special + 光环/支援 + final)" + +requirements-completed: [TEST-01] + +coverage: + - id: G-06-01-A + description: "四类效果(光环基础 + 常规查询 + 特殊查询 + final)同时生效的四阶段顺序与最终 atk/def/hp/special" + requirement: "TEST-01" + verification: + - kind: unit + ref: "packages-user/data-system/src/combat/context.test.ts" + status: pass + human_judgment: false + - id: G-06-01-B + description: "m1 产生 A1 → 施加 m2 → m2 生成 A2 → 反向施加全体的跨怪嵌套光环与范围边界" + requirement: "TEST-01" + verification: + - kind: unit + ref: "packages-user/data-system/src/combat/context.test.ts" + status: pass + human_judgment: false + - id: G-06-01-C + description: "同点多来源地图伤害叠加(有来源+有来源 / 无来源+无来源 / 混合多来源)的 separated/reduced" + requirement: "TEST-01" + verification: + - kind: unit + ref: "packages-user/data-system/src/combat/mapDamage.test.ts" + status: pass + human_judgment: false + - id: G-06-07-A + description: "最大流水线组合单怪经真实计算器的唯一精确 {damage,turn} 与去支援对照" + requirement: "TEST-01" + verification: + - kind: integration + ref: "packages-user/data-state/test/enemyCombination.test.ts" + status: pass + human_judgment: false + +duration: 15min +completed: 2026-09-15 +status: complete +plan_head_before: 714b791 +--- + +# Phase [06]: [unit-tests] Plan [10] Summary + +**按 D-43 三阶段补齐 06-01/06-07 覆盖缺口:同点多来源地图伤害叠加、四类效果同时生效的最终属性、多怪跨施加嵌套光环,以及最大流水线组合单怪的精确最终伤害** + +## Performance + +- **Duration:** 15 min +- **Tasks:** 3 (3 阶段任务) +- **Files modified:** 4 (3 既有测试文件 + 1 规划产物) + +## Accomplishments + +- **阶段 1(构件级)G-06-01-C** `mapDamage.test.ts`:新增内联 `createTypedInfo` / `FakeTypedView` / `SemanticReducer`,覆盖三种同点叠加组合 —— 有来源+有来源(separated 2、reduced.damage 11)、无来源+无来源(separated 2、reduced.damage 8)、混合多来源(separated 4、damage 16、type 取最大 2、catch/repulse 并集)。 +- **阶段 2(组合/流水线)G-06-01-A/B** `context.test.ts`:G-06-01-A 让一只怪同时受光环基础 + 常规查询 + 特殊查询 + final 效果,断言四阶段顺序(`special < base < query < final`)与最终 `atk 7 / def 2 / hp 14 / special 21`;G-06-01-B 构造 m1→A1→m2→A2→全体,断言三只怪最终 `atk 5/107/9`、m2 独占 special 21、A1 矩形范围边界可观测(m1/m3 不受 A1 加成)。 +- **阶段 3(完整/集成)G-06-07-A** `enemyCombination.test.ts`:一只怪同时携带 10 个顶层 special(先攻/魔攻/坚固/2连击/多段/破甲/反击/吸血/仇恨/固伤)+ 真实光环 25 + 真实支援 26 + 常规查询 + 特殊查询 + 自定义 final + 真实 `MainEnemyFinalEffect`,经真实 `MainDamageCalculator` 断言唯一精确 `{damage: 3059, turn: 37}` 且仅含 damage/turn 两字段;对照用例去掉支援怪得到不同的 `{2882, 35}`。 +- 写入 `06-COVERAGE-MAP.md` 的 06-10 小节(create-or-append,列出 G-06-01-A/B/C、G-06-07-A → 用例映射,注明无新增码)。 + +## Task Commits + +Each task was committed atomically: + +1. **Task 1: 阶段 1 G-06-01-C 地图伤害叠加** - `fcba44c` (test) +2. **Task 2: 阶段 2 G-06-01-A/B 四类效果 + 跨怪嵌套光环** - `ef95cc7` (test) +3. **Task 3: 阶段 3 G-06-07-A 最大流水线组合 + 06-10 覆盖表** - `f01c23e` (test) + +**Plan metadata:** 见最终 docs 提交(本 SUMMARY + STATE.md + ROADMAP.md + 06-TEST-FINDINGS.md) + +## Files Created/Modified + +- `packages-user/data-system/src/combat/mapDamage.test.ts` — 新增内联类型化伤害信息/视图/语义 reducer 与 3 条叠加用例(14 通过 / 1 跳过) +- `packages-user/data-system/src/combat/context.test.ts` — 新增 G-06-01-A、G-06-01-B 两条用例(39 通过,阶段 2 后) +- `packages-user/data-state/test/enemyCombination.test.ts` — 新增最大流水线组合与去支援对照两条用例(14 通过) +- `.planning/phases/06-unit-tests/06-COVERAGE-MAP.md` — 追加 `## 06-10` 小节(无新增码) + +## Decisions Made + +- G-06-01-C 的语义 reducer 按计划内联实现「伤害求和 / 类型取最大 / 额外标记并集」,只经 `getSeparatedDamage` / `getReducedDamage` 公开方法断言,不读取内部缓冲、不导入顶层 `MainMapDamageReducer`。 +- G-06-01-A/B 全部经文件内联 `FakeAura` / `FakeConverter` 手动装配驱动,明确切开系统层与顶层真实实现边界(D-21)。 +- G-06-07-A 的数值在注释中逐项推导;推导中确认「光环 25 为全局范围、会同时加成相邻支援怪」,故支援递归按支援怪 `atk 18`(含光环 +4 与自定义 final +6)计算。 + +## Deviations from Plan + +None - plan executed exactly as written. + +> 说明(非缺陷):阶段 1 计划措辞将叠加语义描述为「type 取最大」,与顶层 `MainMapDamageReducer`「取最大伤害项的 type」不同;本计划按 plan 措辞以文件内联语义 reducer 实现并断言(reduced.type === 最大 type),未改动任何生产代码。 + +## Issues Encountered + +- 首次运行阶段 3 最大组合断言得 `{3059, 37}` 而非手算 `{3055, 37}`:复核为推导遗漏「光环 25 全局加成相邻支援怪」,按实现语义修正期望值并在注释中补全推导;非生产缺陷、非测试弱化。 +- 无 `it.skip`/`it.todo`:本计划未发现疑似缺陷,`06-TEST-FINDINGS.md` 无 `#06-10-N` 条目。 + +## Quality Gate (D-44) + +每个阶段提交前均执行并全部通过: + +- (a) `pnpm exec eslint --fix` 后 `pnpm exec eslint <改动文件>`:0 错误 +- (b) `pnpm exec vue-tsc --noEmit` 按改动测试文件路径过滤:0 类型错误 +- (c) `pnpm test:ci` 全绿:阶段 1 后 632 通过 / 20 跳过;阶段 2 后 634 通过 / 20 跳过;阶段 3 后 **636 通过 / 20 跳过**(66 文件) + +## User Setup Required + +None - no external service configuration required. + +## Next Phase Readiness + +- 06-01/06-07 的人工评审覆盖缺口 G-06-01-A/B/C、G-06-07-A 已补齐并跑绿;无生产代码改动。 +- 剩余缺口计划(06-11 map、06-12/06-13)不受本计划影响。 + +--- + +*Phase: 06-unit-tests* +*Completed: 2026-09-15* + +## Self-Check: PASSED + +- FOUND: packages-user/data-system/src/combat/mapDamage.test.ts +- FOUND: packages-user/data-system/src/combat/context.test.ts +- FOUND: packages-user/data-state/test/enemyCombination.test.ts +- FOUND: .planning/phases/06-unit-tests/06-10-SUMMARY.md +- COMMIT FOUND: fcba44c (stage 1) +- COMMIT FOUND: ef95cc7 (stage 2) +- COMMIT FOUND: f01c23e (stage 3) diff --git a/.planning/phases/06-unit-tests/06-TEST-FINDINGS.md b/.planning/phases/06-unit-tests/06-TEST-FINDINGS.md index ec5d27b..34b19c9 100644 --- a/.planning/phases/06-unit-tests/06-TEST-FINDINGS.md +++ b/.planning/phases/06-unit-tests/06-TEST-FINDINGS.md @@ -167,3 +167,22 @@ D-45:公开 `CoreState.saveState(compression)` / `loadState(state, compression > 说明:本计划的录像播放用例为覆盖「真实寻路瞬移播放」路径,在**测试内**通过公开的 > `state.pathfinding.finder.useMapState/useMapLayer/usePassPredicate` 完成注入;生产 `CoreState` > 目前不做该注入,故另立 `#06-07-1` 记录该接线缺口。 + +## #06-10 战斗系统 / 顶层组合缺口补测(D-46) + +本计划按 D-43 三阶段(构件 → 组合/流水线 → 完整/集成)补齐 G-06-01-A/B/C、G-06-07-A, +只新增/扩展 `*.test.ts`,未改动任何生产/核心源码;三个测试文件聚焦运行通过, +`pnpm test:ci` 全绿(66 文件 / **636 通过** / 20 跳过)。 + +- 阶段 1 构件级(`mapDamage.test.ts`):G-06-01-C 同点多来源叠加 —— 有来源+有来源、 + 无来源+无来源、混合多来源;断言 `getSeparatedDamage` 条数与 `getReducedDamage` 的 + damage/type/extra。 +- 阶段 2 组合/流水线(`context.test.ts`):G-06-01-A 四类效果同时生效(四阶段顺序 + 最终 + atk/def/hp/special);G-06-01-B 多怪跨施加嵌套光环(三只怪最终 atk + A1 范围边界)。 +- 阶段 3 完整/集成(`enemyCombination.test.ts`):G-06-07-A 最大流水线组合单怪的唯一精确 + `{damage: 3059, turn: 37}` + 去支援对照 `{2882, 35}`。 + +**本计划未发现疑似 bug**,无 `it.skip` / `it.todo`,无 `#06-10-N` 条目。 + +非缺陷说明:阶段 1 计划措辞「type 取最大」与顶层 `MainMapDamageReducer`「取最大伤害项的 +type」语义不同;本计划按 plan 措辞以文件内联语义 reducer 断言,未改动生产代码。