@@ -114,6 +114,20 @@ async function mouseClickObjectVectorLogicalPoint(page, x, y, options = {}) {
114114 await page.mouse.click(point.x, point.y, options);
115115}
116116
117+ async function doubleClickObjectVectorLogicalPoint(page, x, y) {
118+ const point = await objectVectorLogicalClientPoint(page, x, y);
119+ await page.evaluate((clientPoint) => {
120+ const surface = document.querySelector("#objectVectorStudioV2RenderSurface");
121+ surface.dispatchEvent(new MouseEvent("dblclick", {
122+ bubbles: true,
123+ button: 0,
124+ cancelable: true,
125+ clientX: clientPoint.x,
126+ clientY: clientPoint.y
127+ }));
128+ }, point);
129+ }
130+
117131async function dragObjectVectorLogicalPoints(page, start, end) {
118132 const startPoint = await objectVectorLogicalClientPoint(page, start.x, start.y);
119133 const endPoint = await objectVectorLogicalClientPoint(page, end.x, end.y);
@@ -3487,30 +3501,52 @@ test.describe("Workspace Manager V2 bootstrap", () => {
34873501 await page.locator('[data-shape-tool="polygon"]').click();
34883502 await expect(page.locator("#statusLog")).toHaveValue(/OK Drawing mode selected: Polygon\. Click to add points\.\n\nDouble-click to finish\./);
34893503 await moveObjectVectorLogicalPoint(page, { x: -30, y: -20 });
3490- await expect(page.locator("#objectVectorStudioV2RenderSurface .object-vector-studio-v2__drawing-hint")).toHaveText("Double-click / Enter to complete");
3491- const polygonHintState = await page.locator("#objectVectorStudioV2RenderSurface .object-vector-studio-v2__drawing-hint").evaluate((hint) => {
3492- const text = hint.querySelector("text");
3504+ await expect(page.locator("#objectVectorStudioV2WorkArea .object-vector-studio-v2__drawing-hint")).toHaveText("Double-click / Enter to complete");
3505+ const polygonHintState = await page.locator("#objectVectorStudioV2WorkArea .object-vector-studio-v2__drawing-hint").evaluate((hint) => {
34933506 const app = window.__objectVectorStudioV2App;
3507+ const rect = hint.getBoundingClientRect();
34943508 return {
3495- hintX: Number(text.getAttribute("x")),
3496- hintY: Number(text.getAttribute("y")),
3509+ fontSize: getComputedStyle(hint).fontSize,
3510+ height: Math.round(rect.height),
3511+ hintX: Math.round(rect.left),
3512+ hintY: Math.round(rect.top),
34973513 pointerEvents: getComputedStyle(hint).pointerEvents,
3498- pointerX: app.drawingPreviewPoint.x * 10,
3499- pointerY: app.drawingPreviewPoint.y * 10,
3500- textPointerEvents: getComputedStyle(text).pointerEvents
3514+ pointerX: Math.round(app.drawingHintClientPoint.x),
3515+ pointerY: Math.round(app.drawingHintClientPoint.y)
35013516 };
35023517 });
35033518 expect(polygonHintState.pointerEvents).toBe("none");
3504- expect(polygonHintState.textPointerEvents).toBe("none");
35053519 expect(polygonHintState.hintX).toBeGreaterThan(polygonHintState.pointerX);
35063520 expect(polygonHintState.hintY).toBeGreaterThan(polygonHintState.pointerY);
35073521 await moveObjectVectorLogicalPoint(page, { x: -25, y: -15 });
3508- const movedPolygonHint = await page.locator("#objectVectorStudioV2RenderSurface .object-vector-studio-v2__drawing-hint text ").evaluate((text ) => ({
3509- x: Number(text.getAttribute("x") ),
3510- y: Number(text.getAttribute("y") )
3522+ const movedPolygonHint = await page.locator("#objectVectorStudioV2WorkArea .object-vector-studio-v2__drawing-hint").evaluate((hint ) => ({
3523+ x: Math.round(hint.getBoundingClientRect().left ),
3524+ y: Math.round(hint.getBoundingClientRect().top )
35113525 }));
35123526 expect(movedPolygonHint.x).toBeGreaterThan(polygonHintState.hintX);
35133527 expect(movedPolygonHint.y).toBeGreaterThan(polygonHintState.hintY);
3528+ const zoomHintStates = await page.locator("#objectVectorStudioV2WorkArea .object-vector-studio-v2__drawing-hint").evaluate((hint) => {
3529+ const app = window.__objectVectorStudioV2App;
3530+ const collect = (zoom) => {
3531+ app.viewport.zoom = zoom;
3532+ app.updateViewport();
3533+ app.renderWorkSurface();
3534+ const nextHint = document.querySelector("#objectVectorStudioV2WorkArea .object-vector-studio-v2__drawing-hint");
3535+ const rect = nextHint.getBoundingClientRect();
3536+ return {
3537+ fontSize: getComputedStyle(nextHint).fontSize,
3538+ height: Math.round(rect.height),
3539+ zoom
3540+ };
3541+ };
3542+ const states = [collect(0.1), collect(0.3), collect(0.05)];
3543+ app.viewport.zoom = 0.1;
3544+ app.updateViewport();
3545+ app.renderWorkSurface();
3546+ return states;
3547+ });
3548+ expect(zoomHintStates.map((state) => state.fontSize)).toEqual(["12px", "12px", "12px"]);
3549+ expect(new Set(zoomHintStates.map((state) => state.height)).size).toBe(1);
35143550 await page.locator('[data-shape-tool="polyline"]').click();
35153551 await expect(page.locator("#statusLog")).toHaveValue(/OK Drawing mode selected: Polyline\. Click to add points\.\n\nDouble-click to finish\./);
35163552 await page.locator('[data-shape-tool="rectangle"]').click();
@@ -3688,19 +3724,21 @@ test.describe("Workspace Manager V2 bootstrap", () => {
36883724 await clickObjectVectorLogicalPoint(page, 70, 60);
36893725 await moveObjectVectorLogicalPoint(page, { x: 76, y: 66 });
36903726 const textPreview = await page.locator("#objectVectorStudioV2RenderSurface text.object-vector-studio-v2__drawing-preview").evaluate((preview) => ({
3691- fill: preview.style.fill || preview.getAttribute("fill"),
3692- stroke: preview.style.stroke,
3693- strokeWidth: preview.style.strokeWidth,
3727+ dash: preview.style.strokeDasharray,
3728+ fill: preview.getAttribute("fill"),
3729+ stroke: preview.getAttribute("stroke"),
3730+ strokeWidth: Number(preview.getAttribute("stroke-width")),
36943731 text: preview.textContent.trim(),
36953732 tool: preview.dataset.drawingPreviewTool
36963733 }));
3697- expect(textPreview.fill).toMatch(/#6fd3ff|rgb\(111, 211, 255\)/);
3698- expect(textPreview).toMatchObject({
3699- stroke: "none",
3734+ expect(textPreview).toEqual({
3735+ dash: "none",
3736+ fill: "#00000000",
3737+ stroke: "#6fd3ff",
3738+ strokeWidth: 20,
37003739 text: "Text",
37013740 tool: "text"
37023741 });
3703- expect(["0", "0px"]).toContain(textPreview.strokeWidth);
37043742 await clickObjectVectorLogicalPoint(page, 76, 66);
37053743 const committedTextStyle = await page.evaluate(() => ({ ...window.__objectVectorStudioV2App.selectedShape().style }));
37063744 expect(committedTextStyle).toMatchObject({
@@ -3710,6 +3748,16 @@ test.describe("Workspace Manager V2 bootstrap", () => {
37103748 strokeWidth: 20
37113749 });
37123750
3751+ const shapeCountBeforeDoubleClick = await page.evaluate(() => window.__objectVectorStudioV2App.selectedObject().shapes.length);
3752+ await page.locator('[data-shape-tool="polygon"]').click();
3753+ await clickObjectVectorLogicalPoint(page, 80, -40);
3754+ await clickObjectVectorLogicalPoint(page, 95, -40);
3755+ await clickObjectVectorLogicalPoint(page, 95, -25);
3756+ await clickObjectVectorLogicalPoint(page, 80, -25);
3757+ await doubleClickObjectVectorLogicalPoint(page, 80, -25);
3758+ await expect.poll(async () => page.evaluate(() => window.__objectVectorStudioV2App.selectedObject().shapes.length)).toBe(shapeCountBeforeDoubleClick + 1);
3759+ await expect(page.locator("#statusLog")).toHaveValue(/OK Created polygon shape on Drawing Flow from double-click\./);
3760+
37133761 expect(pageErrors).toEqual([]);
37143762 expect(consoleErrors).toEqual([]);
37153763 } finally {
0 commit comments