import assert from 'node:assert/strict' import { test } from 'node:test' import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises' import { tmpdir } from 'node:os' import { join } from 'node:path' import { WindowSettings, fitControlBounds, parseWindowPreferences, preferredDisplayId, } from './window-settings.js' const primary = { x: -1920, y: -200, width: 1920, height: 1080 } test('пульт возвращается с отключённого монитора и помещается в рабочую область основного', () => { const bounds = fitControlBounds({ x: 5000, y: -5000, width: 3840, height: 2160 }, primary) assert.deepEqual(bounds, primary) assert.deepEqual(fitControlBounds(undefined, { x: 100, y: 50, width: 500, height: 300 }), { x: 100, y: 50, width: 500, height: 300, }) const saved = { x: -1800, y: 0, width: 1000, height: 800 } assert.deepEqual(fitControlBounds(saved, primary), saved) const centered = fitControlBounds(undefined, primary) assert.equal(centered.x, -1460) assert.equal(centered.y, -60) }) test('внешний дисплей предвыбирается только при совпадении ID и названия', () => { const saved = { id: 2, label: 'Projector' } const displays = [{ id: 1, label: 'Laptop' }, saved] assert.equal(preferredDisplayId(saved, displays, 1), 2) assert.equal(preferredDisplayId(saved, displays, 2), null) assert.equal(preferredDisplayId(saved, [{ id: 2, label: 'Other' }], 1), null) assert.equal(preferredDisplayId(saved, [{ id: 3, label: 'Projector' }], 1), null) assert.equal(preferredDisplayId(saved, [], 1), null) }) test('проверяет локальный файл настроек и не принимает повреждённую геометрию', () => { const valid = { version: 1, control: { bounds: primary, maximized: true }, display: { id: -2, label: 'Экран' }, } assert.equal(parseWindowPreferences(valid).control?.maximized, true) for (const bad of [ null, {}, { ...valid, version: 2 }, { ...valid, control: { bounds: { ...primary, width: 0 }, maximized: true } }, { ...valid, control: { bounds: primary, maximized: 'true' } }, { ...valid, display: { id: 2.5, label: 'Other' } }, ]) assert.throws(() => parseWindowPreferences(bad)) }) test('последняя геометрия и выбор дисплея сохраняются атомарно, ошибочный файл не мешает запуску', async (t) => { const dir = await mkdtemp(join(tmpdir(), 'screen-windows-')) t.after(() => rm(dir, { recursive: true, force: true })) const path = join(dir, 'windows.json') const store = new WindowSettings(path) await store.load() assert.deepEqual(store.value, { control: null, display: null }) store.value = { control: { bounds: primary, maximized: true }, display: { id: 2, label: 'Projector' }, } store.save() store.value.control!.bounds = { ...primary, width: 800 } store.save() const restored = new WindowSettings(path) await restored.load() assert.deepEqual(restored.value, store.value) assert.equal(JSON.parse(await readFile(path, 'utf8')).version, 1) await writeFile(path, '{bad') const broken = new WindowSettings(path) await assert.rejects(broken.load(), /повреждены/) assert.deepEqual(broken.value, { control: null, display: null }) })