27 lines
2.5 KiB
JavaScript
27 lines
2.5 KiB
JavaScript
const { test } = require('node:test'), assert = require('node:assert/strict'); const { transcript } = require('./car-mode');
|
|
test('voice search submits only final results from the result index', () => { const interim = [{transcript:'wrong'}]; interim.isFinal = false; const final = [{transcript:'Amazing Grace'}]; final.isFinal = true; assert.equal(transcript({results:[interim, final]}), 'Amazing Grace'); assert.equal(transcript({resultIndex:2,results:[final,final]}), ''); assert.equal(transcript({}), ''); });
|
|
|
|
test('lazy Car mode keeps four independent transport buttons and the voice entry in place', () => {
|
|
const vm=require('node:vm'),fs=require('node:fs');
|
|
class Element {
|
|
constructor(tag){this.tag=tag;this.children=[];this.inert=false;}
|
|
append(...nodes){for(const node of nodes){node.remove();node.parent=this;this.children.push(node);}}
|
|
remove(){if(this.parent){this.parent.children=this.parent.children.filter(n=>n!==this);this.parent=null;}}
|
|
after(node){this.parent.append(node);}
|
|
setAttribute(name,value){this[name]=value;}
|
|
focus(){}
|
|
get isConnected(){return !!this.parent;}
|
|
}
|
|
const body=new Element('body'),input=new Element('input'),form=new Element('form'),voice=new Element('button');form.id='searchForm';voice.id='voiceSearchBtn';body.append(form,input,voice);
|
|
const all=node=>[node,...node.children.flatMap(all)],doc={body,documentElement:{lang:'en'},createElement:tag=>new Element(tag),getElementById:id=>all(body).find(n=>n.id===id)};
|
|
let section;const actions=[],root={document:doc,navigator:{},SpeechRecognition:function(){},SettingsSections:{register:s=>section=s}};
|
|
vm.runInNewContext(fs.readFileSync(__dirname+'/car-mode.js','utf8'),{window:root,setInterval:()=>1,clearInterval:()=>{}});
|
|
root.CarMode.configure({input,action:action=>actions.push(action),state:()=>({paused:true,title:'Song'})});
|
|
root.CarMode.open();const overlay=body.children.find(n=>n.className==='car-mode'),controls=overlay.children.find(n=>n.className==='car-controls');
|
|
assert.equal(controls.children.length,4);assert.equal(new Set(controls.children).size,4);assert.equal(voice.parent,body);
|
|
controls.children.forEach(b=>b.onclick());assert.deepEqual(actions,['prev','toggle','back','next']);
|
|
root.CarMode.close();assert.equal(voice.parent,body);assert.equal(body.inert,false);
|
|
const panel=new Element('section');body.append(panel);section.render(panel);
|
|
assert.equal(voice.parent,body,'settings must not steal the voice entry');assert.equal(panel.children.at(-1).textContent,'Enter Car mode');
|
|
});
|