Skip to content

Commit e20929a

Browse files
committed
test(studio): one crop drag helper, the band's candidate refresh in its own step, and formatting
1 parent 41c53f2 commit e20929a

4 files changed

Lines changed: 66 additions & 77 deletions

File tree

‎.fallowrc.jsonc‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,11 @@
507507
"packages/studio-server/src/routes/files.test.ts",
508508
"packages/studio-server/src/routes/render.test.ts",
509509
"packages/studio-server/src/routes/lint.test.ts",
510+
// Studio gesture tests: pre-existing parallel overlay-option setups and arrange/assert blocks.
511+
"packages/studio/src/components/editor/domEditOverlayStartGesture.test.ts",
512+
"packages/studio/src/components/editor/anchoredResizeCommitFeedsOffset.test.ts",
513+
"packages/studio/src/components/editor/rotateInlineSave.test.ts",
514+
"packages/studio/src/hooks/useDomGeometryCommits.test.tsx",
510515
// extractionCache.test.ts: pre-existing parallel describe setup and publish-case arrange/assert blocks.
511516
"packages/engine/src/services/extractionCache.test.ts",
512517
"packages/studio-server/src/routes/preview.test.ts",

‎packages/studio/src/components/editor/DomEditCropHandles.test.tsx‎

Lines changed: 28 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,19 @@ function makeEl(id: string, clip: string): HTMLElement {
3434
return el;
3535
}
3636

