import { afterEach, expect, it, vi } from 'vitest'; import { mountPlayerAmbient } from '../src/player/controls'; import { configurePlayer } from '../src/player/host'; afterEach(()=>{vi.restoreAllMocks();document.body.innerHTML=''}); it('平均色微小抖动保持稳定,显著变化和关闭再开启更新氛围色',()=>{ document.body.innerHTML=''; const stage=document.querySelector('dialog')!,video=document.querySelector('video')!; let enabled=true,pixel=100,frame:VideoFrameRequestCallback; configurePlayer({stage:()=>stage,settings:()=>({ambientMode:enabled,theaterMode:false,miniplayer:true,detailAutoplay:false,javImage:'cover',seekSeconds:10}),saveSettings:()=>{},toast:()=>{},loadSourceStatus:async()=>({}),offlineReason:()=>''}); Object.defineProperties(video,{readyState:{value:2},paused:{value:false},requestVideoFrameCallback:{value:(callback:VideoFrameRequestCallback)=>{frame=callback;return 1}}}); vi.spyOn(HTMLCanvasElement.prototype,'getContext').mockReturnValue({drawImage:vi.fn(),clearRect:vi.fn(),getImageData:()=>({data:new Uint8ClampedArray([pixel,pixel,pixel,255])})} as unknown as CanvasRenderingContext2D); const stop=mountPlayerAmbient(video); expect(stage.style.getPropertyValue('--video-glow')).toBe('rgb(100 100 100)'); pixel=102;frame!(500,{} as VideoFrameCallbackMetadata); expect(stage.style.getPropertyValue('--video-glow')).toBe('rgb(100 100 100)'); pixel=120;frame!(1000,{} as VideoFrameCallbackMetadata); expect(stage.style.getPropertyValue('--video-glow')).toBe('rgb(120 120 120)'); enabled=false;document.dispatchEvent(new CustomEvent('peachambientchange',{detail:{enabled}})); expect(stage.style.getPropertyValue('--video-glow')).toBe(''); enabled=true;pixel=121;document.dispatchEvent(new CustomEvent('peachambientchange',{detail:{enabled}})); expect(stage.style.getPropertyValue('--video-glow')).toBe('rgb(121 121 121)'); stop();expect(stage.style.getPropertyValue('--video-glow')).toBe(''); });