mirror of
https://github.com/motajs/template.git
synced 2026-09-29 23:00:18 +08:00
docs(06): add gap G-06-01-D and plan 06-15 (deleteAura coverage)
This commit is contained in:
parent
4e53d53a69
commit
c747cd53d5
209
.planning/phases/06-unit-tests/06-15-PLAN.md
Normal file
209
.planning/phases/06-unit-tests/06-15-PLAN.md
Normal file
@ -0,0 +1,209 @@
|
||||
---
|
||||
phase: 06-unit-tests
|
||||
plan: 15
|
||||
type: execute
|
||||
wave: 2
|
||||
depends_on: [06-01]
|
||||
files_modified:
|
||||
- packages-user/data-system/src/combat/context.test.ts
|
||||
- .planning/phases/06-unit-tests/06-COVERAGE-MAP.md
|
||||
autonomous: true
|
||||
requirements: [TEST-01]
|
||||
estimate:
|
||||
tokens: 20000
|
||||
raw_tokens: 20000
|
||||
tasks: 2
|
||||
confidence: low
|
||||
must_haves:
|
||||
truths:
|
||||
- "TEST-01 由数据端行为单测满足,门禁为固定非 watch 命令 `pnpm test:ci` 全绿(D-08)。"
|
||||
- "G-06-01-D(可跑绿):`EnemyContext.deleteAura` 获得至少一条**正常用例**——`registerAuraConverter` → `setEnemyAt` → `addAura` → `bindHero` → `buildup` 后目标怪属性被该光环加成;随后 `deleteAura` 移除**同一光环实例** → 再次 `buildup` → 该光环不再生效,目标怪属性回到基础值。用例名:`applies a global aura after addAura and stops applying it after deleteAura`(`packages-user/data-system/src/combat/context.test.ts`)。"
|
||||
- "接口全覆盖判据(D-27 / D-30):06-01 must_haves 逐字点名的 `addAura`/`deleteAura` 两条路径均由 `context.test.ts` 的正常用例覆盖;本计划只补 `deleteAura`,不动 `addAura` 既有 8 处覆盖。名称含 legacy 的接口/方法一律不纳入。"
|
||||
- "断言可判定:加成前后读 `getEnemyByLoc(x, y)!.getComputedEnemy().getAttribute('atk')`——baseline `2`(`createEnemy` 基础 atk)→ 光环生效 `5`(`onApply` 加 `3`)→ `deleteAura` 后再 `buildup` 回到 `2`;三条断言同时存在,避免只断言「删了不报错」的空转。"
|
||||
- "关键机制依赖(务必成立,否则用例会假绿):`buildup()` 仅在 `needUpdate === true` 时执行;`addAura`/`deleteAura` 均置 `needUpdate = true`;`buildupBase()` 只在 `hasAura || hasSpecialQuery` 为真时被调用(`hasAura = auraConverter.size > 0`),因此用例必须注册一个不命中任何特殊属性代码的 `FakeConverter([])` 才能让全局光环的基础效果被施加。"
|
||||
- "测试形态(D-01):系统层纯逻辑单测(显式依赖注入、不 mock 数据层接口);fixture/helper **文件内联复用**(`FakeAura`/`FakeConverter`/`createContextFixture`/`createEnemy`),不建立跨文件共享 fixture(D-02/D-03);全同步、不使用 fake timers、不引入异步动作(D-04)。"
|
||||
- "阶段化(D-43):本计划为**小计划**,按 阶段 1(构件:单方法正常用例)→ 阶段 2(收口:覆盖表小节)执行,每阶段跑绿后才进入下一阶段;若发现阻断性 bug 使后续阶段无法运行,暂停并按 D-05/D-07 向用户汇报、等确认,不得跳过或弱化。"
|
||||
- "质量门禁(D-44):每个阶段执行后、提交前,改动文件 `eslint --fix` 后 `eslint <改动文件>` 0 错误;本计划改动的测试文件在 `pnpm exec vue-tsc --noEmit` 输出中按文件路径过滤 0 类型错误(全局既有无关错误不在范围);`pnpm test:ci` 全绿;任一不通过不得提交。"
|
||||
- "执行节奏(D-33):本计划执行前先向用户确认;执行完成后暂停,用中文分条简要汇报验证结果,详细结果写入共用的 `06-TEST-FINDINGS.md`。"
|
||||
- "增量补测(D-46):只新增/扩展 `*.test.ts` 与规划产物,不改动已执行的 06-01..06-14 计划与任何生产/核心源码;不测 `saveState`/`loadState`(D-32);不新增 warn/error 码;不安装覆盖率工具(D-09)。"
|
||||
artifacts:
|
||||
- path: packages-user/data-system/src/combat/context.test.ts
|
||||
provides: G-06-01-D —— `deleteAura` 的正常用例(addAura 生效 → deleteAura 后不再生效),复用文件内 `FakeAura`/`FakeConverter`/`createContextFixture`
|
||||
- path: .planning/phases/06-unit-tests/06-COVERAGE-MAP.md
|
||||
provides: 阶段级 code → 模块 → 用例 映射表(本计划 create-or-append 06-15 小节,登记 G-06-01-D 接口覆盖补齐、无新增码)
|
||||
key_links:
|
||||
- "被调用实现:`context.ts` 的 `addAura(aura)` → `globalAuraList.add(aura)` + `needUpdate = true`;`deleteAura(aura)` → `globalAuraList.delete(aura)` + `needUpdate = true`;`buildupBase()` 经 `buildup()` 在 `hasAura || hasSpecialQuery` 为真时执行,遍历 `sortedAura` 对范围内怪物调用 `aura.apply(handler, base)`"
|
||||
- "光环来源:`buildupSpecials()` 开头把 `globalAuraList` 中的每个光环 `insertIntoSortedAura` 进 `sortedAura`;`buildup()` 每次全量重建前会 `sortedAura.clear()`,因此 `deleteAura` + 再次 `buildup` 后该光环不再参与施加"
|
||||
- "复用文件内既有 helper:`createContextFixture(width?, height?)`(返回 `context`/`hero`/`state`)、`createEnemy(id, attrs?)`(基础 `hp:10 / atk:2 / def:0`)、`FakeAura`(`onApply` 回调驱动属性修改)、`FakeConverter([])`(注册转换器以打开光环流水线且不命中任何 code);不新建文件内 helper,不跨文件共享(D-03)"
|
||||
- "样式对齐:与 `EnemyContext single aura ranges` 分区既有 `applies a full-range aura to every enemy` 完全同构(同 `FullRange` + `onApply: handler => handler.enemy.addAttribute('atk', 3)`),仅增加 `deleteAura` 后的第二次 `buildup` 与回退断言"
|
||||
prohibitions:
|
||||
- "不创建或修改任何生产/核心源码,只新增/扩展 `*.test.ts` 与规划产物(`06-COVERAGE-MAP.md`)"
|
||||
- "不改动 06-01..06-14 的 PLAN.md 与既有的 06-COVERAGE-MAP.md 他节"
|
||||
- "不取消、不改写、不弱化 `context.test.ts` 任何既有用例或断言(含既有 `it.skip`)"
|
||||
- "不新增或改动 warn/error 码断言(本计划不引入新码)"
|
||||
- "不测 `saveState`/`loadState`(D-32)"
|
||||
- "不使用 fake timers、不引入异步等待(D-04)"
|
||||
- "不建立跨文件共享 fixture/factory helper(D-02/D-03)"
|
||||
- "不安装覆盖率工具或任何新依赖(D-09)"
|
||||
---
|
||||
|
||||
<objective>
|
||||
按 D-46 增量补测,补齐阶段验证(`06-VERIFICATION.md`)发现的**唯一接口覆盖漏测** —— 缺口 **G-06-01-D:`EnemyContext.deleteAura` 无测试覆盖**(D-30 / D-27)。只改 `packages-user/data-system/src/combat/context.test.ts`(测试)与 `06-COVERAGE-MAP.md`(覆盖表),**不修任何生产代码**:
|
||||
|
||||
- 新增**一条可跑绿用例** `applies a global aura after addAura and stops applying it after deleteAura`:`registerAuraConverter(new FakeConverter([]))` → `setEnemyAt({x:0,y:0}, createEnemy('target'))` → `bindHero` → `addAura(new FakeAura({ priority: 1, range: new modules.FullRange(), param: undefined, onApply: handler => handler.enemy.addAttribute('atk', 3) }))` → `buildup()` → 断言目标怪 `atk === 5`(基础 `2` + 光环 `3`);随后 `deleteAura(同一光核实例)` → `buildup()` → 断言目标怪 `atk === 2`(光环不再生效)。
|
||||
- 以 create-or-append 方式写入 `06-COVERAGE-MAP.md` 的 **06-15 小节**,登记 G-06-01-D 的 `缺口 → 用例 → 文件 → 计划` 映射(本计划**无新增码**)。
|
||||
|
||||
Purpose: `deleteAura` 是 `IEnemyContext` 的公开方法(`types.ts:689`),且被 `06-01-PLAN.md` 的 `must_haves.truths` 逐字点名,但全仓库 **0 测试引用**;同清单的 `addAura` 已覆盖 8 处。这条漏测使得 D-27/D-30 的「每个公开方法至少一条正常用例」判据无法成立,也是 06-01 计划 must_have 与实现之间唯一的接线缺口。本计划用最小代价补齐该判据,且不触碰既有用例。
|
||||
|
||||
Output: `context.test.ts` 新增 1 条可跑绿用例(G-06-01-D)与 `06-COVERAGE-MAP.md` 的 06-15 小节。
|
||||
|
||||
阶段结构(D-43):阶段 1 构件级(单方法正常用例:`deleteAura` 使光环失效)→ 阶段 2 完整/收口(覆盖表小节 + 门禁复核)。每阶段跑绿后再进入下一阶段。
|
||||
</objective>
|
||||
|
||||
<execution_context>
|
||||
@C:/Users/book/.config/opencode/gsd-core/workflows/execute-plan.md
|
||||
@C:/Users/book/.config/opencode/gsd-core/templates/summary.md
|
||||
</execution_context>
|
||||
|
||||
<context>
|
||||
@.planning/phases/06-unit-tests/06-CONTEXT.md
|
||||
@.planning/phases/06-unit-tests/06-COVERAGE-GAPS.md
|
||||
@.planning/phases/06-unit-tests/06-VERIFICATION.md
|
||||
@.planning/phases/06-unit-tests/06-PATTERNS.md
|
||||
@.planning/phases/06-unit-tests/06-TEST-FINDINGS.md
|
||||
@.planning/phases/06-unit-tests/06-01-PLAN.md
|
||||
@.planning/codebase/TESTING.md
|
||||
@dev.md
|
||||
@packages-user/data-system/src/combat/types.ts
|
||||
@packages-user/data-system/src/combat/context.ts
|
||||
@packages-user/data-system/src/combat/context.test.ts
|
||||
</context>
|
||||
|
||||
<execution_rules>
|
||||
- 只写测试,绝不修改 `packages-user/*/src` 下的非 `*.test.ts` 文件。
|
||||
- 每个 `it(...)` 之前必须有一行中文注释说明覆盖内容(`dev.md` 注释规范)。
|
||||
- fixture/helper 全部**文件内联并复用**目标文件既有 `createContextFixture`/`createEnemy`/`FakeAura`/`FakeConverter`(D-02/D-03),不新建 helper、不建跨文件共享。
|
||||
- 新用例必须**同构**对齐既有 `applies a full-range aura to every enemy`(同 `FullRange` + `onApply` 加 `atk`),仅增加 `deleteAura` 后的第二次 `buildup` 与回退断言,确保既有覆盖不被改写。
|
||||
- **必须注册 `new FakeConverter([])`**:`buildupBase()` 仅在 `auraConverter.size > 0 || specialQueryEffects.size > 0` 时执行,否则光环基础效果不会被施加,用例会假绿。
|
||||
- **必须把同一光环实例**传给 `addAura` 与 `deleteAura`(`FakeAura` 无自定义相等语义,是 Set 的身份比较),不要两次 `new FakeAura(...)`。
|
||||
- 本计划不引入、不改动任何 warn/error 码断言;不测 `saveState`/`loadState`(D-32);不使用 fake timers(D-04)。
|
||||
- `06-COVERAGE-MAP.md` 为共享 create-or-append 文件(幂等、顺序无关):写入前先检查文件与既有小节,只**追加**本计划小节,绝不重写他节或改动既有表格行。
|
||||
- **执行协议(D-33):执行本计划前必须先向用户确认;执行完成后暂停,用中文分条简要汇报本计划验证结果;详细结果写入共用的 `06-TEST-FINDINGS.md`。**
|
||||
- **阶段门禁(D-43):本计划按 构件 → 收口 两阶段顺序执行,每阶段跑绿后才进入下一阶段;若阶段 1 发现阻断性 bug(例如 `deleteAura` 后光环仍生效)使后续阶段无法运行,暂停并按 D-05/D-07 向用户汇报、等确认,不得跳过或弱化。**
|
||||
- **质量门禁(D-44,每个阶段执行后、提交前必过)**:对改动文件运行 `eslint --fix`,并确保 `eslint <改动文件>` **0 错误**;对**本计划改动的测试文件**运行 `pnpm exec vue-tsc --noEmit`,并按输出文件路径过滤,确保这些文件路径下 **0 类型错误**(全局既有无关错误,如 `client-modules`/`legacy-plugin-data`,不在本门禁范围);`pnpm test:ci` **全绿**。任一不通过则**不得提交**。
|
||||
</execution_rules>
|
||||
|
||||
<tasks>
|
||||
|
||||
<task type="auto">
|
||||
<name>阶段 1(构件级):G-06-01-D 补 `deleteAura` 正常用例(addAura 生效 → deleteAura 后不再生效)</name>
|
||||
<files>packages-user/data-system/src/combat/context.test.ts</files>
|
||||
<read_first>
|
||||
packages-user/data-system/src/combat/context.test.ts(`createContextFixture`(L151)、`createEnemy`(L119)、`FakeAura`/`FakeAuraOptions`(L178–237)、`FakeConverter`(L244–280)、以及 `EnemyContext single aura ranges` 分区既有 `applies a full-range aura to every enemy`(L593)——本用例必须与其同构)
|
||||
packages-user/data-system/src/combat/context.ts(`addAura` L342、`deleteAura` L347、`buildup` L684 的 `hasAura`/`needUpdate` 分支、`buildupSpecials` L564 的 `globalAuraList` → `sortedAura`、`buildupBase` L626,**只读参考**)
|
||||
packages-user/data-system/src/combat/types.ts(`IEnemyContext.addAura` L683 / `deleteAura` L689、`IAuraView.apply` L123 —— 证明这是公开接口方法,**只读参考**)
|
||||
.planning/phases/06-unit-tests/06-COVERAGE-GAPS.md(G-06-01-D 的现状与期望)
|
||||
.planning/phases/06-unit-tests/06-01-PLAN.md(must_haves.truths 逐字点名「`addAura`/`deleteAura`」)
|
||||
</read_first>
|
||||
<action>
|
||||
在 `EnemyContext single aura ranges` 分区(`applies a full-range aura to every enemy` 之后)新增 1 条可跑绿用例,前一行中文注释,如「验证全局光环经 addAura 生效、经 deleteAura 移除后不再生效」:
|
||||
- 用例名:`applies a global aura after addAura and stops applying it after deleteAura`。
|
||||
- 步骤 1:`const fixture = createContextFixture();` → `fixture.context.bindHero(fixture.hero);` → `fixture.context.registerAuraConverter(new FakeConverter([]));`(必须注册,否则 `buildupBase()` 不会执行,光环不会施加)→ `fixture.context.setEnemyAt({ x: 0, y: 0 }, createEnemy('target'));`。
|
||||
- 步骤 2:`const aura = new FakeAura({ priority: 1, range: new modules.FullRange(), param: undefined, onApply: handler => handler.enemy.addAttribute('atk', 3) });` → `fixture.context.addAura(aura);`。
|
||||
- 步骤 3:`fixture.context.buildup();` → 断言 `fixture.context.getEnemyByLoc(0, 0)!.getComputedEnemy().getAttribute('atk')` 为 `5`(基础 `2` + 光环 `3`)。
|
||||
- 步骤 4:`fixture.context.deleteAura(aura);`(传入**同一实例**)→ 再次 `fixture.context.buildup();` → 断言同一路径的 `atk` 回到 `2`(光环不再生效;`deleteAura` 置 `needUpdate = true` 使第二次 `buildup` 真正重建 `sortedAura`)。
|
||||
- 可选加强(同一 `it` 内,不新增用例):在步骤 4 之后 `fixture.context.addAura(aura); fixture.context.buildup();` 断言 `atk` 又回到 `5`,证明 `deleteAura` 是「移除」而非「破坏光环对象」;若加入,需在前一行注释中说明。
|
||||
约束:不加 `it.skip`;不改动该分区任何既有用例的断言;不新增导入(`FakeConverter`/`FakeAura`/`createEnemy`/`createContextFixture`/`modules.FullRange` 均已在本文件可用);不使用 fake timers;不引入新码。若该用例在正确预期下无法跑绿(例如 `deleteAura` 后光环仍生效),**不得弱化断言**——按 D-05 写正确预期 + `it.skip` 并登记 `06-TEST-FINDINGS.md` 的 `#06-15-N`,同时暂停按 D-07 向用户汇报。
|
||||
</action>
|
||||
<verify>
|
||||
<automated>pnpm exec vitest run packages-user/data-system/src/combat/context.test.ts</automated>
|
||||
<fails_when>该文件出现非跳过失败;或新用例在 `deleteAura` 后未断言属性回到基础值 `2`;或 `addAura`/`deleteAura` 未使用同一光环实例;或未注册 `FakeConverter([])`(导致光环路径不执行);或既有 `applies a full-range aura to every enemy` 等用例回归失败;或新用例被标记为 `it.skip` 而未经用户确认</fails_when>
|
||||
</verify>
|
||||
<acceptance_criteria>
|
||||
- `context.test.ts` 零非跳过失败;`pnpm exec vitest run packages-user/data-system/src/combat/context.test.ts` 通过。
|
||||
- 存在 1 条新增可跑绿用例 `applies a global aura after addAura and stops applying it after deleteAura`,覆盖 `addAura`(生效 `atk === 5`)→ `deleteAura`(再 `buildup` 后 `atk === 2`)两条路径。
|
||||
- 用例复用文件内既有 `createContextFixture`/`createEnemy`/`FakeAura`/`FakeConverter`,无新增 helper、无跨文件共享(D-03)。
|
||||
- 每个新增 `it` 前有单行中文注释;既有用例与既有 `it.skip` 数量/断言均不变。
|
||||
- 全仓库检索 `deleteAura` 由「仅 2 个生产文件」变为「测试文件也命中」。
|
||||
- D-44 门禁通过:改动文件 `eslint --fix` 后 `eslint <改动文件>` 0 错误;本计划改动的测试文件在 `pnpm exec vue-tsc --noEmit` 输出中按文件路径过滤 0 类型错误;`pnpm test:ci` 全绿。
|
||||
</acceptance_criteria>
|
||||
<done>阶段 1 的 G-06-01-D 用例跑绿后才进入阶段 2。若发现阻断性 bug,暂停并按 D-05/D-07 向用户汇报、等确认。</done>
|
||||
</task>
|
||||
|
||||
<task type="auto">
|
||||
<name>阶段 2(收口):写入 `06-COVERAGE-MAP.md` 06-15 小节并复核门禁</name>
|
||||
<files>.planning/phases/06-unit-tests/06-COVERAGE-MAP.md</files>
|
||||
<read_first>
|
||||
.planning/phases/06-unit-tests/06-COVERAGE-MAP.md(文件头 create-or-append 说明与固定表头 `| code | 模块 | 用例 | 计划 |`;L98 起的 `## 06-01` 小节;L340 起的 `## 06-14` 收口小节形状——小节标题 + 说明段 + `| 缺口 | 用例 | 文件 | 计划 |` 表 + 收尾说明)
|
||||
.planning/phases/06-unit-tests/06-COVERAGE-GAPS.md(G-06-01-D 条目,用于覆盖表映射一致)
|
||||
packages-user/data-system/src/combat/context.test.ts(阶段 1 新增用例的最终名字,覆盖表必须与实际用例名逐字一致)
|
||||
</read_first>
|
||||
<action>
|
||||
以 create-or-append 方式在 `06-COVERAGE-MAP.md` 末尾追加 **06-15 小节**(先检查文件与既有小节;只追加,绝不重写他节、绝不改动既有 code 表行):
|
||||
- 标题:`## 06-15 战斗系统接口覆盖补齐(D-46 / G-06-01-D)`。
|
||||
- 说明段:本计划为 **G-06-01-D** 的补测(`EnemyContext.deleteAura` 是 D-30/D-27 要求「每公开方法 ≥1 正常用例」的公开接口方法,06-01 must_haves 逐字点名但此前 0 测试引用);本计划**不引入新码**(`addAura`/`deleteAura` 无对应 warn/error code,不新增也不改动任何码断言);阶段结构为 构件(单方法正常用例)→ 收口(覆盖表小节 + 门禁复核);只改测试与覆盖表,不改动任何生产/核心源码。
|
||||
- 表格 `| 缺口 | 用例 | 文件 | 计划 |`,一行:G-06-01-D → `applies a global aura after addAura and stops applying it after deleteAura`(若阶段 1 最终用例名不同,以实际名字为准)→ `data-system/src/combat/context.test.ts` → `06-15`。
|
||||
- 收尾说明:本计划**无新增码**;不削弱也不删除任何既有用例或跳过;`06-TEST-FINDINGS.md` 无新增 `#06-15-N` 缺陷条目(仅在阶段 1 真的发现阻断性 bug 时才按 D-05 追加并汇报)。
|
||||
最后复核 D-44 门禁(`eslint --fix` 后 `eslint <改动文件>` 0 错误;本计划改动的测试文件在 `pnpm exec vue-tsc --noEmit` 中 0 类型错误;`pnpm test:ci` 全绿),并用 `git status` 确认仅 `context.test.ts` 与 `06-COVERAGE-MAP.md`(以及 `06-COVERAGE-GAPS.md` 的规划期缺口登记)发生变更。
|
||||
</action>
|
||||
<verify>
|
||||
<automated>pnpm test:ci</automated>
|
||||
<fails_when>`06-COVERAGE-MAP.md` 缺少 06-15 小节;或该小节重写/删改了任何他节或既有 code 表行;或表格未登记 G-06-01-D 与实际用例名;或误报「新增码」;或 `pnpm test:ci` 非全绿;或 `git status` 显示任何非 `*.test.ts`/规划产物文件被改动</fails_when>
|
||||
</verify>
|
||||
<acceptance_criteria>
|
||||
- `06-COVERAGE-MAP.md` 存在新增的 06-15 小节(create-or-append,顺序无关、幂等),含 G-06-01-D → 用例 → 文件 → 计划 的映射,并注明本计划无新增码。
|
||||
- 既有小节与 code 表行逐字未变(`git diff` 仅新增行)。
|
||||
- `pnpm test:ci` 全绿;D-44 三项门禁全部通过。
|
||||
- `git status` 仅显示 `packages-user/data-system/src/combat/context.test.ts` 与 `06-COVERAGE-MAP.md`(及规划期 `06-COVERAGE-GAPS.md`)的变更。
|
||||
</acceptance_criteria>
|
||||
<done>06-15 小节已写入且门禁全过。完成后暂停并用中文分条汇报;详细结果写入 `06-TEST-FINDINGS.md`(无新缺陷时注明「无新增条目」)。</done>
|
||||
</task>
|
||||
|
||||
</tasks>
|
||||
|
||||
<threat_model>
|
||||
## Trust Boundaries
|
||||
|
||||
| Boundary | Description |
|
||||
|----------|-------------|
|
||||
| none | 仅新增/扩展仓库内 Node Vitest 测试;无运行时输入面、网络、DOM 或文件写入。 |
|
||||
|
||||
## STRIDE Threat Register
|
||||
|
||||
| Threat ID | Category | Component | Severity | Disposition | Mitigation Plan |
|
||||
|-----------|-----------|-----------|----------|-------------|-----------------|
|
||||
| T-06-15-01 | Tampering | `data-system/src/combat/context.test.ts` 与规划产物 | low | mitigate | 只导入已跟踪模块、文件内联合成 fixture;不改核心源码;门禁 `pnpm test:ci` + `git status` 复核仅 `*.test.ts` 与 `06-COVERAGE-MAP.md` 变更。 |
|
||||
| T-06-15-02 | Information disclosure | 合成怪物/光环 fixture | low | accept | 最小合成数据(`createEnemy`/`FakeAura`),无真实游戏数据、密钥或个人信息(D-02)。 |
|
||||
| T-06-15-03 | Repudiation | 用「不报错」代替行为断言造成假绿 | low | mitigate | 三条断言强制存在(baseline `2` → 生效 `5` → 回退 `2`);必须注册 `FakeConverter([])` 打开光环流水线;`addAura`/`deleteAura` 必须传同一实例。 |
|
||||
| T-06-15-04 | Tampering | 为跑绿而弱化既有用例或改写门禁 | low | mitigate | 既有用例与 `it.skip` 断言不变;D-44 三项门禁(eslint 0 错误 / 文件级 vue-tsc 0 类型错误 / `pnpm test:ci` 全绿)在提交前强制通过。 |
|
||||
| T-06-15-SC | Tampering | 包安装 | high | mitigate | 明确不引入任何新依赖(D-09);若确需安装,停止并先走包合法性 checkpoint。 |
|
||||
</threat_model>
|
||||
|
||||
<verification>
|
||||
- 聚焦运行 `pnpm exec vitest run packages-user/data-system/src/combat/context.test.ts` 通过;`pnpm test:ci` 全量绿。
|
||||
- 全仓库检索 `deleteAura`:测试文件命中(此前为 0);`addAura` 既有覆盖不减少。
|
||||
- `git status` 仅显示 `packages-user/data-system/src/combat/context.test.ts` 与 `06-COVERAGE-MAP.md`(及规划期 `06-COVERAGE-GAPS.md`)的变更;无核心文件改动,无 06-01..06-14 计划改动。
|
||||
- D-27/D-30 复核:06-01 must_haves 逐字点名的 `addAura`/`deleteAura` 两条路径均经测试文件引用与断言。
|
||||
- 覆盖表以 create-or-append 方式写入 06-15 小节;既有小节与 code 表行逐字不变。
|
||||
- **执行协议**:执行前必须先向用户确认;执行后暂停并用中文分条汇报。
|
||||
</verification>
|
||||
|
||||
<success_criteria>
|
||||
- G-06-01-D:`EnemyContext.deleteAura` 有 1 条可跑绿正常用例,断言「`addAura` 生效(`atk 2 → 5`)→ `deleteAura` 后再 `buildup` 回到基础值 `2`」。
|
||||
- 06-01 must_haves 的接口全覆盖判据(D-27/D-30)不再有 `deleteAura` 缺口。
|
||||
- 无生产代码改动;无新增 warn/error 码;既有用例与 `it.skip` 零变化。
|
||||
- `pnpm test:ci` 全绿且 D-44 文件级 lint/类型门禁通过;`06-COVERAGE-MAP.md` 06-15 小节落地。
|
||||
</success_criteria>
|
||||
|
||||
<artifacts_this_plan_produces>
|
||||
Test files (extended):
|
||||
- `packages-user/data-system/src/combat/context.test.ts`(新增 1 条可跑绿用例 `applies a global aura after addAura and stops applying it after deleteAura`,覆盖 G-06-01-D;复用既有 `FakeAura`/`FakeConverter`/`createContextFixture`/`createEnemy`,无新增 helper)
|
||||
|
||||
Planning artifacts:
|
||||
- `06-COVERAGE-MAP.md` create-or-append 06-15 小节(G-06-01-D → 用例 → 文件 → 计划;注明无新增码)
|
||||
- `06-COVERAGE-GAPS.md` 06-01 小节新增 G-06-01-D 条目(规划期登记)
|
||||
</artifacts_this_plan_produces>
|
||||
|
||||
<output>
|
||||
完成时创建 `.planning/phases/06-unit-tests/06-15-SUMMARY.md`,以 create-or-append 方式写入 `06-COVERAGE-MAP.md` 06-15 小节;若阶段 1 真的发现缺陷,按 D-05 追加 `06-TEST-FINDINGS.md` 的 `#06-15-N` 小节并保留正确预期 `it.skip`(无缺陷时不新增条目)。执行完成后暂停并用中文分条汇报。
|
||||
</output>
|
||||
@ -27,6 +27,10 @@
|
||||
3. 多来源(>2 条)叠加后的 **damage 求和 / type 取最大 / extra 并集**(真实 `MainMapDamageReducer` 在 06-02 单测过,但未与系统层多条真实来源组合)。
|
||||
- **期望**:同点构造多来源组合,断言 `getReducedDamage` 的 damage/type/extra 与 `getSeparatedDamage` 条数符合预期。
|
||||
|
||||
### G-06-01-D:`EnemyContext.deleteAura` 无测试覆盖(D-30 接口覆盖缺口,严重度 低-中)
|
||||
- **现状**:`deleteAura` 是 `IEnemyContext` 的**公开方法**(接口声明 `packages-user/data-system/src/combat/types.ts:689`,实现 `packages-user/data-system/src/combat/context.ts:347`),且被 `06-01-PLAN.md` 的 `must_haves.truths` **逐字点名**(「`addAura`/`deleteAura`」)。全仓库检索 `deleteAura` 仅命中上述两个生产文件,**测试 0 引用**;同一接口清单中的 `addAura` 已被 `context.test.ts` 覆盖 8 处,而 `deleteAura` 未覆盖。
|
||||
- **期望**:补一条**可跑绿**用例(`06-15-PLAN.md`):`addAura` 注册一个全局光环 → `buildup` 生效(目标怪属性被加成)→ `deleteAura` 移除同一光环 → 再次 `buildup` → 该光环不再生效(目标怪属性回到基础值)。沿用 `context.test.ts` 文件内既有 `FakeAura`/`FakeConverter`/`createContextFixture`,名称含 legacy 的接口/方法排除(D-30)。
|
||||
|
||||
---
|
||||
|
||||
## 06-03 enemy 数据模型(`data-base/src/enemy`)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user