macos-web/tests/cases/08-media.test.ts
2026-07-20 14:30:44 +08:00

101 lines
2.7 KiB
TypeScript

/**
* 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<any>
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)
})
})