wavesurfer.js
Version:
Audio waveform player
47 lines (46 loc) • 2.05 kB
JavaScript
import TimelinePlugin from '../plugins/timeline.js';
import { signal } from '../reactive/store.js';
const createEmitter = () => {
const listeners = new Map();
return {
on: jest.fn((event, listener) => {
if (!listeners.has(event)) {
listeners.set(event, new Set());
}
listeners.get(event).add(listener);
return () => { var _a; return (_a = listeners.get(event)) === null || _a === void 0 ? void 0 : _a.delete(listener); };
}),
};
};
const createWaveSurfer = (duration = 1, scrollWidth = 100) => {
const emitter = createEmitter();
const durationSignal = signal(duration);
const wrapper = document.createElement('div');
Object.defineProperty(wrapper, 'scrollWidth', { configurable: true, value: scrollWidth });
document.body.appendChild(wrapper);
return Object.assign(Object.assign({}, emitter), { getDuration: jest.fn(() => duration), getScroll: jest.fn(() => 0), getState: jest.fn(() => ({ duration: durationSignal })), getWidth: jest.fn(() => scrollWidth * 2), getWrapper: jest.fn(() => wrapper) });
};
describe('TimelinePlugin', () => {
afterEach(() => {
document.body.innerHTML = '';
jest.clearAllMocks();
});
test('preserves high precision offsets for notch positions', () => {
const wavesurfer = createWaveSurfer(1, 100);
const plugin = TimelinePlugin.create({
duration: 1,
timeInterval: 0.333,
timeOffset: 0.001,
primaryLabelInterval: 10,
secondaryLabelInterval: 10,
});
plugin._init(wavesurfer);
const notches = wavesurfer.getWrapper().querySelectorAll('[part^="timeline-notch"]');
expect(notches).toHaveLength(4);
const offsets = Array.from(notches, (notch) => parseFloat(notch.style.left));
expect(offsets[0]).toBeCloseTo(0.1);
expect(offsets[1]).toBeCloseTo(33.4);
expect(offsets[2]).toBeCloseTo(66.7);
expect(offsets[3]).toBeCloseTo(100);
});
});