mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-29 03:09:36 +00:00
70 lines
4.0 KiB
JavaScript
70 lines
4.0 KiB
JavaScript
import { launch, checkAll, finish } from './serve.mjs';
|
|
const { page, browser } = await launch();
|
|
const res = await page.evaluate(async () => {
|
|
const out = {};
|
|
const c = window.__card;
|
|
const sr = () => c.shadowRoot || c.renderRoot;
|
|
c._setMode('plan'); await c.updateComplete;
|
|
const stage = sr().querySelector('.stage');
|
|
const label = sr().querySelector('.roomlabel');
|
|
out.hasLabel = !!label;
|
|
// 1) draw: клик по карточке не добавляет точку
|
|
c._tool = 'draw'; c._path = []; await c.updateComplete;
|
|
label.dispatchEvent(new MouseEvent('click', { bubbles: true, composed: true, clientX: 10, clientY: 10 }));
|
|
await c.updateComplete;
|
|
out.drawIgnored = c._path.length === 0;
|
|
// 2) клик по угловой метке тоже не считается кликом инструмента
|
|
const handle = label.querySelector('.rlhandle');
|
|
handle.dispatchEvent(new MouseEvent('click', { bubbles: true, composed: true, clientX: 10, clientY: 10 }));
|
|
await c.updateComplete;
|
|
out.handleIgnored = c._path.length === 0;
|
|
// 3) во время резайза клики по сцене игнорируются
|
|
const room = c._spaceModel().rooms.find((r) => r.name);
|
|
c._rlResize = { id: 'rl_' + room.id, space: c._space, k0: 1, cx: 0, cy: 0, d0: 50 };
|
|
const before = c._path.length;
|
|
c._markupClick(new MouseEvent('click', { bubbles: true, clientX: 200, clientY: 200 }));
|
|
out.duringResizeIgnored = c._path.length === before;
|
|
c._rlResize = null;
|
|
// 4) обычный клик по сцене (мимо карточки) по-прежнему работает — точка ставится
|
|
const r = stage.getBoundingClientRect();
|
|
// найти долю экрана, попадающую в свободное место (не внутри комнаты)
|
|
let fx = 0.4, fy = 0.4;
|
|
outer: for (let ix = 1; ix < 20; ix++) for (let iy = 1; iy < 20; iy++) {
|
|
const ev = new MouseEvent('click', { clientX: r.left + r.width * ix / 20, clientY: r.top + r.height * iy / 20 });
|
|
const raw = c._svgPoint(ev);
|
|
if (!c._roomAt(c._snap(raw))) { fx = ix / 20; fy = iy / 20; break outer; }
|
|
}
|
|
stage.dispatchEvent(new MouseEvent('click', { bubbles: true, composed: true,
|
|
clientX: r.left + r.width * fx, clientY: r.top + r.height * fy }));
|
|
await c.updateComplete;
|
|
out.normalClickWorks = c._path.length === 1;
|
|
// 5) delroom: клик по карточке устройства не заводит удаление комнаты.
|
|
// Раньше здесь подменялся window.confirm; #228 заменил его собственным
|
|
// диалогом карточки, и проверка стала невыполнимой в обе стороны — confirm
|
|
// теперь не звонит никто. Признак — открытый диалог.
|
|
c._tool = 'delroom'; c._path = []; c._roomDeleteDialog = null; await c.updateComplete;
|
|
label.dispatchEvent(new MouseEvent('click', { bubbles: true, composed: true, clientX: 10, clientY: 10 }));
|
|
await c.updateComplete;
|
|
out.delroomIgnored = c._roomDeleteDialog === null;
|
|
// 6) Delete has exactly one semantic result: the clicked room disappears;
|
|
// it never closes a virtual boundary or merges a neighbour into it.
|
|
const roomCount = c._curSpaceCfg.rooms.length;
|
|
const deleteId = room.id;
|
|
c._deleteRoomClick(c._roomCenter(room));
|
|
await c.updateComplete;
|
|
// Клик по комнате только спрашивает; удаляет ответ на вопрос (#228).
|
|
out.deleteAsksFirst = c._roomDeleteDialog?.roomId === deleteId;
|
|
c._confirmRoomDelete(false);
|
|
await c.updateComplete;
|
|
out.deleteOnlyClickedRoom = c._curSpaceCfg.rooms.length === roomCount - 1
|
|
&& !c._curSpaceCfg.rooms.some((x) => x.id === deleteId);
|
|
out.deleteClosesDialog = c._roomDeleteDialog === null;
|
|
c._undoGeometry();
|
|
await c.updateComplete;
|
|
out.deleteUndoRestoresRoom = c._curSpaceCfg.rooms.length === roomCount
|
|
&& c._curSpaceCfg.rooms.some((x) => x.id === deleteId);
|
|
return out;
|
|
});
|
|
checkAll(res);
|
|
await finish(browser, res);
|