dragCreate.test.tsx 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. import React from "react";
  2. import ReactDOM from "react-dom";
  3. import { App } from "../index";
  4. import * as Renderer from "../renderer/renderScene";
  5. import { KEYS } from "../keys";
  6. import { render, fireEvent } from "./test-utils";
  7. // Unmount ReactDOM from root
  8. ReactDOM.unmountComponentAtNode(document.getElementById("root")!);
  9. const renderScene = jest.spyOn(Renderer, "renderScene");
  10. beforeEach(() => {
  11. localStorage.clear();
  12. renderScene.mockClear();
  13. });
  14. describe.skip("add element to the scene when pointer dragging long enough", () => {
  15. it("rectangle", () => {
  16. const { getByToolName, container } = render(<App />);
  17. // select tool
  18. const tool = getByToolName("rectangle");
  19. fireEvent.click(tool);
  20. const canvas = container.querySelector("canvas")!;
  21. // start from (30, 20)
  22. fireEvent.pointerDown(canvas, { clientX: 30, clientY: 20 });
  23. // move to (60,70)
  24. fireEvent.pointerMove(canvas, { clientX: 60, clientY: 70 });
  25. // finish (position does not matter)
  26. fireEvent.pointerUp(canvas);
  27. expect(renderScene).toHaveBeenCalledTimes(4);
  28. expect(renderScene.mock.calls[3][1]).toBeNull();
  29. const elements = renderScene.mock.calls[3][0];
  30. expect(elements.length).toEqual(1);
  31. expect(elements[0].type).toEqual("rectangle");
  32. expect(elements[0].x).toEqual(30);
  33. expect(elements[0].y).toEqual(20);
  34. expect(elements[0].width).toEqual(30); // 60 - 30
  35. expect(elements[0].height).toEqual(50); // 70 - 20
  36. });
  37. it("ellipse", () => {
  38. const { getByToolName, container } = render(<App />);
  39. // select tool
  40. const tool = getByToolName("ellipse");
  41. fireEvent.click(tool);
  42. const canvas = container.querySelector("canvas")!;
  43. // start from (30, 20)
  44. fireEvent.pointerDown(canvas, { clientX: 30, clientY: 20 });
  45. // move to (60,70)
  46. fireEvent.pointerMove(canvas, { clientX: 60, clientY: 70 });
  47. // finish (position does not matter)
  48. fireEvent.pointerUp(canvas);
  49. expect(renderScene).toHaveBeenCalledTimes(4);
  50. expect(renderScene.mock.calls[3][1]).toBeNull();
  51. const elements = renderScene.mock.calls[3][0];
  52. expect(elements.length).toEqual(1);
  53. expect(elements[0].type).toEqual("ellipse");
  54. expect(elements[0].x).toEqual(30);
  55. expect(elements[0].y).toEqual(20);
  56. expect(elements[0].width).toEqual(30); // 60 - 30
  57. expect(elements[0].height).toEqual(50); // 70 - 20
  58. });
  59. it("diamond", () => {
  60. const { getByToolName, container } = render(<App />);
  61. // select tool
  62. const tool = getByToolName("diamond");
  63. fireEvent.click(tool);
  64. const canvas = container.querySelector("canvas")!;
  65. // start from (30, 20)
  66. fireEvent.pointerDown(canvas, { clientX: 30, clientY: 20 });
  67. // move to (60,70)
  68. fireEvent.pointerMove(canvas, { clientX: 60, clientY: 70 });
  69. // finish (position does not matter)
  70. fireEvent.pointerUp(canvas);
  71. expect(renderScene).toHaveBeenCalledTimes(4);
  72. expect(renderScene.mock.calls[3][1]).toBeNull();
  73. const elements = renderScene.mock.calls[3][0];
  74. expect(elements.length).toEqual(1);
  75. expect(elements[0].type).toEqual("diamond");
  76. expect(elements[0].x).toEqual(30);
  77. expect(elements[0].y).toEqual(20);
  78. expect(elements[0].width).toEqual(30); // 60 - 30
  79. expect(elements[0].height).toEqual(50); // 70 - 20
  80. });
  81. it("arrow", () => {
  82. const { getByToolName, container } = render(<App />);
  83. // select tool
  84. const tool = getByToolName("arrow");
  85. fireEvent.click(tool);
  86. const canvas = container.querySelector("canvas")!;
  87. // start from (30, 20)
  88. fireEvent.pointerDown(canvas, { clientX: 30, clientY: 20 });
  89. // move to (60,70)
  90. fireEvent.pointerMove(canvas, { clientX: 60, clientY: 70 });
  91. // finish (position does not matter)
  92. fireEvent.pointerUp(canvas);
  93. expect(renderScene).toHaveBeenCalledTimes(4);
  94. expect(renderScene.mock.calls[3][1]).toBeNull();
  95. const elements = renderScene.mock.calls[3][0];
  96. expect(elements.length).toEqual(1);
  97. expect(elements[0].type).toEqual("arrow");
  98. expect(elements[0].x).toEqual(30);
  99. expect(elements[0].y).toEqual(20);
  100. expect(elements[0].points.length).toEqual(2);
  101. expect(elements[0].points[0]).toEqual([0, 0]);
  102. expect(elements[0].points[1]).toEqual([30, 50]); // (60 - 30, 70 - 20)
  103. });
  104. it("line", () => {
  105. const { getByToolName, container } = render(<App />);
  106. // select tool
  107. const tool = getByToolName("line");
  108. fireEvent.click(tool);
  109. const canvas = container.querySelector("canvas")!;
  110. // start from (30, 20)
  111. fireEvent.pointerDown(canvas, { clientX: 30, clientY: 20 });
  112. // move to (60,70)
  113. fireEvent.pointerMove(canvas, { clientX: 60, clientY: 70 });
  114. // finish (position does not matter)
  115. fireEvent.pointerUp(canvas);
  116. expect(renderScene).toHaveBeenCalledTimes(4);
  117. expect(renderScene.mock.calls[3][1]).toBeNull();
  118. const elements = renderScene.mock.calls[3][0];
  119. expect(elements.length).toEqual(1);
  120. expect(elements[0].type).toEqual("line");
  121. expect(elements[0].x).toEqual(30);
  122. expect(elements[0].y).toEqual(20);
  123. expect(elements[0].points.length).toEqual(2);
  124. expect(elements[0].points[0]).toEqual([0, 0]);
  125. expect(elements[0].points[1]).toEqual([30, 50]); // (60 - 30, 70 - 20)
  126. });
  127. });
  128. describe.skip("do not add element to the scene if size is too small", () => {
  129. it("rectangle", () => {
  130. const { getByToolName, container } = render(<App />);
  131. // select tool
  132. const tool = getByToolName("rectangle");
  133. fireEvent.click(tool);
  134. const canvas = container.querySelector("canvas")!;
  135. // start from (30, 20)
  136. fireEvent.pointerDown(canvas, { clientX: 30, clientY: 20 });
  137. // finish (position does not matter)
  138. fireEvent.pointerUp(canvas);
  139. expect(renderScene).toHaveBeenCalledTimes(3);
  140. expect(renderScene.mock.calls[2][1]).toBeNull();
  141. const elements = renderScene.mock.calls[2][0];
  142. expect(elements.length).toEqual(0);
  143. });
  144. it("ellipse", () => {
  145. const { getByToolName, container } = render(<App />);
  146. // select tool
  147. const tool = getByToolName("ellipse");
  148. fireEvent.click(tool);
  149. const canvas = container.querySelector("canvas")!;
  150. // start from (30, 20)
  151. fireEvent.pointerDown(canvas, { clientX: 30, clientY: 20 });
  152. // finish (position does not matter)
  153. fireEvent.pointerUp(canvas);
  154. expect(renderScene).toHaveBeenCalledTimes(3);
  155. expect(renderScene.mock.calls[2][1]).toBeNull();
  156. const elements = renderScene.mock.calls[2][0];
  157. expect(elements.length).toEqual(0);
  158. });
  159. it("diamond", () => {
  160. const { getByToolName, container } = render(<App />);
  161. // select tool
  162. const tool = getByToolName("diamond");
  163. fireEvent.click(tool);
  164. const canvas = container.querySelector("canvas")!;
  165. // start from (30, 20)
  166. fireEvent.pointerDown(canvas, { clientX: 30, clientY: 20 });
  167. // finish (position does not matter)
  168. fireEvent.pointerUp(canvas);
  169. expect(renderScene).toHaveBeenCalledTimes(3);
  170. expect(renderScene.mock.calls[2][1]).toBeNull();
  171. const elements = renderScene.mock.calls[2][0];
  172. expect(elements.length).toEqual(0);
  173. });
  174. it("arrow", () => {
  175. const { getByToolName, container } = render(<App />);
  176. // select tool
  177. const tool = getByToolName("arrow");
  178. fireEvent.click(tool);
  179. const canvas = container.querySelector("canvas")!;
  180. // start from (30, 20)
  181. fireEvent.pointerDown(canvas, { clientX: 30, clientY: 20 });
  182. // finish (position does not matter)
  183. fireEvent.pointerUp(canvas);
  184. // we need to finalize it because arrows and lines enter multi-mode
  185. fireEvent.keyDown(document, { key: KEYS.ENTER });
  186. expect(renderScene).toHaveBeenCalledTimes(4);
  187. expect(renderScene.mock.calls[3][1]).toBeNull();
  188. const elements = renderScene.mock.calls[3][0];
  189. expect(elements.length).toEqual(0);
  190. });
  191. it("line", () => {
  192. const { getByToolName, container } = render(<App />);
  193. // select tool
  194. const tool = getByToolName("line");
  195. fireEvent.click(tool);
  196. const canvas = container.querySelector("canvas")!;
  197. // start from (30, 20)
  198. fireEvent.pointerDown(canvas, { clientX: 30, clientY: 20 });
  199. // finish (position does not matter)
  200. fireEvent.pointerUp(canvas);
  201. // we need to finalize it because arrows and lines enter multi-mode
  202. fireEvent.keyDown(document, { key: KEYS.ENTER });
  203. expect(renderScene).toHaveBeenCalledTimes(4);
  204. expect(renderScene.mock.calls[3][1]).toBeNull();
  205. const elements = renderScene.mock.calls[3][0];
  206. expect(elements.length).toEqual(0);
  207. });
  208. });