Files
life-echo/app-expo/tests/features/voice/segmenter.test.ts

71 lines
1.8 KiB
TypeScript

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();
});
});