import test from 'node:test'; import assert from 'node:assert/strict'; import {RoomDeviceStatusAdapter,createRoomDeviceStatusSubscriptions} from '../../YouleNexus/assets/framework/adapters/native/room-device-status.ts'; import type {PlatformNativeHost} from '../../YouleNexus/assets/framework/adapters/native/platform-native.ts'; import type {NativeHandler} from '../../YouleNexus/assets/framework/adapters/native/native-contracts.ts'; function setup(host:PlatformNativeHost) { const handlers=new Map(); const adapter=new RoomDeviceStatusAdapter({host,subscribe:(name,handler)=>{handlers.set(name,handler);return()=>{handlers.delete(name);};}}); return {adapter,handlers}; } test('browser owns explicit legacy test defaults',()=>{ const {adapter}=setup({kind:'browser'}); assert.deepEqual(adapter.snapshot(),{battery:1,network:1,wifiLevel:null,wifiFrame:4,batteryFrame:2}); adapter.refresh();assert.equal(adapter.snapshot().battery,1); }); test('settings uses exact synchronous getters and wifi callback positional arguments',()=>{ const calls:string[]=[]; const {adapter,handlers}=setup({kind:'settings',settings:{getbattery(){calls.push('getbattery');return '0.2';},getnetwork(){calls.push('getnetwork');return '2';},getwifisignalLevel(){calls.push('getwifisignalLevel');}}}); assert.deepEqual(calls,['getnetwork','getwifisignalLevel','getbattery']); assert.equal(adapter.snapshot().batteryFrame,3);assert.equal(adapter.snapshot().wifiFrame,3); for(const [level,frame] of [[0,1],[1,2],[2,2],[3,3],[4,3]]){ handlers.get('getwifiLevel')!('real ssid',String(level));assert.equal(adapter.snapshot().wifiFrame,frame); } handlers.get('getBattery')!('0.21');assert.equal(adapter.snapshot().batteryFrame,2); handlers.get('getnetwork')!('3');assert.equal(adapter.snapshot().wifiFrame,4); handlers.get('getnetwork')!('1');assert.equal(adapter.snapshot().wifiFrame,4); }); test('bridge waits for callbacks without inventing native getter calls',()=>{ const {adapter,handlers}=setup({kind:'bridge',call(){assert.fail('legacy status getters never call WVJB');}}); assert.deepEqual(adapter.snapshot(),{battery:null,network:null,wifiLevel:null,wifiFrame:null,batteryFrame:null}); handlers.get('getwifiLevel')!(JSON.stringify({ssidname:'real',signalLevel:'2'})); handlers.get('getnetwork')!('2');handlers.get('getBattery')!('0.1'); assert.equal(adapter.snapshot().wifiFrame,3);assert.equal(adapter.snapshot().batteryFrame,3); adapter.refresh();assert.equal(adapter.snapshot().wifiFrame,3); }); test('invalid native data and absent settings methods expose source errors',()=>{ assert.throws(()=>setup({kind:'settings',settings:{}}),/getnetwork/); const {adapter,handlers}=setup({kind:'bridge',call(){}}); for(const value of [null,undefined,'',true,'NaN',-0.1,1.1])assert.throws(()=>handlers.get('getBattery')!(value),/battery/i); for(const value of [0,4,'',null])assert.throws(()=>handlers.get('getnetwork')!(value),/network/); for(const signalLevel of [-1,5,1.2,'',null])assert.throws(()=>handlers.get('getwifiLevel')!({ssidname:'x',signalLevel}),/wifi/i); assert.equal(adapter.snapshot().battery,null); }); test('observable status unsubscribes and late callbacks remain inert',()=>{ const {adapter,handlers}=setup({kind:'bridge',call(){}});let count=0; const off=adapter.subscribe(()=>count++); handlers.get('getBattery')!(1);assert.equal(count,1);off(); handlers.get('getBattery')!(0.5);assert.equal(count,1); const retained=handlers.get('getBattery')!;adapter.dispose();retained('bad');assert.equal(handlers.size,0); assert.throws(()=>adapter.refresh(),/disposed/); }); test('subscriptions restore settings globals and guard retained WVJB callbacks',()=>{ const original=()=>{};const globals:Record={getBattery:original};let count=0; const subscribe=createRoomDeviceStatusSubscriptions({kind:'settings',settings:{}},globals); const off=subscribe('getBattery',()=>count++);const retained=globals.getBattery as NativeHandler; retained(1);off();retained(1);assert.equal(count,1);assert.equal(globals.getBattery,original); const offNew=subscribe('getnetwork',()=>{});offNew();assert.equal('getnetwork' in globals,false); const newer=()=>{};const offOwned=subscribe('getwifiLevel',()=>{});globals.getwifiLevel=newer;offOwned();assert.equal(globals.getwifiLevel,newer); const handlers=new Map(); const offBridge=createRoomDeviceStatusSubscriptions({kind:'bridge',call(){}},{},{register:(name,handler)=>{handlers.set(name,handler);}})('getBattery',()=>count++); handlers.get('getBattery')!(1);offBridge();handlers.get('getBattery')!(1);assert.equal(count,2); }); test('failed settings initialization releases every installed global callback',()=>{ const original=()=>{};const globals:Record={getBattery:original}; const host:PlatformNativeHost={kind:'settings',settings:{getnetwork(){return 2;}}}; assert.throws(()=>new RoomDeviceStatusAdapter({host,subscribe:createRoomDeviceStatusSubscriptions(host,globals)}),/getwifisignalLevel/); assert.deepEqual(globals,{getBattery:original}); }); test('settings wifi callback can synchronously respond to the exact no-argument request',()=>{ const globals:Record={}; const settings={getnetwork(){return 2;},getbattery(){return 0;},getwifisignalLevel(...args:unknown[]){ assert.deepEqual(args,[]);assert.equal(this,settings);(globals.getwifiLevel as NativeHandler)('ssid',0); }}; const host:PlatformNativeHost={kind:'settings',settings}; const adapter=new RoomDeviceStatusAdapter({host,subscribe:createRoomDeviceStatusSubscriptions(host,globals)}); assert.equal(adapter.snapshot().wifiFrame,1);assert.equal(adapter.snapshot().battery,0); adapter.dispose();assert.deepEqual(globals,{}); });