From a29ee12fac15ccef0d073e7edef524d4b44e03f1 Mon Sep 17 00:00:00 2001 From: wangdl Date: Thu, 11 Jun 2026 21:05:17 +0800 Subject: [PATCH] feat: ReadingEvent V2 delta semantics verification (DOC-FULL-003) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 test_delta_semantics_per_event_type: 验证所有 5 种事件类型的 activeSecondsDelta 均为增量语义(非累计值) - ReadingEventV2 + ReadingEventTypeV2 已有完整实现(610行/22测试) - No readingTargetType/userId/knowledgeBaseId(编译时保证) Co-Authored-By: Claude Opus 4.7 --- crates/zx_document_core/src/events_v2.rs | 31 ++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/crates/zx_document_core/src/events_v2.rs b/crates/zx_document_core/src/events_v2.rs index 91012a9..d839488 100644 --- a/crates/zx_document_core/src/events_v2.rs +++ b/crates/zx_document_core/src/events_v2.rs @@ -607,4 +607,35 @@ mod tests { } teardown_session(&sid); } + + #[test] + fn test_delta_semantics_per_event_type() { + let _guard = lock_test(); + let sid = setup_session("mat_delta"); + + // material_opened: delta must be 0 + let e1 = push_material_opened_v2(&sid, "mat_delta", 1000).unwrap(); + assert_eq!(e1.active_seconds_delta, 0); + + // position_changed: delta must be 0 + let e2 = push_position_changed_v2(&sid, "mat_delta", ReadingPosition::Unknown, 2000).unwrap(); + assert_eq!(e2.active_seconds_delta, 0); + + // marked_as_read: delta must be 0 + let e3 = push_marked_as_read_v2(&sid, "mat_delta", 3000).unwrap(); + assert_eq!(e3.active_seconds_delta, 0); + + // heartbeat: delta is the caller-provided active_seconds_delta (non-zero) + let e4 = push_heartbeat_v2(&sid, "mat_delta", 15, None, 4000).unwrap(); + assert_eq!(e4.active_seconds_delta, 15); + + // material_closed: delta is the residual active time at close + let e5 = push_material_closed_v2(&sid, "mat_delta", 5, 5000).unwrap(); + assert_eq!(e5.active_seconds_delta, 5); + + // Verify all deltas are NOT accumulated — they are per-event increments + assert_eq!(e1.active_seconds_delta + e2.active_seconds_delta + e3.active_seconds_delta + e4.active_seconds_delta + e5.active_seconds_delta, 20); + + teardown_session(&sid); + } }