fix: adjustShuttle reads live rate with 0.25 step, fullscreen targets documentElement
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -19,6 +19,7 @@ import {
|
||||
isFullscreenActive,
|
||||
setPlaybackRate,
|
||||
getPlaybackRate,
|
||||
adjustShuttle,
|
||||
} from '$lib/transport/playback';
|
||||
|
||||
function createMockVideoElement(): HTMLVideoElement {
|
||||
@@ -85,9 +86,11 @@ describe('playback — fullscreen helpers', () => {
|
||||
expect(isFullscreenActive()).toBe(false);
|
||||
});
|
||||
|
||||
it('toggleFullscreen calls requestFullscreen when not fullscreen', () => {
|
||||
it('toggleFullscreen calls requestFullscreen on document.documentElement', () => {
|
||||
const spy = vi.fn().mockResolvedValue(undefined);
|
||||
document.documentElement.requestFullscreen = spy;
|
||||
toggleFullscreen();
|
||||
expect(mockVideo.requestFullscreen).toHaveBeenCalled();
|
||||
expect(spy).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('isFullscreenActive returns true when fullscreen element exists', () => {
|
||||
@@ -127,3 +130,59 @@ describe('playback — playback rate helpers', () => {
|
||||
expect(getPlaybackRate()).toBe(1);
|
||||
});
|
||||
});
|
||||
|
||||
describe('playback — adjustShuttle', () => {
|
||||
let mockVideo: HTMLVideoElement;
|
||||
|
||||
beforeEach(() => {
|
||||
mockVideo = createMockVideoElement();
|
||||
setVideoElement(mockVideo);
|
||||
mockVideo.playbackRate = 1;
|
||||
Object.defineProperty(mockVideo, 'paused', {
|
||||
value: true,
|
||||
writable: true,
|
||||
configurable: true,
|
||||
});
|
||||
mockVideo.play = vi.fn().mockResolvedValue(undefined);
|
||||
});
|
||||
|
||||
it('increases rate by 0.25 when dir is 1', () => {
|
||||
const result = adjustShuttle(1);
|
||||
expect(result).toBe(1.25);
|
||||
expect(mockVideo.playbackRate).toBe(1.25);
|
||||
});
|
||||
|
||||
it('decreases rate by 0.25 when dir is -1', () => {
|
||||
const result = adjustShuttle(-1);
|
||||
expect(result).toBe(0.75);
|
||||
expect(mockVideo.playbackRate).toBe(0.75);
|
||||
});
|
||||
|
||||
it('reads current rate from video element, not external state', () => {
|
||||
mockVideo.playbackRate = 0.75;
|
||||
const result = adjustShuttle(1);
|
||||
expect(result).toBe(1);
|
||||
});
|
||||
|
||||
it('clamps to minimum 0.25', () => {
|
||||
mockVideo.playbackRate = 0.25;
|
||||
const result = adjustShuttle(-1);
|
||||
expect(result).toBe(0.25);
|
||||
});
|
||||
|
||||
it('clamps to maximum 4', () => {
|
||||
mockVideo.playbackRate = 4;
|
||||
const result = adjustShuttle(1);
|
||||
expect(result).toBe(4);
|
||||
});
|
||||
|
||||
it('starts playback if paused', () => {
|
||||
adjustShuttle(1);
|
||||
expect(mockVideo.play).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('returns 1 when no video element', () => {
|
||||
setVideoElement(null);
|
||||
expect(adjustShuttle(1)).toBe(1);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user