mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-29 03:09:36 +00:00
test: cover live viewport effects matrix (#579)
Issue: #579 User-Visible: no
This commit is contained in:
@@ -47,6 +47,7 @@ const liveState = () => page.evaluate(() => {
|
|||||||
const rect = node?.getBoundingClientRect();
|
const rect = node?.getBoundingClientRect();
|
||||||
return rect ? [rect.left + rect.width / 2, rect.top + rect.height / 2] : null;
|
return rect ? [rect.left + rect.width / 2, rect.top + rect.height / 2] : null;
|
||||||
};
|
};
|
||||||
|
const stage = root.querySelector('.stage');
|
||||||
return {
|
return {
|
||||||
view: structuredClone(card._view),
|
view: structuredClone(card._view),
|
||||||
transformed: scenes.filter((node) => node.style.transform).length,
|
transformed: scenes.filter((node) => node.style.transform).length,
|
||||||
@@ -60,6 +61,14 @@ const liveState = () => page.evaluate(() => {
|
|||||||
&& !node.style.transform && !node.style.transformOrigin && !node.style.willChange),
|
&& !node.style.transform && !node.style.transformOrigin && !node.style.willChange),
|
||||||
marker: centre(root.querySelector('[data-hp="device"]')),
|
marker: centre(root.querySelector('[data-hp="device"]')),
|
||||||
room: centre(root.querySelector('[data-hp="room"]')),
|
room: centre(root.querySelector('[data-hp="room"]')),
|
||||||
|
effects: {
|
||||||
|
dayCycle: !!root.querySelector('.hp-day-cycle-env .hp-day-cycle-bg.active'),
|
||||||
|
glowBases: root.querySelectorAll('.glow-base-layer .glow-base').length,
|
||||||
|
glowPools: root.querySelectorAll('.glowlayer circle, .glow-pool').length,
|
||||||
|
roomFills: root.querySelectorAll('.room.filled').length,
|
||||||
|
hatchedWalls: root.querySelectorAll('.wallbody:not(.solid)[fill^="url("]').length,
|
||||||
|
customBackground: (stage?.getAttribute('style') || '').includes('#123456'),
|
||||||
|
},
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -149,7 +158,32 @@ const dispatchTouch = (type, id, x, y, buttons = type === 'pointerup' ? 0 : 1) =
|
|||||||
{ type, id, x, y, buttons },
|
{ type, id, x, y, buttons },
|
||||||
);
|
);
|
||||||
|
|
||||||
const runPan = async ({ name, kind, dx, dy, edge, parity = false }) => {
|
const configureEffectMatrix = ({ dayCycle, glow }) => page.evaluate(async (variant) => {
|
||||||
|
const card = document.querySelector('houseplan-card');
|
||||||
|
const config = structuredClone(card._serverCfg);
|
||||||
|
const space = config.spaces.find((item) => item.id === card._space) || config.spaces[0];
|
||||||
|
config.settings = {
|
||||||
|
...(config.settings || {}),
|
||||||
|
bg_color: '#123456',
|
||||||
|
bg_mode: variant.dayCycle ? 'daynight' : 'static',
|
||||||
|
};
|
||||||
|
space.settings = {
|
||||||
|
...(space.settings || {}),
|
||||||
|
bg_color: '#123456',
|
||||||
|
bg_mode: variant.dayCycle ? 'daynight' : 'static',
|
||||||
|
fill_mode: 'custom',
|
||||||
|
custom_fill: { c: '#d02020', a: 1 },
|
||||||
|
glow_enabled: variant.glow,
|
||||||
|
show_borders: true,
|
||||||
|
};
|
||||||
|
card._serverCfg = config;
|
||||||
|
card._cfgEpoch++;
|
||||||
|
card.requestUpdate();
|
||||||
|
await card.updateComplete;
|
||||||
|
await new Promise((done) => setTimeout(done, 250));
|
||||||
|
}, { dayCycle, glow });
|
||||||
|
|
||||||
|
const runPan = async ({ name, kind, dx, dy, edge, parity = false, effects = null }) => {
|
||||||
await resetCamera();
|
await resetCamera();
|
||||||
await preparePointerCapture();
|
await preparePointerCapture();
|
||||||
const origin = await pointerCentre();
|
const origin = await pointerCentre();
|
||||||
@@ -201,6 +235,8 @@ const runPan = async ({ name, kind, dx, dy, edge, parity = false }) => {
|
|||||||
promotedHeld: heldState.allScenePromoted,
|
promotedHeld: heldState.allScenePromoted,
|
||||||
targetStableWhileHeld: JSON.stringify(immediateState.view) === JSON.stringify(heldState.view),
|
targetStableWhileHeld: JSON.stringify(immediateState.view) === JSON.stringify(heldState.view),
|
||||||
temporaryStylesCleared: settledState.allTemporaryStylesCleared,
|
temporaryStylesCleared: settledState.allTemporaryStylesCleared,
|
||||||
|
effectsImmediate: immediateState.effects,
|
||||||
|
effectsHeld: heldState.effects,
|
||||||
parityPx,
|
parityPx,
|
||||||
};
|
};
|
||||||
checks[`${name}ImmediateCoverage`] = immediateCoverage.sameSize
|
checks[`${name}ImmediateCoverage`] = immediateCoverage.sameSize
|
||||||
@@ -211,6 +247,16 @@ const runPan = async ({ name, kind, dx, dy, edge, parity = false }) => {
|
|||||||
&& heldState.allScenePromoted
|
&& heldState.allScenePromoted
|
||||||
&& settledState.allTemporaryStylesCleared;
|
&& settledState.allTemporaryStylesCleared;
|
||||||
checks[`${name}TargetStableWhileHeld`] = diagnostics[name].targetStableWhileHeld;
|
checks[`${name}TargetStableWhileHeld`] = diagnostics[name].targetStableWhileHeld;
|
||||||
|
if (effects) {
|
||||||
|
const expected = (sample) => sample.roomFills > 0 && sample.hatchedWalls > 0
|
||||||
|
&& sample.customBackground
|
||||||
|
&& sample.dayCycle === effects.dayCycle
|
||||||
|
&& (effects.glow
|
||||||
|
? sample.glowPools > 0
|
||||||
|
: sample.glowPools === 0);
|
||||||
|
checks[`${name}EffectsVisible`] = expected(immediateState.effects)
|
||||||
|
&& expected(heldState.effects);
|
||||||
|
}
|
||||||
if (parity) checks[`${name}MarkerParity`] = parityPx !== null && parityPx <= 1;
|
if (parity) checks[`${name}MarkerParity`] = parityPx !== null && parityPx <= 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -348,15 +394,33 @@ await page.evaluate(async () => {
|
|||||||
const card = window.__card;
|
const card = window.__card;
|
||||||
const config = structuredClone(card._serverCfg);
|
const config = structuredClone(card._serverCfg);
|
||||||
const space = config.spaces.find((item) => item.id === card._space) || config.spaces[0];
|
const space = config.spaces.find((item) => item.id === card._space) || config.spaces[0];
|
||||||
|
const poly = [[0, 0], [1, 0], [1, 1], [0, 1]];
|
||||||
space.rooms = [{
|
space.rooms = [{
|
||||||
id: 'coverage-room',
|
id: 'coverage-room',
|
||||||
name: 'Coverage room',
|
name: 'Coverage room',
|
||||||
poly: [[0, 0], [1, 0], [1, 1], [0, 1]],
|
poly,
|
||||||
fill_mode: 'custom',
|
fill_mode: 'custom',
|
||||||
fill_color: '#d02020',
|
fill_color: '#d02020',
|
||||||
fill_opacity: 1,
|
fill_opacity: 1,
|
||||||
}];
|
}];
|
||||||
space.settings = { ...(space.settings || {}), show_borders: true };
|
space.walls = poly.map((a, index) => ({
|
||||||
|
key: `coverage-wall-${index}`,
|
||||||
|
a,
|
||||||
|
b: poly[(index + 1) % poly.length],
|
||||||
|
cm: 15,
|
||||||
|
}));
|
||||||
|
config.settings = {
|
||||||
|
...(config.settings || {}), bg_color: '#123456', bg_mode: 'static',
|
||||||
|
};
|
||||||
|
space.settings = {
|
||||||
|
...(space.settings || {}),
|
||||||
|
bg_color: '#123456',
|
||||||
|
bg_mode: 'static',
|
||||||
|
fill_mode: 'custom',
|
||||||
|
custom_fill: { c: '#d02020', a: 1 },
|
||||||
|
glow_enabled: false,
|
||||||
|
show_borders: true,
|
||||||
|
};
|
||||||
card._serverCfg = config;
|
card._serverCfg = config;
|
||||||
card._space = space.id;
|
card._space = space.id;
|
||||||
card.requestUpdate();
|
card.requestUpdate();
|
||||||
@@ -372,6 +436,19 @@ await runPan({ name: 'flatTouchRightEdge', kind: 'touch', dx: -65, dy: 0, edge:
|
|||||||
await runTouchZoomOut({ name: 'flatTouchZoomOut' });
|
await runTouchZoomOut({ name: 'flatTouchZoomOut' });
|
||||||
await runStablePromotion();
|
await runStablePromotion();
|
||||||
|
|
||||||
|
// #579 AC4: every combination keeps the same expensive scene effects alive
|
||||||
|
// in both the immediate and held compositor frames. The custom fill, wall
|
||||||
|
// hatch and user background stay on in all four rows of the matrix.
|
||||||
|
for (const dayCycle of [false, true]) {
|
||||||
|
for (const glow of [false, true]) {
|
||||||
|
await configureEffectMatrix({ dayCycle, glow });
|
||||||
|
await runPan({
|
||||||
|
name: `effectsDay${Number(dayCycle)}Glow${Number(glow)}`,
|
||||||
|
kind: 'touch', dx: -65, dy: 0, edge: 'right', effects: { dayCycle, glow },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
await page.evaluate(async () => {
|
await page.evaluate(async () => {
|
||||||
history.replaceState(null, '', '?hp_alpha=1#space=f1');
|
history.replaceState(null, '', '?hp_alpha=1#space=f1');
|
||||||
dispatchEvent(new HashChangeEvent('hashchange'));
|
dispatchEvent(new HashChangeEvent('hashchange'));
|
||||||
|
|||||||
Reference in New Issue
Block a user