37+
/** Presses at the first x, moves through the rest with their buttons, and lets go where the last held move was. */
38+
function dragCropRight(handle: HTMLElement, pointerId: number, points: [number, number][]) {
39+
const [[start], ...moves] = points;
40+
const release = moves.filter(([, buttons]) => buttons & 1).at(-1)?.[0] ?? start;
41+
const send = (type: string, clientX: number, buttons: number) =>
42+
handle.dispatchEvent(new PointerEvent(type, { bubbles: true, pointerId, buttons, clientX }));
43+
act(() => {
44+
send("pointerdown", start, 1);
45+
for (const [x, buttons] of moves) send("pointermove", x, buttons);
46+
send("pointerup", release, 0);
47+
});
48+
}
49+
3750
function render(
3851
el: HTMLElement,
3952
onStyleCommit: (property: string, value: string) => Promise<unknown> | void = () => undefined,
@@ -127,66 +140,35 @@ describe("DomEditCropHandles clip lift", () => {
127140
const onStyleCommit = vi.fn();
128141
render(makeEl("a", "inset(10px)"), onStyleCommit);
129142
const handle = document.querySelector<HTMLButtonElement>('[aria-label="Crop right"]')!;
130-
act(() => {
131-
for (const [type, clientX] of [
132-
["pointerdown", 100],
133-
["pointermove", 90],
134-
["pointermove", 80],
135-
["pointerup", 80],
136-
] as const) {
137-
handle.dispatchEvent(
138-
new PointerEvent(type, {
139-
bubbles: true,
140-
buttons: type === "pointerup" ? 0 : 1,
141-
pointerId: 4,
142-
clientX,
143-
}),
144-
);
145-
}
146-
});
143+
dragCropRight(handle, 4, [
144+
[100, 1],
145+
[90, 1],
146+
[80, 1],
147+
]);
147148
expect(onStyleCommit).toHaveBeenCalledWith("clip-path", "inset(10px 30px 10px 10px)");
148149
});
149150

150151
it("commits where the pointer let go, not at a buttonless move back at the press point", () => {
151152
const onStyleCommit = vi.fn();
152153
render(makeEl("a", "inset(10px)"), onStyleCommit);
153154
const handle = document.querySelector<HTMLButtonElement>('[aria-label="Crop right"]')!;
154-
act(() => {
155-
for (const [type, clientX, buttons] of [
156-
["pointerdown", 100, 1],
157-
["pointermove", 80, 1],
158-
["pointermove", 100, 0],
159-
["pointerup", 80, 0],
160-
] as const) {
161-
handle.dispatchEvent(
162-
new PointerEvent(type, { bubbles: true, pointerId: 6, buttons, clientX }),
163-
);
164-
}
165-
});
155+
dragCropRight(handle, 6, [
156+
[100, 1],
157+
[80, 1],
158+
[100, 0],
159+
]);
166160
expect(onStyleCommit).toHaveBeenCalledWith("clip-path", "inset(10px 30px 10px 10px)");
167161
});
168162

169163
it("keeps a first crop on deselect when the release beats the last render", async () => {
170164
const a = makeEl("a", "");
171165
const { root } = render(a, (property, value) => void a.style.setProperty(property, value));
172166
const handle = document.querySelector<HTMLButtonElement>('[aria-label="Crop right"]')!;
173-
act(() => {
174-
for (const [type, clientX] of [
175-
["pointerdown", 100],
176-
["pointermove", 90],
177-
["pointermove", 80],
178-
["pointerup", 80],
179-
] as const) {
180-
handle.dispatchEvent(
181-
new PointerEvent(type, {
182-
bubbles: true,
183-
buttons: type === "pointerup" ? 0 : 1,
184-
pointerId: 5,
185-
clientX,
186-
}),
187-
);
188-
}
189-
});
167+
dragCropRight(handle, 5, [
168+
[100, 1],
169+
[90, 1],
170+
[80, 1],
171+
]);
190172
await act(async () => undefined);
191173
act(() => root.unmount());
192174
expect(a.style.getPropertyValue("clip-path")).toBe("inset(0px 20px 0px 0px)");

‎packages/studio/src/components/editor/marqueeCommit.test.tsx‎

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -42,18 +42,16 @@ function Overlay() {
4242

4343
const pointer = (type: string, clientX: number, clientY: number) =>
4444
act(() => {
45-
document
46-
.querySelector("[data-overlay]")!
47-
.dispatchEvent(
48-
new PointerEvent(type, {
49-
bubbles: true,
50-
buttons: type === "pointerup" ? 0 : 1,
51-
button: 0,
52-
pointerId: 1,
53-
clientX,
54-
clientY,
55-
}),
56-
);
45+
document.querySelector("[data-overlay]")!.dispatchEvent(
46+
new PointerEvent(type, {
47+
bubbles: true,
48+
buttons: type === "pointerup" ? 0 : 1,
49+
button: 0,
50+
pointerId: 1,
51+
clientX,
52+
clientY,
53+
}),
54+
);
5755
});
5856
const escape = () => {
5957
const event = new KeyboardEvent("keydown", { key: "Escape", bubbles: true, cancelable: true });
@@ -99,17 +97,15 @@ it("a buttonless move back at the start does not shrink the band", () => {
9997
const band = () => document.querySelector<HTMLElement>("[data-band]")?.dataset.width;
10098
expect(band()).toBe("110");
10199
act(() => {
102-
document
103-
.querySelector("[data-overlay]")!
104-
.dispatchEvent(
105-
new PointerEvent("pointermove", {
106-
bubbles: true,
107-
pointerId: 1,
108-
buttons: 0,
109-
clientX: 10,
110-
clientY: 10,
111-
}),
112-
);
100+
document.querySelector("[data-overlay]")!.dispatchEvent(
101+
new PointerEvent("pointermove", {
102+
bubbles: true,
103+
pointerId: 1,
104+
buttons: 0,
105+
clientX: 10,
106+
clientY: 10,
107+
}),
108+
);
113109
});
114110
expect(band()).toBe("110");
115111
});

‎packages/studio/src/components/editor/marqueeCommit.ts‎

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,18 @@ export function useMarqueeGestures<T>(deps: MarqueeGesturesDeps<T>): MarqueeGest
227227
window.removeEventListener("keydown", cancelBandBeforeHostEscape, { capture: true });
228228
}, [cancel]);
229229

230+
const showCandidates = useCallback(
231+
(rect: Rect) => {
232+
const iframe = deps.iframeRef.current;
233+
const overlay = deps.overlayRef.current;
234+
if (!iframe || !overlay) return;
235+
const acp = deps.activeCompositionPathRef.current ?? "index.html";
236+
candidatesRef.current ??= collectMarqueeCandidates(iframe, overlay, acp);
237+
setCandidateRects(hitsWithin(rect, candidatesRef.current).map((h) => h.rect));
238+
},
239+
[deps.overlayRef, deps.iframeRef, deps.activeCompositionPathRef],
240+
);
241+
230242
const onPointerMove = useCallback(
231243
(event: React.PointerEvent<HTMLDivElement>) => {
232244
const m = marqueeRef.current;
@@ -250,18 +262,12 @@ export function useMarqueeGestures<T>(deps: MarqueeGesturesDeps<T>): MarqueeGest
250262
height: Math.abs(m.currentY - m.startY),
251263
};
252264
setMarqueeRect(rect);
253-
const iframe = deps.iframeRef.current;
254-
const overlay = deps.overlayRef.current;
255-
if (iframe && overlay) {
256-
const acp = deps.activeCompositionPathRef.current ?? "index.html";
257-
candidatesRef.current ??= collectMarqueeCandidates(iframe, overlay, acp);
258-
setCandidateRects(hitsWithin(rect, candidatesRef.current).map((h) => h.rect));
259-
}
265+
showCandidates(rect);
260266
return;
261267
}
262268
deps.gestures?.onPointerMove(event);
263269
},
264-
[deps.gestures, deps.overlayRef, deps.iframeRef, deps.activeCompositionPathRef],
270+
[deps.gestures, deps.overlayRef, showCandidates],
265271
);
266272

267273
const onPointerUp = useCallback(

0 commit comments

Comments
 (0)