import time,io,subprocess from PIL import Image,ImageChops,ImageStat from ipc import ipc,ENV subprocess.run(['wlr-randr','--output','HEADLESS-1','--custom-mode','640x480','--pos=-640,0'],env=ENV,check=True) ipc('test/rectangle',{'show':True});ipc('test/cube',{}) time.sleep(1.1) for case in [{'show':True,'blue':True}, {'show':True,'blue':True,'moved':True}, {'show':False}, {'show':True}]: ipc('test/rectangle',case);time.sleep(.2) live=Image.open(io.BytesIO(subprocess.check_output(['grim','-o','HEADLESS-1','-'],env=ENV))).convert('RGB') ipc('test/snapshot') fresh=Image.open(ENV['XDG_RUNTIME_DIR'] + '/snapshot.ppm').convert('RGB') error=ImageStat.Stat(ImageChops.difference(live,fresh)).mean assert max(error)<2, (case,error) print('Tracked damage vs fresh composition:',case,'mean channel error',error,flush=True) ipc('test/cube',{'stop':True});ipc('test/rectangle',{'show':False})