multiPointCreate.test.tsx 4.3 KB

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