multiPointCreate.test.tsx 4.8 KB

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