3 changed files with 141 additions and 10 deletions
@ -0,0 +1,128 @@ |
|||||||
|
import { |
||||||
|
convertToExcalidrawElements, |
||||||
|
Excalidraw, |
||||||
|
} from "./packages/excalidraw/index"; |
||||||
|
import { API } from "./tests/helpers/api"; |
||||||
|
import { Pointer } from "./tests/helpers/ui"; |
||||||
|
import { render } from "./tests/test-utils"; |
||||||
|
|
||||||
|
const { h } = window; |
||||||
|
const mouse = new Pointer("mouse"); |
||||||
|
|
||||||
|
describe("adding elements to frames", () => { |
||||||
|
type ElementType = string; |
||||||
|
const assertOrder = ( |
||||||
|
els: readonly { type: ElementType }[], |
||||||
|
order: ElementType[], |
||||||
|
) => { |
||||||
|
expect(els.map((el) => el.type)).toEqual(order); |
||||||
|
}; |
||||||
|
|
||||||
|
const reorderElements = <T extends { type: ElementType }>( |
||||||
|
els: readonly T[], |
||||||
|
order: ElementType[], |
||||||
|
) => { |
||||||
|
return order.reduce((acc: T[], el) => { |
||||||
|
acc.push(els.find((e) => e.type === el)!); |
||||||
|
return acc; |
||||||
|
}, []); |
||||||
|
}; |
||||||
|
|
||||||
|
describe("resizing frame over elements", () => { |
||||||
|
const testElements = async ( |
||||||
|
containerType: "arrow" | "rectangle", |
||||||
|
initialOrder: ElementType[], |
||||||
|
expectedOrder: ElementType[], |
||||||
|
) => { |
||||||
|
await render(<Excalidraw />); |
||||||
|
|
||||||
|
const frame = API.createElement({ type: "frame", x: 0, y: 0 }); |
||||||
|
|
||||||
|
h.elements = reorderElements( |
||||||
|
[ |
||||||
|
frame, |
||||||
|
...convertToExcalidrawElements([ |
||||||
|
{ |
||||||
|
type: containerType, |
||||||
|
x: 100, |
||||||
|
y: 100, |
||||||
|
height: 10, |
||||||
|
label: { text: "xx" }, |
||||||
|
}, |
||||||
|
]), |
||||||
|
], |
||||||
|
initialOrder, |
||||||
|
); |
||||||
|
|
||||||
|
assertOrder(h.elements, initialOrder); |
||||||
|
|
||||||
|
expect(h.elements[1].frameId).toBe(null); |
||||||
|
expect(h.elements[2].frameId).toBe(null); |
||||||
|
|
||||||
|
const container = h.elements[1]; |
||||||
|
|
||||||
|
mouse.clickAt(0, 0); |
||||||
|
mouse.downAt(frame.x + frame.width, frame.y + frame.height); |
||||||
|
mouse.moveTo( |
||||||
|
container.x + container.width + 100, |
||||||
|
container.y + container.height + 100, |
||||||
|
); |
||||||
|
mouse.up(); |
||||||
|
assertOrder(h.elements, expectedOrder); |
||||||
|
|
||||||
|
expect(h.elements[0].frameId).toBe(frame.id); |
||||||
|
expect(h.elements[1].frameId).toBe(frame.id); |
||||||
|
}; |
||||||
|
|
||||||
|
it("resizing over text containers / labelled arrows", async () => { |
||||||
|
await testElements( |
||||||
|
"rectangle", |
||||||
|
["frame", "rectangle", "text"], |
||||||
|
["rectangle", "text", "frame"], |
||||||
|
); |
||||||
|
await testElements( |
||||||
|
"rectangle", |
||||||
|
["frame", "text", "rectangle"], |
||||||
|
["rectangle", "text", "frame"], |
||||||
|
); |
||||||
|
await testElements( |
||||||
|
"rectangle", |
||||||
|
["rectangle", "text", "frame"], |
||||||
|
["rectangle", "text", "frame"], |
||||||
|
); |
||||||
|
await testElements( |
||||||
|
"rectangle", |
||||||
|
["text", "rectangle", "frame"], |
||||||
|
["text", "rectangle", "frame"], |
||||||
|
); |
||||||
|
|
||||||
|
await testElements( |
||||||
|
"arrow", |
||||||
|
["frame", "arrow", "text"], |
||||||
|
["arrow", "text", "frame"], |
||||||
|
); |
||||||
|
await testElements( |
||||||
|
"arrow", |
||||||
|
["text", "arrow", "frame"], |
||||||
|
["text", "arrow", "frame"], |
||||||
|
); |
||||||
|
|
||||||
|
// FIXME failing in tests (it fails to add elements to frame for some
|
||||||
|
// reason) but works in browser. (╯°□°)╯︵ ┻━┻
|
||||||
|
//
|
||||||
|
// Looks like the `getElementsCompletelyInFrame()` doesn't work
|
||||||
|
// in these cases.
|
||||||
|
//
|
||||||
|
// await testElements(
|
||||||
|
// "arrow",
|
||||||
|
// ["arrow", "text", "frame"],
|
||||||
|
// ["arrow", "text", "frame"],
|
||||||
|
// );
|
||||||
|
// await testElements(
|
||||||
|
// "arrow",
|
||||||
|
// ["frame", "text", "arrow"],
|
||||||
|
// ["text", "arrow", "frame"],
|
||||||
|
// );
|
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
Loading…
Reference in new issue