import test from 'node:test';
import assert from 'node:assert/strict';
import { launchDiscoSim } from '../src/index.js';
import { dumpHasVisiblePixels, dumpSignature, assertAllTagsExist, KNOWN_TAGS } from './shared-assertions.js';
async function iconStripSignature(session) {
const regions = [];
for (const y of [10, 70, 130]) {
regions.push(dumpSignature(await session.dumpRect({ x: 740, y, width: 40, height: 40, frames: 1 })));
}
return regions.join('|');
}
test('all known widget tags exist at startup', async () => {
const session = await launchDiscoSim({
cwd: process.cwd(),
automationHeadless: true,
});
try {
await assertAllTagsExist(session);
} finally {
await session.close();
}
});
test('keyboard full navigation walk: ArrowDown cycles through all main slots', async () => {
const session = await launchDiscoSim({
cwd: process.cwd(),
automationHeadless: true,
});
try {
const dumpA = await session.dumpRect({ x: 740, y: 10, width: 40, height: 20, frames: 1 });
assert(dumpHasVisiblePixels(dumpA));
const sigA = dumpSignature(dumpA);
await session.keyDown('ArrowDown');
const dumpB = await session.dumpRect({ x: 740, y: 10, width: 40, height: 20, frames: 1 });
const sigB = dumpSignature(dumpB);
assert.notEqual(sigA, sigB, 'icon strip should change as focus moves');
} finally {
await session.close();
}
});
test('settings wing full traversal: Enter then ArrowDown through all items', async () => {
const session = await launchDiscoSim({
cwd: process.cwd(),
automationHeadless: true,
});
try {
await session.keyDown('Enter');
assert.equal(await session.widget('disco.settings.audio').isVisible(), true);
const tags = [
'disco.settings.audio',
'disco.settings.camera',
'disco.settings.display',
'disco.settings.locale',
'disco.settings.backlight',
];
for (let i = 1; i < tags.length; i++) {
await session.keyDown('ArrowDown');
assert.equal(await session.widget(tags[i]).isVisible(), true);
}
} finally {
await session.close();
}
});
test('hotkey roundtrip: s, f, i, b all change controller state', async () => {
const session = await launchDiscoSim({
cwd: process.cwd(),
automationHeadless: true,
});
try {
await session.keyDown('s');
assert.equal(await session.widget('disco.settings.audio').isVisible(), true);
await session.keyDown('Escape');
assert.equal(await session.widget('disco.settings.audio').isVisible(), false);
await session.keyDown('i');
assert.equal(await session.widget('disco.info.diagnostics').isVisible(), true);
await session.keyDown('Escape');
const beforeF = await iconStripSignature(session);
await session.keyDown('f');
const afterF = await iconStripSignature(session);
assert.notEqual(afterF, beforeF);
let stderr = '';
session.child.stderr.on('data', (chunk) => {
stderr += chunk;
});
await session.keyDown('b');
assert.match(stderr, /backlight request 100%/);
} finally {
await session.close();
}
});
test('framebuffer differs across main panels', async () => {
const session = await launchDiscoSim({
cwd: process.cwd(),
automationHeadless: true,
});
try {
const sigSettings = await iconStripSignature(session);
await session.keyDown('f');
const sigFiles = await iconStripSignature(session);
await session.keyDown('i');
const sigInfo = await iconStripSignature(session);
assert.notEqual(sigSettings, sigFiles, 'settings and files panels should differ');
assert.notEqual(sigFiles, sigInfo, 'files and info panels should differ');
} finally {
await session.close();
}
});