import { CoverageTracker } from "../src/services/transcription/recovery/coverage/CoverageTracker"; describe("CoverageTracker", () => { it("advances hardCommittedMs from final transcript coverage", () => { const tracker = new CoverageTracker({ partialStabilityMinCount: 2, partialStabilityMinMs: 600, }); const state = tracker.onTranscriptMessage({ is_partial: false, data: { audio_duration: 2.0, words: [ { start: 0.0, end: 1.2 }, { start: 1.2, end: 1.4 }, ], }, }); // finalCoverageMs=min(2000,1400+500)=1900 => hardCommittedMs=1650 expect(state.updated).toBe(true); expect(state.hardCommittedMs).toBe(1650); }); it("advances softCommittedMs only after partial stability", () => { const tracker = new CoverageTracker({ partialStabilityMinCount: 2, partialStabilityMinMs: 600, }); const first = tracker.onTranscriptMessage( { is_partial: true, data: { text: "Patient reports mild cough", audio_duration: 1.5, words: [{ start: 0.0, end: 1.0 }], }, }, 1000 ); const second = tracker.onTranscriptMessage( { is_partial: true, data: { text: "Patient reports mild cough", audio_duration: 1.5, words: [{ start: 0.0, end: 1.0 }], }, }, 1100 ); expect(first.softCommittedMs).toBe(0); expect(first.updated).toBe(false); // stablePartialCoverageMs=min(1500,1000+250)=1250 => softCommittedMs=750 expect(second.updated).toBe(true); expect(second.softCommittedMs).toBe(750); }); it("keeps commit progression monotonic", () => { const tracker = new CoverageTracker({ partialStabilityMinCount: 2, partialStabilityMinMs: 600, }); tracker.onTranscriptMessage({ is_partial: false, data: { audio_duration: 3, words: [{ start: 0, end: 2 }], }, }); const regressed = tracker.onTranscriptMessage({ is_partial: false, data: { audio_duration: 1, words: [{ start: 0, end: 0.5 }], }, }); expect(regressed.updated).toBe(false); expect(regressed.hardCommittedMs).toBeGreaterThan(0); }); });