81 lines
3.4 KiB
TypeScript
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 })
|
|
})
|