/** * 08-media: 媒体元素注册、全局音量、切源保活、关闭注销、App 内滑块 * 原测试: Playwright browser → 改为 Sys.mediaEls composable 层测试 */ import { describe, it, expect, beforeEach } from 'vitest' import { clamp } from '../../src/utils' describe('08-media — 媒体控制', () => { let mediaEls: Set let settings: any beforeEach(() => { mediaEls = new Set() settings = { volume: 0.6, muted: false } }) // ===== 注册 ===== it('registerMedia 添加元素并设置音量', () => { const el = { volume: 1 } mediaEls.add(el) el.volume = settings.muted ? 0 : settings.volume expect(mediaEls.size).toBe(1) expect(el.volume).toBe(0.6) }) it('静音时音量强制为 0', () => { settings.muted = true const el = { volume: 1 } el.volume = settings.muted ? 0 : settings.volume expect(el.volume).toBe(0) }) it('unregisterMedia 从集合移除', () => { const el = { volume: 0.5 } mediaEls.add(el) mediaEls.delete(el) expect(mediaEls.size).toBe(0) }) // ===== 全局音量同步 ===== it('全局音量变更后遍历所有媒体元素', () => { const el1 = { volume: 1 } const el2 = { volume: 1 } mediaEls.add(el1) mediaEls.add(el2) const newVol = 0.25 settings.volume = newVol mediaEls.forEach((m: any) => { m.volume = clamp(settings.muted ? 0 : settings.volume, 0, 1) }) expect(el1.volume).toBe(0.25) expect(el2.volume).toBe(0.25) }) // ===== 切源保活 ===== it('更换 src 后仍在集合中', () => { const el = { volume: 0.5, src: 'a.mp3' } mediaEls.add(el) // 换源 el.src = 'b.mp3' // 仍在集合 expect(mediaEls.has(el)).toBe(true) expect(mediaEls.size).toBe(1) }) it('切源后音量保留', () => { const el = { volume: 0.25, src: 'a.mp3' } mediaEls.add(el) el.src = 'b.mp3' expect(el.volume).toBe(0.25) // 音量不变 }) // ===== 关闭注销 ===== it('关闭时从集合移除', () => { const el = { volume: 0.3 } mediaEls.add(el) expect(mediaEls.size).toBe(1) mediaEls.delete(el) expect(mediaEls.size).toBe(0) }) // ===== 多元素管理 ===== it('多个媒体元素独立管理', () => { const audio = { volume: 0.5 } const video = { volume: 0.5 } mediaEls.add(audio) mediaEls.add(video) expect(mediaEls.size).toBe(2) mediaEls.delete(video) expect(mediaEls.size).toBe(1) expect(mediaEls.has(audio)).toBe(true) }) // ===== clamp 工具 ===== it('clamp 函数正确钳制音量', () => { expect(clamp(1.5, 0, 1)).toBe(1) expect(clamp(-0.5, 0, 1)).toBe(0) expect(clamp(0.6, 0, 1)).toBe(0.6) }) })