Files
reader/web/test/media-playback-support.test.ts

53 lines
3.3 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { describe, expect, it, vi } from 'vitest';
import { playbackFailure, playbackSupport } from '../src/features/media/services/playback-support.ts';
describe('direct playback support feedback',()=>{
it.each([['LC','mp4a.40.2'],['HE-AAC','mp4a.40.5'],['HE-AACv2','mp4a.40.29']])('uses the scanned AAC %s profile for MP4 capability checks', (profile,codec)=>{
const canPlayType=vi.fn(()=> 'probably' as const);
expect(playbackSupport({canPlayType},'audio/mp4',[{type:'audio',codec:'aac',profile}])).toContain('支持扫描到的音视频编码');
expect(canPlayType).toHaveBeenCalledWith(`audio/mp4; codecs="${codec}"`);
});
it('does not guess unknown AAC profiles or reuse MP4 declarations for raw AAC',()=>{
const canPlayType=vi.fn(()=> 'probably' as const);
expect(playbackSupport({canPlayType},'audio/mp4',[{type:'audio',codec:'aac',profile:'unknown'}])).toContain('不足以完整判断');
expect(playbackSupport({canPlayType},'audio/aac',[{type:'audio',codec:'aac',profile:'LC'}])).toContain('不足以完整判断');
expect(canPlayType).not.toHaveBeenCalled();
});
it('checks codec declarations and identifies unsupported audio even in a supported container',()=>{
const canPlayType=vi.fn((type:string)=>type.includes('ec-3')?'':'probably');
expect(playbackSupport({canPlayType},'video/mp4',[
{type:'video',codec:'h264'},{type:'audio',codec:'eac3'},
])).toContain('部分音轨编码(eac3)');
expect(canPlayType).toHaveBeenCalledWith('video/mp4; codecs="ec-3"');
});
it('ignores attached cover images and subtitles',()=>{
const canPlayType=vi.fn(()=> 'probably' as const);
expect(playbackSupport({canPlayType},'audio/ogg',[
{type:'audio',codec:'opus'},{type:'video',codec:'mjpeg',attachedPicture:true},{type:'subtitle',codec:'subrip'},
])).toContain('支持扫描到的音视频编码');
expect(canPlayType).toHaveBeenCalledTimes(1);
});
it('does not invent H264 or AAC profiles from codec names',()=>{
const canPlayType=vi.fn(()=> 'probably' as const);
expect(playbackSupport({canPlayType},'video/mp4',[
{type:'video',codec:'h264'},{type:'audio',codec:'aac'},
])).toContain('不足以完整判断');
expect(canPlayType).not.toHaveBeenCalled();
});
it('does not promise decoding from container support',()=>{
expect(playbackSupport({canPlayType:()=> 'probably'},'video/mp4')).toContain('实际解码能力');
expect(playbackSupport({canPlayType:()=> ''},'video/x-matroska')).toContain('仍可尝试');
expect(playbackSupport({canPlayType:()=> 'maybe'},'application/octet-stream')).toContain('格式信息不足');
});
it('survives a missing or failing capability implementation',()=>{
expect(playbackSupport({canPlayType:()=>{throw new Error('unavailable');}},'audio/flac')).toContain('将尝试');
});
it('distinguishes user activation from unsupported media and network failures',()=>{
expect(playbackFailure({name:'NotAllowedError'})).toContain('点击继续');
expect(playbackFailure({name:'NotSupportedError'})).toContain('不提供转码');
expect(playbackFailure(undefined,{code:2})).toContain('网络');
expect(playbackFailure(undefined,{code:3})).toContain('解码失败');
expect(playbackFailure(undefined,{code:4})).toContain('无法直放');
});
});