101 lines
2.7 KiB
TypeScript
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)
|
|
})
|
|
})
|