chiro-canto/public/scripts/wavesurfer/spec/mediaelement-shared.js

329 lines
9.0 KiB
JavaScript

/* eslint-env jasmine */
import TestHelpers from './test-helpers';
let audioElement;
let wavesurfer;
export function sharedTests(backend) {
let element;
jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
beforeEach(function() {
audioElement = TestHelpers.createElement('testAudio', 'audio');
const wave = TestHelpers.createWaveform({
container: TestHelpers.createElement(),
waveColor: 'red',
progressColor: 'orange',
cursorColor: 'white',
backend: backend
});
wavesurfer = wave[0];
element = wave[1];
});
afterEach(function() {
wavesurfer.destroy();
TestHelpers.removeElement(element);
});
/**
* @test {WaveSurfer#isReady}
*/
it('should be ready', function(done) {
wavesurfer.once('ready', done);
loadElement();
});
/**
* @test {WaveSurfer#waveform-ready} When the waveform is drawn, the 'waveform-ready' event is triggered
*/
it('should fire waveform-ready event when the waveform is drawn', function(done) {
const waveformReadySpy = jasmine.createSpy('waveform-ready-spy');
wavesurfer.on('waveform-ready', () => {
waveformReadySpy();
expect(waveformReadySpy).toHaveBeenCalledTimes(1);
done();
});
loadAudioPeaks();
});
/**
* @test {WaveSurfer#play}
* @test {WaveSurfer#isPlaying}
*/
it('should play', function(done) {
wavesurfer.once('ready', function() {
wavesurfer.play();
expect(wavesurfer.isPlaying()).toBeTrue();
done();
});
loadElement();
});
/**
* @test {WaveSurfer#play}
* @test {WaveSurfer#isPlaying}
* @test {WaveSurfer#pause}
*/
it('should pause', function(done) {
wavesurfer.once('ready', function() {
wavesurfer.play();
expect(wavesurfer.isPlaying()).toBeTrue();
wavesurfer.pause();
expect(wavesurfer.isPlaying()).toBeFalse();
done();
});
loadElement();
});
/**
* @test {WaveSurfer#playPause}
* @test {WaveSurfer#isPlaying}
*/
it('should play or pause', function(done) {
wavesurfer.once('ready', function() {
wavesurfer.playPause();
expect(wavesurfer.isPlaying()).toBeTrue();
wavesurfer.playPause();
expect(wavesurfer.isPlaying()).toBeFalse();
done();
});
loadElement();
});
/** @test {WaveSurfer#getDuration} */
it('should get duration', function(done) {
wavesurfer.once('ready', function() {
let duration = parseInt(wavesurfer.getDuration(), 10);
expect(duration).toEqual(TestHelpers.EXAMPLE_FILE_DURATION);
done();
});
loadElement();
});
/** @test {WaveSurfer#getCurrentTime} */
it('should get currentTime', function(done) {
wavesurfer.once('ready', function() {
// initially zero
let time = wavesurfer.getCurrentTime();
expect(time).toEqual(0);
// seek to 50%
wavesurfer.seekTo(0.5);
time = parseInt(wavesurfer.getCurrentTime(), 10);
expect(time).toEqual(10);
done();
});
loadElement();
});
/** @test {WaveSurfer#setCurrentTime} */
it('should set currentTime', function(done) {
wavesurfer.once('ready', function() {
// initially zero
let time = wavesurfer.getCurrentTime();
expect(time).toEqual(0);
// set to 10 seconds
wavesurfer.setCurrentTime(10);
time = wavesurfer.getCurrentTime();
expect(time).toEqual(10);
// set to something higher than duration
wavesurfer.setCurrentTime(1000);
time = wavesurfer.getCurrentTime();
// sets it to end of track
time = parseInt(wavesurfer.getCurrentTime(), 10);
expect(time).toEqual(TestHelpers.EXAMPLE_FILE_DURATION);
done();
});
loadElement();
});
/** @test {WaveSurfer#skipBackward} */
it('should skip backward', function(done) {
wavesurfer.once('ready', function() {
// seek to 50%
wavesurfer.seekTo(0.5);
// skip 4 seconds backward
wavesurfer.skipBackward(4);
let time = wavesurfer.getCurrentTime();
expect(time).toBeWithinRange(6.88, 6.89);
// skip backward with params.skipLength (default: 2 seconds)
wavesurfer.skipBackward();
time = wavesurfer.getCurrentTime();
expect(time).toBeWithinRange(4.88, 4.89);
done();
});
loadElement();
});
/** @test {WaveSurfer#skipForward} */
it('should skip forward', function(done) {
wavesurfer.once('ready', function() {
// skip 4 seconds forward
wavesurfer.skipForward(4);
let time = wavesurfer.getCurrentTime();
expect(time).toBeWithinRange(3.99, 4);
// skip forward with params.skipLength (default: 2 seconds)
wavesurfer.skipForward();
time = wavesurfer.getCurrentTime();
expect(time).toBeWithinRange(5.99, 6);
done();
});
loadElement();
});
/** @test {WaveSurfer#getPlaybackRate} */
it('should get playback rate', function(done) {
wavesurfer.once('ready', function() {
let rate = wavesurfer.getPlaybackRate();
expect(rate).toEqual(1);
done();
});
loadElement();
});
/** @test {WaveSurfer#setPlaybackRate} */
it('should set playback rate', function(done) {
wavesurfer.once('ready', function() {
let rate = 0.5;
wavesurfer.setPlaybackRate(rate);
expect(wavesurfer.getPlaybackRate()).toEqual(rate);
done();
});
loadElement();
});
/** @test {WaveSurfer#getVolume} */
it('should get volume', function(done) {
audioElement.volume = 0.3;
wavesurfer.once('ready', function() {
let volume = wavesurfer.getVolume();
expect(volume).toEqual(audioElement.volume);
done();
});
loadElement();
});
/** @test {WaveSurfer#setVolume} */
it('should set volume', function(done) {
let targetVolume = 0.5;
wavesurfer.once('volume', function(result) {
expect(result).toEqual(targetVolume);
expect(wavesurfer.getVolume()).toEqual(targetVolume);
done();
});
wavesurfer.once('ready', function() {
wavesurfer.setVolume(targetVolume);
});
loadElement();
});
/** @test {WaveSurfer#toggleMute} */
it('should toggle mute', function(done) {
wavesurfer.once('ready', function() {
wavesurfer.toggleMute();
expect(wavesurfer.isMuted).toBeTrue();
wavesurfer.toggleMute();
expect(wavesurfer.isMuted).toBeFalse();
done();
});
loadElement();
});
/** @test {WaveSurfer#setMute} */
it('should set mute', function(done) {
wavesurfer.once('ready', function() {
wavesurfer.setMute(true);
expect(wavesurfer.isMuted).toBeTrue();
wavesurfer.setMute(false);
expect(wavesurfer.isMuted).toBeFalse();
done();
});
loadElement();
});
/** @test {WaveSurfer#getMute} */
it('should get mute', function(done) {
wavesurfer.once('ready', function() {
wavesurfer.setMute(true);
expect(wavesurfer.getMute()).toBeTrue();
wavesurfer.setMute(false);
expect(wavesurfer.getMute()).toBeFalse();
done();
});
loadElement();
});
}
export function sharedErrorTests(backend) {
let element;
beforeEach(function() {
element = TestHelpers.createElement('test');
});
afterEach(function() {
TestHelpers.removeElement(element);
});
/**
* @test {WaveSurfer}
*/
it('throw when load is called with invalid HTMLMediaElement', function() {
let wave = TestHelpers.createWaveform({
container: '#test',
backend: backend
});
expect(function() {
wave[0].load({
foo: 'bar'
});
}).toThrow(new Error('media parameter is not a valid media element'));
});
}
function loadElement() {
// set src
audioElement.src = TestHelpers.EXAMPLE_FILE_PATH;
wavesurfer.load(audioElement);
}
/** Retrieve normalized waveform peaks, then load an audio resource giving peaks and setting preload attribute to 'none' **/
function loadAudioPeaks() {
TestHelpers.getPeaks(TestHelpers.EXAMPLE_STEREO_FILE_JSON_PATH, (peaks) => {
const src = TestHelpers.EXAMPLE_STEREO_FILE_PATH;
wavesurfer.load(src, peaks, 'none', TestHelpers.EXAMPLE_STEREO_FILE_DURATION);
});
}