fix: Replay controls

This commit is contained in:
voltsrage
2026-06-20 14:41:11 +08:00
parent 584d1edd58
commit 7cfc5567fd
9 changed files with 291 additions and 73 deletions
@@ -1,14 +1,21 @@
import { describe, it, expect } from 'vitest'
import { describe, it, expect, vi, afterEach } from 'vitest'
import { useReplayControls } from '@/composables/useReplayControls'
describe('useReplayControls', () => {
afterEach(() => {
vi.useRealTimers()
})
it('pauseAndResume', () => {
const { isPaused, pause, resume } = useReplayControls()
expect(isPaused.value).toBe(false)
pause()
expect(isPaused.value).toBe(true)
resume()
expect(isPaused.value).toBe(false)
const replay = useReplayControls()
replay.setScenarioBounds(0, 60_000)
replay.syncToEnd()
expect(replay.isPaused.value).toBe(true)
replay.resume()
expect(replay.isPaused.value).toBe(false)
replay.pause()
expect(replay.isPaused.value).toBe(true)
})
it('speedPresets', () => {
@@ -19,15 +26,42 @@ describe('useReplayControls', () => {
})
it('progressComputation', () => {
const { currentOffsetMinutes, scenarioDurationMinutes, progress } = useReplayControls()
scenarioDurationMinutes.value = 100
currentOffsetMinutes.value = 50
expect(progress.value).toBe(50)
const replay = useReplayControls()
replay.setScenarioBounds(0, 100 * 60_000)
replay.jumpToOffset(50)
expect(replay.progress.value).toBe(50)
})
it('jumpToOffset', () => {
const { currentOffsetMinutes, jumpToOffset } = useReplayControls()
jumpToOffset(42)
expect(currentOffsetMinutes.value).toBe(42)
const replay = useReplayControls()
replay.setScenarioBounds(0, 100 * 60_000)
replay.jumpToOffset(42)
expect(replay.currentOffsetMinutes.value).toBe(42)
})
it('jumpToTimestamp_clampsWithinScenario', () => {
const replay = useReplayControls()
const start = new Date('2026-06-19T12:00:00Z').getTime()
const end = new Date('2026-06-19T14:00:00Z').getTime()
replay.setScenarioBounds(start, end)
replay.jumpToTimestamp('2026-06-19T13:00:00Z')
expect(replay.currentOffsetMinutes.value).toBe(60)
})
it('isAtOrBefore_filtersByCurrentTime', () => {
const replay = useReplayControls()
replay.setScenarioBounds(0, 120 * 60_000)
replay.jumpToOffset(30)
expect(replay.isAtOrBefore(new Date(20 * 60_000).toISOString())).toBe(true)
expect(replay.isAtOrBefore(new Date(40 * 60_000).toISOString())).toBe(false)
})
it('instantSpeedJumpsToEnd', () => {
const replay = useReplayControls()
replay.setScenarioBounds(0, 60_000)
replay.jumpToOffset(10)
replay.setSpeed(0)
expect(replay.progress.value).toBe(100)
expect(replay.isPaused.value).toBe(true)
})
})