blob: 4c2207653d10253c7cfc10d1d2f02e5a6e82f4f1 [file] [log] [blame]
import './index';
import { expect } from 'chai';
import {
PlaySk,
} from './play-sk';
import {
setUpElementUnderTest, eventPromise, noEventPromise,
} from '../../../infra-sk/modules/test_util';
import {
ModeChangedManuallyEvent, ModeChangedManuallyEventDetail, MoveToEvent, MoveToEventDetail,
} from '../events';
describe('play-sk', () => {
const newInstance = setUpElementUnderTest<PlaySk>('play-sk');
let play: PlaySk;
beforeEach(() => {
play = newInstance((el: PlaySk) => {
// Put player in well-defined state.
el.mode = 'pause';
el.size = 10; // a sequence of 10 items
el.playbackDelay = 100; // ms
el.movedTo(3); // start on item 3
});
});
// Number of ms to wait for moveto events to be produced.
// must exceed el.playbackDelay above, but not by too much.
const delay = 120;
describe('Events', () => {
it('Starts playing when play button clicked', async () => {
const promise1 = eventPromise<CustomEvent<ModeChangedManuallyEventDetail>>(
ModeChangedManuallyEvent, delay,
);
const promise2 = eventPromise<CustomEvent<MoveToEventDetail>>(MoveToEvent, delay);
// rather than setting play.mode, click the play icon.
(document.getElementById('play-button') as HTMLElement).click();
expect((await promise1).detail.mode).to.equal('play');
expect((await promise2).detail.item).to.equal(4);
});
it('No stack overflow when delay is 0', async () => {
play.playbackDelay = 0;
const promise1 = eventPromise<CustomEvent<ModeChangedManuallyEventDetail>>(
ModeChangedManuallyEvent, delay,
);
const promise2 = eventPromise<CustomEvent<MoveToEventDetail>>(MoveToEvent, delay);
// rather than setting play.mode, click the play icon.
(document.getElementById('play-button') as HTMLElement).click();
expect((await promise1).detail.mode).to.equal('play');
expect((await promise2).detail.item).to.equal(4);
});
it('emits moveto when playing', async () => {
let ep = eventPromise<CustomEvent<MoveToEventDetail>>(MoveToEvent, delay);
play.mode = 'play';
expect((await ep).detail.item).to.equal(4);
// Expect it doesn't happen again, because we haven't called movedTo yet.
await noEventPromise(MoveToEvent, delay);
ep = eventPromise<CustomEvent<MoveToEventDetail>>(MoveToEvent, delay);
play.movedTo(4);
// now expect it asks to play the next thing in 100 ms.
expect((await ep).detail.item).to.equal(5);
});
// State 1 being right after it emits moveto, but before the app calls movedTo
it('Does not emit moveto after paused in state 1', async () => {
const ep = eventPromise<CustomEvent<MoveToEventDetail>>(MoveToEvent, delay);
play.mode = 'play';
await ep;
// now in state 1 indefinitely.
play.mode = 'pause';
await noEventPromise(MoveToEvent, delay);
});
// State 2 being right after the app calls movedTo but it's sitting out it's internal
// delay.
it('Does not emit moveto after paused in state 2', async () => {
const ep = eventPromise<CustomEvent<MoveToEventDetail>>(MoveToEvent, delay);
play.mode = 'play';
const item = (await ep).detail.item;
play.movedTo(item);
// now in state 2 for 100 ms.
play.mode = 'pause';
await noEventPromise(MoveToEvent, delay);
});
it('Continues after skipping to an arbitrary position while playing in state 1',
async () => {
let ep = eventPromise<CustomEvent<MoveToEventDetail>>(MoveToEvent, delay);
play.mode = 'play';
await ep;
ep = eventPromise<CustomEvent<MoveToEventDetail>>(MoveToEvent, delay);
play.movedTo(8);
// expect it to emit moveto 9
expect((await ep).detail.item).to.equal(9);
});
it('Continues after skipping to an arbitrary position while playing in state 2',
async () => {
let ep = eventPromise<CustomEvent<MoveToEventDetail>>(MoveToEvent, delay);
play.mode = 'play';
const item = (await ep).detail.item;
play.movedTo(item);
// now in state 2 for 100 ms
ep = eventPromise<CustomEvent<MoveToEventDetail>>(MoveToEvent, delay);
play.movedTo(8);
// expect it to emit moveto 9
expect((await ep).detail.item).to.equal(9);
});
it('Plays after skipping to an arbitrary position while paused', async () => {
play.mode = 'pause';
play.movedTo(8);
// expect jumps don't start playback
await noEventPromise(MoveToEvent, delay);
// expect it to emit moveto 9
const ep = eventPromise<CustomEvent<MoveToEventDetail>>(MoveToEvent, delay);
play.mode = 'play';
expect((await ep).detail.item).to.equal(9);
});
});
});