71 lines
1.8 KiB
TypeScript
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();
|
|
});
|
|
});
|