Files
youle_cocos/cocoscreator_projects/framework-tests/native/room-device-status.test.ts
T
joywayer 35216f75e7 feat: integrate room framework and isolated subgame bundles
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.
2026-09-09 03:13:18 +08:00

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,{});
});