multiPointCreate.test.tsx 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. import ReactDOM from "react-dom";
  2. import {
  3. render,
  4. fireEvent,
  5. mockBoundingClientRect,
  6. restoreOriginalGetBoundingClientRect,
  7. } from "./test-utils";
  8. import ExcalidrawApp from "../excalidraw-app";
  9. import * as Renderer from "../renderer/renderScene";
  10. import { KEYS } from "../keys";
  11. import { ExcalidrawLinearElement } from "../element/types";
  12. import { reseed } from "../random";
  13. // Unmount ReactDOM from root
  14. ReactDOM.unmountComponentAtNode(document.getElementById("root")!);
  15. const renderScene = jest.spyOn(Renderer, "renderScene");
  16. beforeEach(() => {
  17. localStorage.clear();
  18. renderScene.mockClear();
  19. reseed(7);
  20. });
  21. const { h } = window;
  22. describe("remove shape in non linear elements", () => {
  23. beforeAll(() => {
  24. mockBoundingClientRect();
  25. });
  26. afterAll(() => {
  27. restoreOriginalGetBoundingClientRect();
  28. });
  29. it("rectangle", async () => {
  30. const { getByToolName, container } = await render(<ExcalidrawApp />);
  31. // select tool
  32. const tool = getByToolName("rectangle");
  33. fireEvent.click(tool);
  34. const canvas = container.querySelector("canvas")!;
  35. fireEvent.pointerDown(canvas, { clientX: 30, clientY: 20 });
  36. fireEvent.pointerUp(canvas, { clientX: 30, clientY: 30 });
  37. expect(renderScene).toHaveBeenCalledTimes(7);
  38. expect(h.elements.length).toEqual(0);
  39. });
  40. it("ellipse", async () => {
  41. const { getByToolName, container } = await render(<ExcalidrawApp />);
  42. // select tool
  43. const tool = getByToolName("ellipse");
  44. fireEvent.click(tool);
  45. const canvas = container.querySelector("canvas")!;
  46. fireEvent.pointerDown(canvas, { clientX: 30, clientY: 20 });
  47. fireEvent.pointerUp(canvas, { clientX: 30, clientY: 30 });
  48. expect(renderScene).toHaveBeenCalledTimes(7);
  49. expect(h.elements.length).toEqual(0);
  50. });
  51. it("diamond", async () => {
  52. const { getByToolName, container } = await render(<ExcalidrawApp />);
  53. // select tool
  54. const tool = getByToolName("diamond");
  55. fireEvent.click(tool);
  56. const canvas = container.querySelector("canvas")!;
  57. fireEvent.pointerDown(canvas, { clientX: 30, clientY: 20 });
  58. fireEvent.pointerUp(canvas, { clientX: 30, clientY: 30 });
  59. expect(renderScene).toHaveBeenCalledTimes(7);
  60. expect(h.elements.length).toEqual(0);
  61. });
  62. });
  63. describe("multi point mode in linear elements", () => {
  64. it("arrow", async () => {
  65. const { getByToolName, container } = await render(<ExcalidrawApp />);
  66. // select tool
  67. const tool = getByToolName("arrow");
  68. fireEvent.click(tool);
  69. const canvas = container.querySelector("canvas")!;
  70. // first point is added on pointer down
  71. fireEvent.pointerDown(canvas, { clientX: 30, clientY: 30 });
  72. // second point, enable multi point
  73. fireEvent.pointerUp(canvas, { clientX: 30, clientY: 30 });
  74. fireEvent.pointerMove(canvas, { clientX: 50, clientY: 60 });
  75. // third point
  76. fireEvent.pointerDown(canvas, { clientX: 50, clientY: 60 });
  77. fireEvent.pointerUp(canvas);
  78. fireEvent.pointerMove(canvas, { clientX: 100, clientY: 140 });
  79. // done
  80. fireEvent.pointerDown(canvas);
  81. fireEvent.pointerUp(canvas);
  82. fireEvent.keyDown(document, {
  83. key: KEYS.ENTER,
  84. });
  85. expect(renderScene).toHaveBeenCalledTimes(15);
  86. expect(h.elements.length).toEqual(1);
  87. const element = h.elements[0] as ExcalidrawLinearElement;
  88. expect(element.type).toEqual("arrow");
  89. expect(element.x).toEqual(30);
  90. expect(element.y).toEqual(30);
  91. expect(element.points).toEqual([
  92. [0, 0],
  93. [20, 30],
  94. [70, 110],
  95. ]);
  96. h.elements.forEach((element) => expect(element).toMatchSnapshot());
  97. });
  98. it("line", async () => {
  99. const { getByToolName, container } = await render(<ExcalidrawApp />);
  100. // select tool
  101. const tool = getByToolName("line");
  102. fireEvent.click(tool);
  103. const canvas = container.querySelector("canvas")!;
  104. // first point is added on pointer down
  105. fireEvent.pointerDown(canvas, { clientX: 30, clientY: 30 });
  106. // second point, enable multi point
  107. fireEvent.pointerUp(canvas, { clientX: 30, clientY: 30 });
  108. fireEvent.pointerMove(canvas, { clientX: 50, clientY: 60 });
  109. // third point
  110. fireEvent.pointerDown(canvas, { clientX: 50, clientY: 60 });
  111. fireEvent.pointerUp(canvas);
  112. fireEvent.pointerMove(canvas, { clientX: 100, clientY: 140 });
  113. // done
  114. fireEvent.pointerDown(canvas);
  115. fireEvent.pointerUp(canvas);
  116. fireEvent.keyDown(document, {
  117. key: KEYS.ENTER,
  118. });
  119. expect(renderScene).toHaveBeenCalledTimes(15);
  120. expect(h.elements.length).toEqual(1);
  121. const element = h.elements[0] as ExcalidrawLinearElement;
  122. expect(element.type).toEqual("line");
  123. expect(element.x).toEqual(30);
  124. expect(element.y).toEqual(30);
  125. expect(element.points).toEqual([
  126. [0, 0],
  127. [20, 30],
  128. [70, 110],
  129. ]);
  130. h.elements.forEach((element) => expect(element).toMatchSnapshot());
  131. });
  132. });