import { AudioSegmenter } from '@/features/voice/segmenter'; describe('AudioSegmenter', () => { beforeEach(() => { jest.useFakeTimers(); }); afterEach(() => { jest.useRealTimers(); }); test('fires segment callbacks at fixed intervals', () => { const onSegment = jest.fn(); const segmenter = new AudioSegmenter(onSegment, { fixedDurationMs: 1000 }); segmenter.start(); jest.advanceTimersByTime(1000); expect(onSegment).toHaveBeenCalledWith(0); jest.advanceTimersByTime(1000); expect(onSegment).toHaveBeenCalledWith(1); jest.advanceTimersByTime(1000); expect(onSegment).toHaveBeenCalledWith(2); expect(onSegment).toHaveBeenCalledTimes(3); segmenter.stop(); }); test('stop returns the final segment index', () => { const onSegment = jest.fn(); const segmenter = new AudioSegmenter(onSegment, { fixedDurationMs: 500 }); segmenter.start(); jest.advanceTimersByTime(1500); const finalIndex = segmenter.stop(); expect(finalIndex).toBe(3); }); test('does not fire after stop', () => { const onSegment = jest.fn(); const segmenter = new AudioSegmenter(onSegment, { fixedDurationMs: 100 }); segmenter.start(); jest.advanceTimersByTime(250); segmenter.stop(); const callCount = onSegment.mock.calls.length; jest.advanceTimersByTime(500); expect(onSegment).toHaveBeenCalledTimes(callCount); }); test('uses default 15s interval when no config provided', () => { const onSegment = jest.fn(); const segmenter = new AudioSegmenter(onSegment); segmenter.start(); jest.advanceTimersByTime(14999); expect(onSegment).not.toHaveBeenCalled(); jest.advanceTimersByTime(1); expect(onSegment).toHaveBeenCalledTimes(1); segmenter.stop(); }); });