|
| 1 | +//! commands_proofread.rs 单测(AAA 模式;内存态原子——不触库/网络)。 |
| 2 | +//! |
| 3 | +//! @ai-context: 覆盖任务 id 认领语义——proofread 族与其余任务族(refine/ |
| 4 | +//! enrich/note_refine/goal_plan)共用 AppState.ai_task_seq 同一 |
| 5 | +//! 单调序列(P2-1 审查修复回归,见 claim_task_id Why)。 |
| 6 | +
|
| 7 | +use crate::commands_ai_refine::{claim_task_id, task_seq}; |
| 8 | + |
| 9 | +/// AAA(P2-1 回归):proofread 认领 N 后任意其他族紧邻认领 ≠ N—— |
| 10 | +/// 相邻认领不相交。修复前 proofread 为 fetch_add(1)+1(1904c2c7 引入): |
| 11 | +/// 计数器 1→2 却领走 2,其他族紧邻 fetch_add 恰好也返回 2——跨任务族 |
| 12 | +/// 同 id,insert_ai_task 的 INSERT OR REPLACE 会顶替先落库的 proofread 行 |
| 13 | +/// (running 记账/结果/成本丢行)。 |
| 14 | +#[test] |
| 15 | +fn proofread_claim_then_adjacent_family_claim_do_not_collide() { |
| 16 | + // Arrange:与装配等价的序列起点(task_seq() 初值 1——app_setup 即以此 |
| 17 | + // 装配 AppState.ai_task_seq;proofread_run 现与 refine 同一封装认领) |
| 18 | + let seq = task_seq(); |
| 19 | + // Act:proofread 族先认领 N,任意其他族紧邻认领(生产同一代码路径) |
| 20 | + let proofread_id = claim_task_id(&seq); |
| 21 | + let other_family_id = claim_task_id(&seq); |
| 22 | + // Assert:相邻认领不相交(修复前两者都 = 2) |
| 23 | + assert_ne!( |
| 24 | + proofread_id, other_family_id, |
| 25 | + "proofread 与相邻认领不得撞 id(撞 id 会被 INSERT OR REPLACE 顶替)" |
| 26 | + ); |
| 27 | + // 序列语义回归:初值 1 起逐号分配;认领后计数器越过所领 id(修复前 |
| 28 | + // proofread 认领后计数器仍停在所领 id 上——同一破绽的另一面) |
| 29 | + assert_eq!(proofread_id, 1, "首个 id 应为 1(task_seq 初值语义)"); |
| 30 | + assert_eq!(other_family_id, 2, "紧邻认领应为下一号"); |
| 31 | + assert_eq!(seq.load(std::sync::atomic::Ordering::Relaxed), 3); |
| 32 | +} |
| 33 | + |
| 34 | +/// AAA:认领与启动序列下限的衔接——DB 最大 id 为 41 时(含历史行),重启后 |
| 35 | +/// proofread 首个认领必须 ≥42(防复用历史 task_id 顶替已采纳行——与批 1 |
| 36 | +/// task_seq_lower_bound 语义闭合,proofread 无特殊偏移)。 |
| 37 | +#[test] |
| 38 | +fn proofread_claim_after_startup_lower_bound_never_reuses_db_rows() { |
| 39 | + // Arrange:启动序列按 DB 全表最大 id 41 推进(app_setup fetch_update) |
| 40 | + let seq = task_seq(); |
| 41 | + let _ = seq.fetch_update( |
| 42 | + std::sync::atomic::Ordering::Relaxed, |
| 43 | + std::sync::atomic::Ordering::Relaxed, |
| 44 | + |cur| Some(crate::commands_ai_refine::task_seq_lower_bound(cur, 41)), |
| 45 | + ); |
| 46 | + // Act:proofread 族认领 + 紧邻其他族认领 |
| 47 | + let proofread_id = claim_task_id(&seq); |
| 48 | + let other_family_id = claim_task_id(&seq); |
| 49 | + // Assert:从 42 起且互不相交(修复前 proofread fetch_add(1)+1 在计数器 |
| 50 | + // 42 处领走 43,紧邻族 fetch_add 返回 43——同 id 相撞,同上顶替风险) |
| 51 | + assert_eq!(proofread_id, 42, "proofread 首个认领须越过 DB 最大 id"); |
| 52 | + assert_eq!(other_family_id, 43); |
| 53 | + assert_ne!(proofread_id, other_family_id); |
| 54 | +} |
0 commit comments