文件
rtos-watch-debug-bridge/com.sydxky.rtos.deviceprobe/tests/screen-lifecycle.cjs
T

86 行
3.1 KiB
JavaScript

const { test } = require('node:test');
const assert = require('node:assert/strict');
const fs = require('node:fs');
const vm = require('node:vm');
const path = require('node:path');
function load(brightness) {
const source = fs.readFileSync(path.join(__dirname, '../src/main/index.ux'), 'utf8')
.match(/<script>([\s\S]*?)<\/script>/)[1].replace('export default', 'module.exports =');
const active = new Map();
const callbacks = [];
let next = 0;
const context = { module: { exports: {} }, Promise, console,
require: () => ({ default: brightness }),
setInterval(fn) { callbacks.push(fn); active.set(++next, fn); return next; },
clearInterval(id) { active.delete(id); } };
vm.runInNewContext(source, context);
const page = context.module.exports;
Object.assign(page, page.data);
return { page, active, callbacks };
}
test('repeated shows own one renewal; hide and destroy prevent queued wakeups', () => {
const calls = [];
const { page, active, callbacks } = load({
setKeepScreenOn: value => calls.push(['keep', value]),
wakeScreenOn: value => calls.push(['wake', value.screenOn]) });
page.onShow(); page.onShow();
assert.equal(active.size, 1);
assert.deepEqual(calls, [['keep', true], ['wake', true]]);
callbacks[0]();
page.onHide();
assert.equal(active.size, 0);
const afterHide = calls.length;
callbacks[0]();
assert.equal(calls.length, afterHide);
page.onShow();
assert.equal(active.size, 1);
page.onDestroy();
assert.equal(active.size, 0);
const afterDestroy = calls.length;
for (const callback of callbacks) callback();
assert.equal(calls.length, afterDestroy);
assert.deepEqual(calls.at(-1), ['keep', false]);
});
test('destroy releases a visible page even without hide', () => {
const calls = [];
const { page, active } = load({ setKeepScreenOn: value => calls.push(value), wakeScreenOn() {} });
page.onShow(); page.onDestroy();
assert.deepEqual(calls, [true, false]);
assert.equal(active.size, 0);
});
test('late rejection cannot overwrite the new visible generation', async () => {
let rejectOld;
let first = true;
const { page } = load({ setKeepScreenOn() {}, wakeScreenOn() {
if (first) { first = false; return new Promise((_, reject) => { rejectOld = reject; }); }
} });
page.onShow(); page.onHide(); page.onShow();
const status = page.screenStatus;
rejectOld(new Error('old request'));
await Promise.resolve(); await Promise.resolve();
assert.equal(page.screenStatus, status);
page.onDestroy();
});
test('a missing wake API is reported and does not start renewal', () => {
const { page, active } = load({ setKeepScreenOn() {} });
page.onShow();
assert.equal(active.size, 0);
assert.equal(page.screenStatus, '固件缺少亮屏接口');
page.onDestroy();
});
test('a rejected wake stops renewal and remains visible as a failure', async () => {
const { page, active } = load({ setKeepScreenOn() {},
wakeScreenOn: () => Promise.reject(new Error('unsupported')) });
page.onShow();
await Promise.resolve(); await Promise.resolve();
assert.equal(active.size, 0);
assert.equal(page.screenStatus, '固件未接受亮屏');
page.onDestroy();
});