Complete room UI and protocol integration, move game definitions and resources behind bundle entries, publish authoritative version XML, and document single-game builds. Include all current resource changes and experiment artifacts.
80 lines
5.7 KiB
TypeScript
80 lines
5.7 KiB
TypeScript
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<string,NativeHandler>();
|
|
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<string,unknown>={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<string,NativeHandler>();
|
|
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<string,unknown>={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<string,unknown>={};
|
|
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,{});
|
|
});
|