import test from 'node:test'; import assert from 'node:assert/strict'; import {build} from 'esbuild'; const result=await build({entryPoints:[new URL('../src/core/fleet/roverInput.ts',import.meta.url).pathname],bundle:true,write:false,platform:'node',format:'esm'}); const {keyDemand,roverSettings}=await import('data:text/javascript;base64,'+Buffer.from(result.outputFiles[0].contents).toString('base64')); const keys=(...k)=>new Set(k.map(v=>'Key'+v)); test('arcade mixes directions and opposite keys cancel',()=>{ assert.deepEqual(keyDemand('arcade',keys('W')),{left:1,right:1}); assert.deepEqual(keyDemand('arcade',keys('A')),{left:-1,right:1}); assert.deepEqual(keyDemand('arcade',keys('W','A')),{left:0,right:1}); assert.deepEqual(keyDemand('arcade',keys('W','S','A','D')),{left:0,right:0}); }); test('tank sides and backwards remain independent',()=>{ assert.deepEqual(keyDemand('tank',keys('Q','D')),{left:1,right:-1}); assert.deepEqual(keyDemand('tank',keys('A','D')),{left:-1,right:-1}); assert.deepEqual(keyDemand('tank',keys('Q','A')),{left:0,right:0}); }); test('invalid stored settings never grant motion or invalid limits',()=>{ assert.equal(roverSettings({version:1,currentA:Infinity}).currentA,30); assert.equal(roverSettings({version:1,maxErpm:999999}).maxErpm,3000); assert.equal(roverSettings({version:1,model:'https://other/model.glb'}).model,''); assert.deepEqual(keyDemand('arcade',new Set()),{left:0,right:0}); });