Files
HyperDRM/tests/remote-navigation.test.js
T

32 lines
2.2 KiB
JavaScript

const assert=require('assert');
const fs=require('fs');
const path=require('path');
const vm=require('vm');
const handlers={},windowHandlers={};
const doc={activeElement:null,addEventListener(type,handler){handlers[type]=handler;}};
const buttons=['start','stop','refresh','autostart','handover'].map(id=>({
id,disabled:id==='handover',clicks:0,handlers:{},
addEventListener(type,handler){this.handlers[type]=handler;},
focus(){doc.activeElement=this;this.handlers.focus();},
click(){this.clicks++;}
}));
const context={};vm.createContext(context);
vm.runInContext(fs.readFileSync(path.join(__dirname,'../app/remote.js'),'utf8'),context);
context.setupRemoteNavigation(buttons,doc,{addEventListener(type,handler){windowHandlers[type]=handler;}});
function key(code,type='keydown',repeat=false){let prevented=false;handlers[type]({keyCode:code,repeat,preventDefault(){prevented=true;}});return prevented;}
buttons[0].focus();assert(key(39));assert.equal(doc.activeElement.id,'stop');
key(37);assert.equal(doc.activeElement.id,'start');key(37);assert.equal(doc.activeElement.id,'autostart');
key(39);assert.equal(doc.activeElement.id,'start');
buttons[1].disabled=true;key(39);assert.equal(doc.activeElement.id,'refresh');
key(13);assert.equal(buttons[2].clicks,1);key(13);key(13,'keydown',true);assert.equal(buttons[2].clicks,1);
key(13,'keyup');key(13);assert.equal(buttons[2].clicks,2);key(13,'keyup');
buttons[3].handlers.mouseenter();assert.equal(doc.activeElement.id,'autostart');key(37);assert.equal(doc.activeElement.id,'refresh');
doc.activeElement=null;key(39);assert.equal(doc.activeElement.id,'refresh');
assert(!key(461));assert(!key(65));
key(40);assert.equal(doc.activeElement.id,'autostart');key(38);assert.equal(doc.activeElement.id,'refresh');
key(13);windowHandlers.blur();key(13);assert.equal(buttons[2].clicks,4);
buttons[4].disabled=false;buttons[3].focus();key(39);assert.equal(doc.activeElement.id,'handover');
key(39);assert.equal(doc.activeElement.id,'start');key(37);assert.equal(doc.activeElement.id,'handover');
buttons.forEach(button=>button.disabled=true);assert(key(39));
console.log('PASS: arrow navigation, wraparound, disabled controls, OK once per press, pointer handoff, focus recovery, Back preserved');