align.test.tsx 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012
  1. import { KEYS } from "@excalidraw/common";
  2. import {
  3. actionAlignVerticallyCentered,
  4. actionAlignHorizontallyCentered,
  5. actionGroup,
  6. actionAlignTop,
  7. actionAlignBottom,
  8. actionAlignLeft,
  9. actionAlignRight,
  10. } from "@excalidraw/excalidraw/actions";
  11. import { defaultLang, setLanguage } from "@excalidraw/excalidraw/i18n";
  12. import { Excalidraw } from "@excalidraw/excalidraw";
  13. import { API } from "@excalidraw/excalidraw/tests/helpers/api";
  14. import { UI, Pointer, Keyboard } from "@excalidraw/excalidraw/tests/helpers/ui";
  15. import {
  16. act,
  17. unmountComponent,
  18. render,
  19. } from "@excalidraw/excalidraw/tests/test-utils";
  20. const mouse = new Pointer("mouse");
  21. const createAndSelectTwoRectangles = () => {
  22. UI.clickTool("rectangle");
  23. mouse.down();
  24. mouse.up(100, 100);
  25. UI.clickTool("rectangle");
  26. mouse.down(10, 10);
  27. mouse.up(100, 100);
  28. // Select the first element.
  29. // The second rectangle is already reselected because it was the last element created
  30. mouse.reset();
  31. Keyboard.withModifierKeys({ shift: true }, () => {
  32. mouse.moveTo(10, 0);
  33. mouse.click();
  34. });
  35. };
  36. const createAndSelectTwoRectanglesWithDifferentSizes = () => {
  37. UI.clickTool("rectangle");
  38. mouse.down();
  39. mouse.up(100, 100);
  40. UI.clickTool("rectangle");
  41. mouse.down(10, 10);
  42. mouse.up(110, 110);
  43. // Select the first element.
  44. // The second rectangle is already reselected because it was the last element created
  45. mouse.reset();
  46. Keyboard.withModifierKeys({ shift: true }, () => {
  47. mouse.moveTo(10, 0);
  48. mouse.click();
  49. });
  50. };
  51. describe("aligning", () => {
  52. beforeEach(async () => {
  53. unmountComponent();
  54. mouse.reset();
  55. await act(() => {
  56. return setLanguage(defaultLang);
  57. });
  58. await render(<Excalidraw handleKeyboardGlobally={true} />);
  59. });
  60. it("aligns two objects correctly to the top", () => {
  61. createAndSelectTwoRectangles();
  62. expect(API.getSelectedElements()[0].x).toEqual(0);
  63. expect(API.getSelectedElements()[1].x).toEqual(110);
  64. expect(API.getSelectedElements()[0].y).toEqual(0);
  65. expect(API.getSelectedElements()[1].y).toEqual(110);
  66. Keyboard.withModifierKeys({ ctrl: true, shift: true }, () => {
  67. Keyboard.keyPress(KEYS.ARROW_UP);
  68. });
  69. // Check if x position did not change
  70. expect(API.getSelectedElements()[0].x).toEqual(0);
  71. expect(API.getSelectedElements()[1].x).toEqual(110);
  72. expect(API.getSelectedElements()[0].y).toEqual(0);
  73. expect(API.getSelectedElements()[1].y).toEqual(0);
  74. });
  75. it("aligns two objects correctly to the bottom", () => {
  76. createAndSelectTwoRectangles();
  77. expect(API.getSelectedElements()[0].x).toEqual(0);
  78. expect(API.getSelectedElements()[1].x).toEqual(110);
  79. expect(API.getSelectedElements()[0].y).toEqual(0);
  80. expect(API.getSelectedElements()[1].y).toEqual(110);
  81. Keyboard.withModifierKeys({ ctrl: true, shift: true }, () => {
  82. Keyboard.keyPress(KEYS.ARROW_DOWN);
  83. });
  84. // Check if x position did not change
  85. expect(API.getSelectedElements()[0].x).toEqual(0);
  86. expect(API.getSelectedElements()[1].x).toEqual(110);
  87. expect(API.getSelectedElements()[0].y).toEqual(110);
  88. expect(API.getSelectedElements()[1].y).toEqual(110);
  89. });
  90. it("aligns two objects correctly to the left", () => {
  91. createAndSelectTwoRectangles();
  92. expect(API.getSelectedElements()[0].x).toEqual(0);
  93. expect(API.getSelectedElements()[1].x).toEqual(110);
  94. expect(API.getSelectedElements()[0].y).toEqual(0);
  95. expect(API.getSelectedElements()[1].y).toEqual(110);
  96. Keyboard.withModifierKeys({ ctrl: true, shift: true }, () => {
  97. Keyboard.keyPress(KEYS.ARROW_LEFT);
  98. });
  99. expect(API.getSelectedElements()[0].x).toEqual(0);
  100. expect(API.getSelectedElements()[1].x).toEqual(0);
  101. // Check if y position did not change
  102. expect(API.getSelectedElements()[0].y).toEqual(0);
  103. expect(API.getSelectedElements()[1].y).toEqual(110);
  104. });
  105. it("aligns two objects correctly to the right", () => {
  106. createAndSelectTwoRectangles();
  107. expect(API.getSelectedElements()[0].x).toEqual(0);
  108. expect(API.getSelectedElements()[1].x).toEqual(110);
  109. expect(API.getSelectedElements()[0].y).toEqual(0);
  110. expect(API.getSelectedElements()[1].y).toEqual(110);
  111. Keyboard.withModifierKeys({ ctrl: true, shift: true }, () => {
  112. Keyboard.keyPress(KEYS.ARROW_RIGHT);
  113. });
  114. expect(API.getSelectedElements()[0].x).toEqual(110);
  115. expect(API.getSelectedElements()[1].x).toEqual(110);
  116. // Check if y position did not change
  117. expect(API.getSelectedElements()[0].y).toEqual(0);
  118. expect(API.getSelectedElements()[1].y).toEqual(110);
  119. });
  120. it("centers two objects with different sizes correctly vertically", () => {
  121. createAndSelectTwoRectanglesWithDifferentSizes();
  122. expect(API.getSelectedElements()[0].x).toEqual(0);
  123. expect(API.getSelectedElements()[1].x).toEqual(110);
  124. expect(API.getSelectedElements()[0].y).toEqual(0);
  125. expect(API.getSelectedElements()[1].y).toEqual(110);
  126. API.executeAction(actionAlignVerticallyCentered);
  127. // Check if x position did not change
  128. expect(API.getSelectedElements()[0].x).toEqual(0);
  129. expect(API.getSelectedElements()[1].x).toEqual(110);
  130. expect(API.getSelectedElements()[0].y).toEqual(60);
  131. expect(API.getSelectedElements()[1].y).toEqual(55);
  132. });
  133. it("centers two objects with different sizes correctly horizontally", () => {
  134. createAndSelectTwoRectanglesWithDifferentSizes();
  135. expect(API.getSelectedElements()[0].x).toEqual(0);
  136. expect(API.getSelectedElements()[1].x).toEqual(110);
  137. expect(API.getSelectedElements()[0].y).toEqual(0);
  138. expect(API.getSelectedElements()[1].y).toEqual(110);
  139. API.executeAction(actionAlignHorizontallyCentered);
  140. expect(API.getSelectedElements()[0].x).toEqual(60);
  141. expect(API.getSelectedElements()[1].x).toEqual(55);
  142. // Check if y position did not change
  143. expect(API.getSelectedElements()[0].y).toEqual(0);
  144. expect(API.getSelectedElements()[1].y).toEqual(110);
  145. });
  146. const createAndSelectGroupAndRectangle = () => {
  147. UI.clickTool("rectangle");
  148. mouse.down();
  149. mouse.up(100, 100);
  150. UI.clickTool("rectangle");
  151. mouse.down(0, 0);
  152. mouse.up(100, 100);
  153. // Select the first element.
  154. // The second rectangle is already reselected because it was the last element created
  155. mouse.reset();
  156. Keyboard.withModifierKeys({ shift: true }, () => {
  157. mouse.moveTo(10, 0);
  158. mouse.click();
  159. });
  160. API.executeAction(actionGroup);
  161. mouse.reset();
  162. UI.clickTool("rectangle");
  163. mouse.down(200, 200);
  164. mouse.up(100, 100);
  165. // Add the created group to the current selection
  166. mouse.restorePosition(0, 0);
  167. Keyboard.withModifierKeys({ shift: true }, () => {
  168. mouse.moveTo(10, 0);
  169. mouse.click();
  170. });
  171. };
  172. it("aligns a group with another element correctly to the top", () => {
  173. createAndSelectGroupAndRectangle();
  174. expect(API.getSelectedElements()[0].y).toEqual(0);
  175. expect(API.getSelectedElements()[1].y).toEqual(100);
  176. expect(API.getSelectedElements()[2].y).toEqual(200);
  177. API.executeAction(actionAlignTop);
  178. expect(API.getSelectedElements()[0].y).toEqual(0);
  179. expect(API.getSelectedElements()[1].y).toEqual(100);
  180. expect(API.getSelectedElements()[2].y).toEqual(0);
  181. });
  182. it("aligns a group with another element correctly to the bottom", () => {
  183. createAndSelectGroupAndRectangle();
  184. expect(API.getSelectedElements()[0].y).toEqual(0);
  185. expect(API.getSelectedElements()[1].y).toEqual(100);
  186. expect(API.getSelectedElements()[2].y).toEqual(200);
  187. API.executeAction(actionAlignBottom);
  188. expect(API.getSelectedElements()[0].y).toEqual(100);
  189. expect(API.getSelectedElements()[1].y).toEqual(200);
  190. expect(API.getSelectedElements()[2].y).toEqual(200);
  191. });
  192. it("aligns a group with another element correctly to the left", () => {
  193. createAndSelectGroupAndRectangle();
  194. expect(API.getSelectedElements()[0].x).toEqual(0);
  195. expect(API.getSelectedElements()[1].x).toEqual(100);
  196. expect(API.getSelectedElements()[2].x).toEqual(200);
  197. API.executeAction(actionAlignLeft);
  198. expect(API.getSelectedElements()[0].x).toEqual(0);
  199. expect(API.getSelectedElements()[1].x).toEqual(100);
  200. expect(API.getSelectedElements()[2].x).toEqual(0);
  201. });
  202. it("aligns a group with another element correctly to the right", () => {
  203. createAndSelectGroupAndRectangle();
  204. expect(API.getSelectedElements()[0].x).toEqual(0);
  205. expect(API.getSelectedElements()[1].x).toEqual(100);
  206. expect(API.getSelectedElements()[2].x).toEqual(200);
  207. API.executeAction(actionAlignRight);
  208. expect(API.getSelectedElements()[0].x).toEqual(100);
  209. expect(API.getSelectedElements()[1].x).toEqual(200);
  210. expect(API.getSelectedElements()[2].x).toEqual(200);
  211. });
  212. it("centers a group with another element correctly vertically", () => {
  213. createAndSelectGroupAndRectangle();
  214. expect(API.getSelectedElements()[0].y).toEqual(0);
  215. expect(API.getSelectedElements()[1].y).toEqual(100);
  216. expect(API.getSelectedElements()[2].y).toEqual(200);
  217. API.executeAction(actionAlignVerticallyCentered);
  218. expect(API.getSelectedElements()[0].y).toEqual(50);
  219. expect(API.getSelectedElements()[1].y).toEqual(150);
  220. expect(API.getSelectedElements()[2].y).toEqual(100);
  221. });
  222. it("centers a group with another element correctly horizontally", () => {
  223. createAndSelectGroupAndRectangle();
  224. expect(API.getSelectedElements()[0].x).toEqual(0);
  225. expect(API.getSelectedElements()[1].x).toEqual(100);
  226. expect(API.getSelectedElements()[2].x).toEqual(200);
  227. API.executeAction(actionAlignHorizontallyCentered);
  228. expect(API.getSelectedElements()[0].x).toEqual(50);
  229. expect(API.getSelectedElements()[1].x).toEqual(150);
  230. expect(API.getSelectedElements()[2].x).toEqual(100);
  231. });
  232. const createAndSelectTwoGroups = () => {
  233. UI.clickTool("rectangle");
  234. mouse.down();
  235. mouse.up(100, 100);
  236. UI.clickTool("rectangle");
  237. mouse.down(0, 0);
  238. mouse.up(100, 100);
  239. // Select the first element.
  240. // The second rectangle is already selected because it was the last element created
  241. mouse.reset();
  242. Keyboard.withModifierKeys({ shift: true }, () => {
  243. mouse.moveTo(10, 0);
  244. mouse.click();
  245. });
  246. API.executeAction(actionGroup);
  247. mouse.reset();
  248. UI.clickTool("rectangle");
  249. mouse.down(200, 200);
  250. mouse.up(100, 100);
  251. UI.clickTool("rectangle");
  252. mouse.down();
  253. mouse.up(100, 100);
  254. mouse.restorePosition(210, 200);
  255. Keyboard.withModifierKeys({ shift: true }, () => {
  256. mouse.click();
  257. });
  258. API.executeAction(actionGroup);
  259. // Select the first group.
  260. // The second group is already selected because it was the last group created
  261. mouse.reset();
  262. Keyboard.withModifierKeys({ shift: true }, () => {
  263. mouse.moveTo(10, 0);
  264. mouse.click();
  265. });
  266. };
  267. it("aligns two groups correctly to the top", () => {
  268. createAndSelectTwoGroups();
  269. expect(API.getSelectedElements()[0].y).toEqual(0);
  270. expect(API.getSelectedElements()[1].y).toEqual(100);
  271. expect(API.getSelectedElements()[2].y).toEqual(200);
  272. expect(API.getSelectedElements()[3].y).toEqual(300);
  273. API.executeAction(actionAlignTop);
  274. expect(API.getSelectedElements()[0].y).toEqual(0);
  275. expect(API.getSelectedElements()[1].y).toEqual(100);
  276. expect(API.getSelectedElements()[2].y).toEqual(0);
  277. expect(API.getSelectedElements()[3].y).toEqual(100);
  278. });
  279. it("aligns two groups correctly to the bottom", () => {
  280. createAndSelectTwoGroups();
  281. expect(API.getSelectedElements()[0].y).toEqual(0);
  282. expect(API.getSelectedElements()[1].y).toEqual(100);
  283. expect(API.getSelectedElements()[2].y).toEqual(200);
  284. expect(API.getSelectedElements()[3].y).toEqual(300);
  285. API.executeAction(actionAlignBottom);
  286. expect(API.getSelectedElements()[0].y).toEqual(200);
  287. expect(API.getSelectedElements()[1].y).toEqual(300);
  288. expect(API.getSelectedElements()[2].y).toEqual(200);
  289. expect(API.getSelectedElements()[3].y).toEqual(300);
  290. });
  291. it("aligns two groups correctly to the left", () => {
  292. createAndSelectTwoGroups();
  293. expect(API.getSelectedElements()[0].x).toEqual(0);
  294. expect(API.getSelectedElements()[1].x).toEqual(100);
  295. expect(API.getSelectedElements()[2].x).toEqual(200);
  296. expect(API.getSelectedElements()[3].x).toEqual(300);
  297. API.executeAction(actionAlignLeft);
  298. expect(API.getSelectedElements()[0].x).toEqual(0);
  299. expect(API.getSelectedElements()[1].x).toEqual(100);
  300. expect(API.getSelectedElements()[2].x).toEqual(0);
  301. expect(API.getSelectedElements()[3].x).toEqual(100);
  302. });
  303. it("aligns two groups correctly to the right", () => {
  304. createAndSelectTwoGroups();
  305. expect(API.getSelectedElements()[0].x).toEqual(0);
  306. expect(API.getSelectedElements()[1].x).toEqual(100);
  307. expect(API.getSelectedElements()[2].x).toEqual(200);
  308. expect(API.getSelectedElements()[3].x).toEqual(300);
  309. API.executeAction(actionAlignRight);
  310. expect(API.getSelectedElements()[0].x).toEqual(200);
  311. expect(API.getSelectedElements()[1].x).toEqual(300);
  312. expect(API.getSelectedElements()[2].x).toEqual(200);
  313. expect(API.getSelectedElements()[3].x).toEqual(300);
  314. });
  315. it("centers two groups correctly vertically", () => {
  316. createAndSelectTwoGroups();
  317. expect(API.getSelectedElements()[0].y).toEqual(0);
  318. expect(API.getSelectedElements()[1].y).toEqual(100);
  319. expect(API.getSelectedElements()[2].y).toEqual(200);
  320. expect(API.getSelectedElements()[3].y).toEqual(300);
  321. API.executeAction(actionAlignVerticallyCentered);
  322. expect(API.getSelectedElements()[0].y).toEqual(100);
  323. expect(API.getSelectedElements()[1].y).toEqual(200);
  324. expect(API.getSelectedElements()[2].y).toEqual(100);
  325. expect(API.getSelectedElements()[3].y).toEqual(200);
  326. });
  327. it("centers two groups correctly horizontally", () => {
  328. createAndSelectTwoGroups();
  329. expect(API.getSelectedElements()[0].x).toEqual(0);
  330. expect(API.getSelectedElements()[1].x).toEqual(100);
  331. expect(API.getSelectedElements()[2].x).toEqual(200);
  332. expect(API.getSelectedElements()[3].x).toEqual(300);
  333. API.executeAction(actionAlignHorizontallyCentered);
  334. expect(API.getSelectedElements()[0].x).toEqual(100);
  335. expect(API.getSelectedElements()[1].x).toEqual(200);
  336. expect(API.getSelectedElements()[2].x).toEqual(100);
  337. expect(API.getSelectedElements()[3].x).toEqual(200);
  338. });
  339. const createAndSelectNestedGroupAndRectangle = () => {
  340. UI.clickTool("rectangle");
  341. mouse.down();
  342. mouse.up(100, 100);
  343. UI.clickTool("rectangle");
  344. mouse.down(0, 0);
  345. mouse.up(100, 100);
  346. // Select the first element.
  347. // The second rectangle is already reselected because it was the last element created
  348. mouse.reset();
  349. Keyboard.withModifierKeys({ shift: true }, () => {
  350. mouse.moveTo(10, 0);
  351. mouse.click();
  352. });
  353. // Create first group of rectangles
  354. API.executeAction(actionGroup);
  355. mouse.reset();
  356. UI.clickTool("rectangle");
  357. mouse.down(200, 200);
  358. mouse.up(100, 100);
  359. // Add group to current selection
  360. mouse.restorePosition(10, 0);
  361. Keyboard.withModifierKeys({ shift: true }, () => {
  362. mouse.click();
  363. });
  364. // Create the nested group
  365. API.executeAction(actionGroup);
  366. mouse.reset();
  367. UI.clickTool("rectangle");
  368. mouse.down(300, 300);
  369. mouse.up(100, 100);
  370. // Select the nested group, the rectangle is already selected
  371. mouse.reset();
  372. Keyboard.withModifierKeys({ shift: true }, () => {
  373. mouse.moveTo(10, 0);
  374. mouse.click();
  375. });
  376. };
  377. it("aligns nested group and other element correctly to the top", () => {
  378. createAndSelectNestedGroupAndRectangle();
  379. expect(API.getSelectedElements()[0].y).toEqual(0);
  380. expect(API.getSelectedElements()[1].y).toEqual(100);
  381. expect(API.getSelectedElements()[2].y).toEqual(200);
  382. expect(API.getSelectedElements()[3].y).toEqual(300);
  383. API.executeAction(actionAlignTop);
  384. expect(API.getSelectedElements()[0].y).toEqual(0);
  385. expect(API.getSelectedElements()[1].y).toEqual(100);
  386. expect(API.getSelectedElements()[2].y).toEqual(200);
  387. expect(API.getSelectedElements()[3].y).toEqual(0);
  388. });
  389. it("aligns nested group and other element correctly to the bottom", () => {
  390. createAndSelectNestedGroupAndRectangle();
  391. expect(API.getSelectedElements()[0].y).toEqual(0);
  392. expect(API.getSelectedElements()[1].y).toEqual(100);
  393. expect(API.getSelectedElements()[2].y).toEqual(200);
  394. expect(API.getSelectedElements()[3].y).toEqual(300);
  395. API.executeAction(actionAlignBottom);
  396. expect(API.getSelectedElements()[0].y).toEqual(100);
  397. expect(API.getSelectedElements()[1].y).toEqual(200);
  398. expect(API.getSelectedElements()[2].y).toEqual(300);
  399. expect(API.getSelectedElements()[3].y).toEqual(300);
  400. });
  401. it("aligns nested group and other element correctly to the left", () => {
  402. createAndSelectNestedGroupAndRectangle();
  403. expect(API.getSelectedElements()[0].x).toEqual(0);
  404. expect(API.getSelectedElements()[1].x).toEqual(100);
  405. expect(API.getSelectedElements()[2].x).toEqual(200);
  406. expect(API.getSelectedElements()[3].x).toEqual(300);
  407. API.executeAction(actionAlignLeft);
  408. expect(API.getSelectedElements()[0].x).toEqual(0);
  409. expect(API.getSelectedElements()[1].x).toEqual(100);
  410. expect(API.getSelectedElements()[2].x).toEqual(200);
  411. expect(API.getSelectedElements()[3].x).toEqual(0);
  412. });
  413. it("aligns nested group and other element correctly to the right", () => {
  414. createAndSelectNestedGroupAndRectangle();
  415. expect(API.getSelectedElements()[0].x).toEqual(0);
  416. expect(API.getSelectedElements()[1].x).toEqual(100);
  417. expect(API.getSelectedElements()[2].x).toEqual(200);
  418. expect(API.getSelectedElements()[3].x).toEqual(300);
  419. API.executeAction(actionAlignRight);
  420. expect(API.getSelectedElements()[0].x).toEqual(100);
  421. expect(API.getSelectedElements()[1].x).toEqual(200);
  422. expect(API.getSelectedElements()[2].x).toEqual(300);
  423. expect(API.getSelectedElements()[3].x).toEqual(300);
  424. });
  425. it("centers nested group and other element correctly vertically", () => {
  426. createAndSelectNestedGroupAndRectangle();
  427. expect(API.getSelectedElements()[0].y).toEqual(0);
  428. expect(API.getSelectedElements()[1].y).toEqual(100);
  429. expect(API.getSelectedElements()[2].y).toEqual(200);
  430. expect(API.getSelectedElements()[3].y).toEqual(300);
  431. API.executeAction(actionAlignVerticallyCentered);
  432. expect(API.getSelectedElements()[0].y).toEqual(50);
  433. expect(API.getSelectedElements()[1].y).toEqual(150);
  434. expect(API.getSelectedElements()[2].y).toEqual(250);
  435. expect(API.getSelectedElements()[3].y).toEqual(150);
  436. });
  437. it("centers nested group and other element correctly horizontally", () => {
  438. createAndSelectNestedGroupAndRectangle();
  439. expect(API.getSelectedElements()[0].x).toEqual(0);
  440. expect(API.getSelectedElements()[1].x).toEqual(100);
  441. expect(API.getSelectedElements()[2].x).toEqual(200);
  442. expect(API.getSelectedElements()[3].x).toEqual(300);
  443. API.executeAction(actionAlignHorizontallyCentered);
  444. expect(API.getSelectedElements()[0].x).toEqual(50);
  445. expect(API.getSelectedElements()[1].x).toEqual(150);
  446. expect(API.getSelectedElements()[2].x).toEqual(250);
  447. expect(API.getSelectedElements()[3].x).toEqual(150);
  448. });
  449. const createGroupAndSelectInEditGroupMode = () => {
  450. UI.clickTool("rectangle");
  451. mouse.down();
  452. mouse.up(100, 100);
  453. UI.clickTool("rectangle");
  454. mouse.down(0, 0);
  455. mouse.up(100, 100);
  456. // select the first element.
  457. // The second rectangle is already reselected because it was the last element created
  458. mouse.reset();
  459. Keyboard.withModifierKeys({ shift: true }, () => {
  460. mouse.moveTo(10, 0);
  461. mouse.click();
  462. });
  463. API.executeAction(actionGroup);
  464. mouse.reset();
  465. mouse.moveTo(10, 0);
  466. mouse.doubleClick();
  467. Keyboard.withModifierKeys({ shift: true }, () => {
  468. mouse.click();
  469. mouse.moveTo(100, 100);
  470. mouse.click();
  471. });
  472. };
  473. it("aligns elements within a group while in group edit mode correctly to the top", () => {
  474. createGroupAndSelectInEditGroupMode();
  475. expect(API.getSelectedElements()[0].y).toEqual(0);
  476. expect(API.getSelectedElements()[1].y).toEqual(100);
  477. API.executeAction(actionAlignTop);
  478. expect(API.getSelectedElements()[0].y).toEqual(0);
  479. expect(API.getSelectedElements()[1].y).toEqual(0);
  480. });
  481. it("aligns elements within a group while in group edit mode correctly to the bottom", () => {
  482. createGroupAndSelectInEditGroupMode();
  483. expect(API.getSelectedElements()[0].y).toEqual(0);
  484. expect(API.getSelectedElements()[1].y).toEqual(100);
  485. API.executeAction(actionAlignBottom);
  486. expect(API.getSelectedElements()[0].y).toEqual(100);
  487. expect(API.getSelectedElements()[1].y).toEqual(100);
  488. });
  489. it("aligns elements within a group while in group edit mode correctly to the left", () => {
  490. createGroupAndSelectInEditGroupMode();
  491. expect(API.getSelectedElements()[0].x).toEqual(0);
  492. expect(API.getSelectedElements()[1].x).toEqual(100);
  493. API.executeAction(actionAlignLeft);
  494. expect(API.getSelectedElements()[0].x).toEqual(0);
  495. expect(API.getSelectedElements()[1].x).toEqual(0);
  496. });
  497. it("aligns elements within a group while in group edit mode correctly to the right", () => {
  498. createGroupAndSelectInEditGroupMode();
  499. expect(API.getSelectedElements()[0].x).toEqual(0);
  500. expect(API.getSelectedElements()[1].x).toEqual(100);
  501. API.executeAction(actionAlignRight);
  502. expect(API.getSelectedElements()[0].x).toEqual(100);
  503. expect(API.getSelectedElements()[1].x).toEqual(100);
  504. });
  505. it("aligns elements within a group while in group edit mode correctly to the vertical center", () => {
  506. createGroupAndSelectInEditGroupMode();
  507. expect(API.getSelectedElements()[0].y).toEqual(0);
  508. expect(API.getSelectedElements()[1].y).toEqual(100);
  509. API.executeAction(actionAlignVerticallyCentered);
  510. expect(API.getSelectedElements()[0].y).toEqual(50);
  511. expect(API.getSelectedElements()[1].y).toEqual(50);
  512. });
  513. it("aligns elements within a group while in group edit mode correctly to the horizontal center", () => {
  514. createGroupAndSelectInEditGroupMode();
  515. expect(API.getSelectedElements()[0].x).toEqual(0);
  516. expect(API.getSelectedElements()[1].x).toEqual(100);
  517. API.executeAction(actionAlignHorizontallyCentered);
  518. expect(API.getSelectedElements()[0].x).toEqual(50);
  519. expect(API.getSelectedElements()[1].x).toEqual(50);
  520. });
  521. const createNestedGroupAndSelectInEditGroupMode = () => {
  522. UI.clickTool("rectangle");
  523. mouse.down();
  524. mouse.up(100, 100);
  525. UI.clickTool("rectangle");
  526. mouse.down(0, 0);
  527. mouse.up(100, 100);
  528. // Select the first element.
  529. // The second rectangle is already reselected because it was the last element created
  530. mouse.reset();
  531. Keyboard.withModifierKeys({ shift: true }, () => {
  532. mouse.moveTo(10, 0);
  533. mouse.click();
  534. });
  535. API.executeAction(actionGroup);
  536. mouse.reset();
  537. mouse.moveTo(200, 200);
  538. // create third element
  539. UI.clickTool("rectangle");
  540. mouse.down(0, 0);
  541. mouse.up(100, 100);
  542. // third element is already selected, select the initial group and group together
  543. mouse.reset();
  544. Keyboard.withModifierKeys({ shift: true }, () => {
  545. mouse.moveTo(10, 0);
  546. mouse.click();
  547. });
  548. API.executeAction(actionGroup);
  549. // double click to enter edit mode
  550. mouse.doubleClick();
  551. // select nested group and other element within the group
  552. Keyboard.withModifierKeys({ shift: true }, () => {
  553. mouse.moveTo(200, 200);
  554. mouse.click();
  555. });
  556. };
  557. it("aligns element and nested group while in group edit mode correctly to the top", () => {
  558. createNestedGroupAndSelectInEditGroupMode();
  559. expect(API.getSelectedElements()[0].y).toEqual(0);
  560. expect(API.getSelectedElements()[1].y).toEqual(100);
  561. expect(API.getSelectedElements()[2].y).toEqual(200);
  562. API.executeAction(actionAlignTop);
  563. expect(API.getSelectedElements()[0].y).toEqual(0);
  564. expect(API.getSelectedElements()[1].y).toEqual(100);
  565. expect(API.getSelectedElements()[2].y).toEqual(0);
  566. });
  567. it("aligns element and nested group while in group edit mode correctly to the bottom", () => {
  568. createNestedGroupAndSelectInEditGroupMode();
  569. expect(API.getSelectedElements()[0].y).toEqual(0);
  570. expect(API.getSelectedElements()[1].y).toEqual(100);
  571. expect(API.getSelectedElements()[2].y).toEqual(200);
  572. API.executeAction(actionAlignBottom);
  573. expect(API.getSelectedElements()[0].y).toEqual(100);
  574. expect(API.getSelectedElements()[1].y).toEqual(200);
  575. expect(API.getSelectedElements()[2].y).toEqual(200);
  576. });
  577. it("aligns element and nested group while in group edit mode correctly to the left", () => {
  578. createNestedGroupAndSelectInEditGroupMode();
  579. expect(API.getSelectedElements()[0].x).toEqual(0);
  580. expect(API.getSelectedElements()[1].x).toEqual(100);
  581. expect(API.getSelectedElements()[2].x).toEqual(200);
  582. API.executeAction(actionAlignLeft);
  583. expect(API.getSelectedElements()[0].x).toEqual(0);
  584. expect(API.getSelectedElements()[1].x).toEqual(100);
  585. expect(API.getSelectedElements()[2].x).toEqual(0);
  586. });
  587. it("aligns element and nested group while in group edit mode correctly to the right", () => {
  588. createNestedGroupAndSelectInEditGroupMode();
  589. expect(API.getSelectedElements()[0].x).toEqual(0);
  590. expect(API.getSelectedElements()[1].x).toEqual(100);
  591. expect(API.getSelectedElements()[2].x).toEqual(200);
  592. API.executeAction(actionAlignRight);
  593. expect(API.getSelectedElements()[0].x).toEqual(100);
  594. expect(API.getSelectedElements()[1].x).toEqual(200);
  595. expect(API.getSelectedElements()[2].x).toEqual(200);
  596. });
  597. it("aligns element and nested group while in group edit mode correctly to the vertical center", () => {
  598. createNestedGroupAndSelectInEditGroupMode();
  599. expect(API.getSelectedElements()[0].y).toEqual(0);
  600. expect(API.getSelectedElements()[1].y).toEqual(100);
  601. expect(API.getSelectedElements()[2].y).toEqual(200);
  602. API.executeAction(actionAlignVerticallyCentered);
  603. expect(API.getSelectedElements()[0].y).toEqual(50);
  604. expect(API.getSelectedElements()[1].y).toEqual(150);
  605. expect(API.getSelectedElements()[2].y).toEqual(100);
  606. });
  607. it("aligns elements and nested group within a group while in group edit mode correctly to the horizontal center", () => {
  608. createNestedGroupAndSelectInEditGroupMode();
  609. expect(API.getSelectedElements()[0].x).toEqual(0);
  610. expect(API.getSelectedElements()[1].x).toEqual(100);
  611. expect(API.getSelectedElements()[2].x).toEqual(200);
  612. API.executeAction(actionAlignHorizontallyCentered);
  613. expect(API.getSelectedElements()[0].x).toEqual(50);
  614. expect(API.getSelectedElements()[1].x).toEqual(150);
  615. expect(API.getSelectedElements()[2].x).toEqual(100);
  616. });
  617. const createAndSelectSingleGroup = () => {
  618. UI.clickTool("rectangle");
  619. mouse.down();
  620. mouse.up(100, 100);
  621. UI.clickTool("rectangle");
  622. mouse.down(0, 0);
  623. mouse.up(100, 100);
  624. // Select the first element.
  625. // The second rectangle is already reselected because it was the last element created
  626. mouse.reset();
  627. Keyboard.withModifierKeys({ shift: true }, () => {
  628. mouse.moveTo(10, 0);
  629. mouse.click();
  630. });
  631. API.executeAction(actionGroup);
  632. };
  633. it("aligns elements within a single-selected group correctly to the top", () => {
  634. createAndSelectSingleGroup();
  635. expect(API.getSelectedElements()[0].y).toEqual(0);
  636. expect(API.getSelectedElements()[1].y).toEqual(100);
  637. API.executeAction(actionAlignTop);
  638. expect(API.getSelectedElements()[0].y).toEqual(0);
  639. expect(API.getSelectedElements()[1].y).toEqual(0);
  640. });
  641. it("aligns elements within a single-selected group correctly to the bottom", () => {
  642. createAndSelectSingleGroup();
  643. expect(API.getSelectedElements()[0].y).toEqual(0);
  644. expect(API.getSelectedElements()[1].y).toEqual(100);
  645. API.executeAction(actionAlignBottom);
  646. expect(API.getSelectedElements()[0].y).toEqual(100);
  647. expect(API.getSelectedElements()[1].y).toEqual(100);
  648. });
  649. it("aligns elements within a single-selected group correctly to the left", () => {
  650. createAndSelectSingleGroup();
  651. expect(API.getSelectedElements()[0].x).toEqual(0);
  652. expect(API.getSelectedElements()[1].x).toEqual(100);
  653. API.executeAction(actionAlignLeft);
  654. expect(API.getSelectedElements()[0].x).toEqual(0);
  655. expect(API.getSelectedElements()[1].x).toEqual(0);
  656. });
  657. it("aligns elements within a single-selected group correctly to the right", () => {
  658. createAndSelectSingleGroup();
  659. expect(API.getSelectedElements()[0].x).toEqual(0);
  660. expect(API.getSelectedElements()[1].x).toEqual(100);
  661. API.executeAction(actionAlignRight);
  662. expect(API.getSelectedElements()[0].x).toEqual(100);
  663. expect(API.getSelectedElements()[1].x).toEqual(100);
  664. });
  665. it("aligns elements within a single-selected group correctly to the vertical center", () => {
  666. createAndSelectSingleGroup();
  667. expect(API.getSelectedElements()[0].y).toEqual(0);
  668. expect(API.getSelectedElements()[1].y).toEqual(100);
  669. API.executeAction(actionAlignVerticallyCentered);
  670. expect(API.getSelectedElements()[0].y).toEqual(50);
  671. expect(API.getSelectedElements()[1].y).toEqual(50);
  672. });
  673. it("aligns elements within a single-selected group correctly to the horizontal center", () => {
  674. createAndSelectSingleGroup();
  675. expect(API.getSelectedElements()[0].x).toEqual(0);
  676. expect(API.getSelectedElements()[1].x).toEqual(100);
  677. API.executeAction(actionAlignHorizontallyCentered);
  678. expect(API.getSelectedElements()[0].x).toEqual(50);
  679. expect(API.getSelectedElements()[1].x).toEqual(50);
  680. });
  681. const createAndSelectSingleGroupWithNestedGroup = () => {
  682. UI.clickTool("rectangle");
  683. mouse.down();
  684. mouse.up(100, 100);
  685. UI.clickTool("rectangle");
  686. mouse.down(0, 0);
  687. mouse.up(100, 100);
  688. // Select the first element.
  689. // The second rectangle is already reselected because it was the last element created
  690. mouse.reset();
  691. Keyboard.withModifierKeys({ shift: true }, () => {
  692. mouse.moveTo(10, 0);
  693. mouse.click();
  694. });
  695. API.executeAction(actionGroup);
  696. mouse.reset();
  697. UI.clickTool("rectangle");
  698. mouse.down(200, 200);
  699. mouse.up(100, 100);
  700. // Add group to current selection
  701. mouse.restorePosition(10, 0);
  702. Keyboard.withModifierKeys({ shift: true }, () => {
  703. mouse.click();
  704. });
  705. // Create the nested group
  706. API.executeAction(actionGroup);
  707. };
  708. it("aligns elements within a single-selected group containing a nested group correctly to the top", () => {
  709. createAndSelectSingleGroupWithNestedGroup();
  710. expect(API.getSelectedElements()[0].y).toEqual(0);
  711. expect(API.getSelectedElements()[1].y).toEqual(100);
  712. expect(API.getSelectedElements()[2].y).toEqual(200);
  713. API.executeAction(actionAlignTop);
  714. expect(API.getSelectedElements()[0].y).toEqual(0);
  715. expect(API.getSelectedElements()[1].y).toEqual(100);
  716. expect(API.getSelectedElements()[2].y).toEqual(0);
  717. });
  718. it("aligns elements within a single-selected group containing a nested group correctly to the bottom", () => {
  719. createAndSelectSingleGroupWithNestedGroup();
  720. expect(API.getSelectedElements()[0].y).toEqual(0);
  721. expect(API.getSelectedElements()[1].y).toEqual(100);
  722. expect(API.getSelectedElements()[2].y).toEqual(200);
  723. API.executeAction(actionAlignBottom);
  724. expect(API.getSelectedElements()[0].y).toEqual(100);
  725. expect(API.getSelectedElements()[1].y).toEqual(200);
  726. expect(API.getSelectedElements()[2].y).toEqual(200);
  727. });
  728. it("aligns elements within a single-selected group containing a nested group correctly to the left", () => {
  729. createAndSelectSingleGroupWithNestedGroup();
  730. expect(API.getSelectedElements()[0].x).toEqual(0);
  731. expect(API.getSelectedElements()[1].x).toEqual(100);
  732. expect(API.getSelectedElements()[2].x).toEqual(200);
  733. API.executeAction(actionAlignLeft);
  734. expect(API.getSelectedElements()[0].x).toEqual(0);
  735. expect(API.getSelectedElements()[1].x).toEqual(100);
  736. expect(API.getSelectedElements()[2].x).toEqual(0);
  737. });
  738. it("aligns elements within a single-selected group containing a nested group correctly to the right", () => {
  739. createAndSelectSingleGroupWithNestedGroup();
  740. expect(API.getSelectedElements()[0].x).toEqual(0);
  741. expect(API.getSelectedElements()[1].x).toEqual(100);
  742. expect(API.getSelectedElements()[2].x).toEqual(200);
  743. API.executeAction(actionAlignRight);
  744. expect(API.getSelectedElements()[0].x).toEqual(100);
  745. expect(API.getSelectedElements()[1].x).toEqual(200);
  746. expect(API.getSelectedElements()[2].x).toEqual(200);
  747. });
  748. it("aligns elements within a single-selected group containing a nested group correctly to the vertical center", () => {
  749. createAndSelectSingleGroupWithNestedGroup();
  750. expect(API.getSelectedElements()[0].y).toEqual(0);
  751. expect(API.getSelectedElements()[1].y).toEqual(100);
  752. expect(API.getSelectedElements()[2].y).toEqual(200);
  753. API.executeAction(actionAlignVerticallyCentered);
  754. expect(API.getSelectedElements()[0].y).toEqual(50);
  755. expect(API.getSelectedElements()[1].y).toEqual(150);
  756. expect(API.getSelectedElements()[2].y).toEqual(100);
  757. });
  758. it("aligns elements within a single-selected group containing a nested group correctly to the horizontal center", () => {
  759. createAndSelectSingleGroupWithNestedGroup();
  760. expect(API.getSelectedElements()[0].x).toEqual(0);
  761. expect(API.getSelectedElements()[1].x).toEqual(100);
  762. expect(API.getSelectedElements()[2].x).toEqual(200);
  763. API.executeAction(actionAlignHorizontallyCentered);
  764. expect(API.getSelectedElements()[0].x).toEqual(50);
  765. expect(API.getSelectedElements()[1].x).toEqual(150);
  766. expect(API.getSelectedElements()[2].x).toEqual(100);
  767. });
  768. });