/* Pure conditioning and log parsing tests: no hardware or browser needed. */ const assert=require('node:assert/strict'); const {deadZone,defaults,read,Motion}=require('../web/controller-input.js'); const {parse}=require('../web/console-view.js'); const pad={connected:true,axes:[0,0,0,0]}; assert.equal(deadZone(.06),0);assert.equal(deadZone(-1),-1);assert.equal(deadZone(1),1); assert.equal(defaults({axes:[0,0]}).vertical,-1); assert.equal(read({...pad,connected:false},defaults(pad)),null); assert.equal(read(pad,{...defaults(pad),vertical:10}),null); const diagonal=read({...pad,axes:[1,-1,0,-1]},defaults(pad)); assert(Math.abs(Math.hypot(diagonal.turn,diagonal.forward)-1)<1e-10); assert.equal(diagonal.vertical,1); assert.equal(read({...pad,axes:[-.5,0,0,0]},{...defaults(pad),invertTurn:true}).turn,deadZone(.5)); const motion=new Motion(),target={turn:.6,forward:.8,vertical:1}; assert.deepEqual(motion.step(target,0),{turn:0,forward:0,vertical:0}); const partial=motion.step(target,16);assert(partial.vertical>0&&partial.vertical<.3); let current;for(let time=32;time<=1000;time+=16){current=motion.step(target,time);assert(Math.hypot(current.turn,current.forward)<=1+1e-10)} assert(current.vertical>.99); const neutral={turn:0,forward:0,vertical:0}; assert(motion.step(neutral,1024).vertical>.99); assert(motion.step(neutral,1200).vertical>0); assert.deepEqual(motion.step(neutral,1400),neutral); motion.reset();assert.deepEqual(motion.step(target,1500),neutral); assert.equal(parse('2026-10-01T10:11:12.123 [RX] {"mavpackettype":"HEARTBEAT","base_mode":128}').quiet,true); const ack=parse('2026-10-01T10:11:12.123 [RX] {"mavpackettype":"COMMAND_ACK","command":400,"result":0}'); assert.equal(ack.time,'10:11:12.123');assert.equal(ack.type,'COMMAND_ACK');assert.equal(ack.tone,'command'); assert.equal(parse('2026-10-01T10:11:12 [TX_LINK_PROBE_TIMEOUT] retry').quiet,false); assert.equal(parse('2026-10-01T10:11:12 [RX] {"mavpackettype":"STATUSTEXT","severity":3,"text":"warning"}').tone,'warning'); assert.equal(parse('2026-10-01T10:11:12 [RX] null').type,'RX'); assert.equal(parse('unstructured text').payload,'unstructured text'); console.log('PASS: dead zone, mapping/inversion, diagonal cap, ramp, finite center return, resets, console parsing and warning visibility.');