|
@@ -1,11 +1,13 @@
|
|
|
import ReactDOM from "react-dom";
|
|
|
import {
|
|
|
createPasteEvent,
|
|
|
+ fireEvent,
|
|
|
GlobalTestState,
|
|
|
render,
|
|
|
+ screen,
|
|
|
waitFor,
|
|
|
} from "./test-utils";
|
|
|
-import { UI, Pointer } from "./helpers/ui";
|
|
|
+import { UI, Pointer, Keyboard } from "./helpers/ui";
|
|
|
import { API } from "./helpers/api";
|
|
|
import { actionFlipHorizontal, actionFlipVertical } from "../actions";
|
|
|
import { getElementAbsoluteCoords } from "../element";
|
|
@@ -13,6 +15,7 @@ import {
|
|
|
ExcalidrawElement,
|
|
|
ExcalidrawImageElement,
|
|
|
ExcalidrawLinearElement,
|
|
|
+ ExcalidrawTextElementWithContainer,
|
|
|
FileId,
|
|
|
} from "../element/types";
|
|
|
import { newLinearElement } from "../element";
|
|
@@ -22,6 +25,8 @@ import { NormalizedZoomValue } from "../types";
|
|
|
import { ROUNDNESS } from "../constants";
|
|
|
import { vi } from "vitest";
|
|
|
import * as blob from "../data/blob";
|
|
|
+import { KEYS } from "../keys";
|
|
|
+import { getBoundTextElementPosition } from "../element/textElement";
|
|
|
|
|
|
const { h } = window;
|
|
|
const mouse = new Pointer("mouse");
|
|
@@ -812,3 +817,69 @@ describe("image", () => {
|
|
|
expect(h.elements[0].angle).toBeCloseTo(0);
|
|
|
});
|
|
|
});
|
|
|
+
|
|
|
+describe("mutliple elements", () => {
|
|
|
+ it("with bound text flip correctly", async () => {
|
|
|
+ UI.clickTool("arrow");
|
|
|
+ fireEvent.click(screen.getByTitle("Architect"));
|
|
|
+ const arrow = UI.createElement("arrow", {
|
|
|
+ x: 0,
|
|
|
+ y: 0,
|
|
|
+ width: 180,
|
|
|
+ height: 80,
|
|
|
+ });
|
|
|
+
|
|
|
+ Keyboard.keyPress(KEYS.ENTER);
|
|
|
+ let editor = document.querySelector<HTMLTextAreaElement>(
|
|
|
+ ".excalidraw-textEditorContainer > textarea",
|
|
|
+ )!;
|
|
|
+ fireEvent.input(editor, { target: { value: "arrow" } });
|
|
|
+ await new Promise((resolve) => setTimeout(resolve, 0));
|
|
|
+ Keyboard.keyPress(KEYS.ESCAPE);
|
|
|
+
|
|
|
+ const rectangle = UI.createElement("rectangle", {
|
|
|
+ x: 0,
|
|
|
+ y: 100,
|
|
|
+ width: 100,
|
|
|
+ height: 100,
|
|
|
+ });
|
|
|
+
|
|
|
+ Keyboard.keyPress(KEYS.ENTER);
|
|
|
+ editor = document.querySelector<HTMLTextAreaElement>(
|
|
|
+ ".excalidraw-textEditorContainer > textarea",
|
|
|
+ )!;
|
|
|
+ fireEvent.input(editor, { target: { value: "rect\ntext" } });
|
|
|
+ await new Promise((resolve) => setTimeout(resolve, 0));
|
|
|
+ Keyboard.keyPress(KEYS.ESCAPE);
|
|
|
+
|
|
|
+ mouse.select([arrow, rectangle]);
|
|
|
+ h.app.actionManager.executeAction(actionFlipHorizontal);
|
|
|
+ h.app.actionManager.executeAction(actionFlipVertical);
|
|
|
+
|
|
|
+ const arrowText = h.elements[1] as ExcalidrawTextElementWithContainer;
|
|
|
+ const arrowTextPos = getBoundTextElementPosition(arrow.get(), arrowText)!;
|
|
|
+ const rectText = h.elements[3] as ExcalidrawTextElementWithContainer;
|
|
|
+
|
|
|
+ expect(arrow.x).toBeCloseTo(180);
|
|
|
+ expect(arrow.y).toBeCloseTo(200);
|
|
|
+ expect(arrow.points[1][0]).toBeCloseTo(-180);
|
|
|
+ expect(arrow.points[1][1]).toBeCloseTo(-80);
|
|
|
+
|
|
|
+ expect(arrowTextPos.x - (arrow.x - arrow.width)).toBeCloseTo(
|
|
|
+ arrow.x - (arrowTextPos.x + arrowText.width),
|
|
|
+ );
|
|
|
+ expect(arrowTextPos.y - (arrow.y - arrow.height)).toBeCloseTo(
|
|
|
+ arrow.y - (arrowTextPos.y + arrowText.height),
|
|
|
+ );
|
|
|
+
|
|
|
+ expect(rectangle.x).toBeCloseTo(80);
|
|
|
+ expect(rectangle.y).toBeCloseTo(0);
|
|
|
+
|
|
|
+ expect(rectText.x - rectangle.x).toBeCloseTo(
|
|
|
+ rectangle.x + rectangle.width - (rectText.x + rectText.width),
|
|
|
+ );
|
|
|
+ expect(rectText.y - rectangle.y).toBeCloseTo(
|
|
|
+ rectangle.y + rectangle.height - (rectText.y + rectText.height),
|
|
|
+ );
|
|
|
+ });
|
|
|
+});
|