Files
evening_detective_screen/electron/window-settings.test.ts
T
2026-10-17 20:57:16 +07:00

81 lines
3.4 KiB
TypeScript

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 })
})