| 29 | } |
| 30 | |
| 31 | function createMockDeps(timeline?: RuntimeTimelineLike | null) { |
| 32 | let isPlaying = false; |
| 33 | let playbackRate = 1; |
| 34 | return { |
| 35 | getTimeline: vi.fn(() => timeline ?? null), |
| 36 | setTimeline: vi.fn(), |
| 37 | getIsPlaying: vi.fn(() => isPlaying), |
| 38 | setIsPlaying: vi.fn((v: boolean) => { |
| 39 | isPlaying = v; |
| 40 | }), |
| 41 | getPlaybackRate: vi.fn(() => playbackRate), |
| 42 | setPlaybackRate: vi.fn((v: number) => { |
| 43 | playbackRate = v; |
| 44 | }), |
| 45 | getCanonicalFps: vi.fn(() => 30), |
| 46 | onSyncMedia: vi.fn(), |
| 47 | onStatePost: vi.fn(), |
| 48 | onDeterministicSeek: vi.fn(), |
| 49 | onDeterministicPause: vi.fn(), |
| 50 | onDeterministicPlay: vi.fn(), |
| 51 | onRenderFrameSeek: vi.fn(), |
| 52 | onShowNativeVideos: vi.fn(), |
| 53 | getSafeDuration: vi.fn(() => 10), |
| 54 | }; |
| 55 | } |
| 56 | |
| 57 | function createNestedTimelineHarness() { |
| 58 | const createScene = (start: number, duration: number) => { |