|  | @@ -0,0 +1,579 @@
 | 
	
		
			
				|  |  | +import React from "react";
 | 
	
		
			
				|  |  | +import ReactDOM from "react-dom";
 | 
	
		
			
				|  |  | +import { render } from "./test-utils";
 | 
	
		
			
				|  |  | +import App from "../components/App";
 | 
	
		
			
				|  |  | +import { setLanguage } from "../i18n";
 | 
	
		
			
				|  |  | +import { UI, Pointer, Keyboard } from "./helpers/ui";
 | 
	
		
			
				|  |  | +import { API } from "./helpers/api";
 | 
	
		
			
				|  |  | +import { KEYS } from "../keys";
 | 
	
		
			
				|  |  | +import {
 | 
	
		
			
				|  |  | +  actionAlignVerticallyCentered,
 | 
	
		
			
				|  |  | +  actionAlignHorizontallyCentered,
 | 
	
		
			
				|  |  | +  actionGroup,
 | 
	
		
			
				|  |  | +  actionAlignTop,
 | 
	
		
			
				|  |  | +  actionAlignBottom,
 | 
	
		
			
				|  |  | +  actionAlignLeft,
 | 
	
		
			
				|  |  | +  actionAlignRight,
 | 
	
		
			
				|  |  | +} from "../actions";
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const { h } = window;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const mouse = new Pointer("mouse");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +beforeEach(async () => {
 | 
	
		
			
				|  |  | +  // Unmount ReactDOM from root
 | 
	
		
			
				|  |  | +  ReactDOM.unmountComponentAtNode(document.getElementById("root")!);
 | 
	
		
			
				|  |  | +  mouse.reset();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  await setLanguage("en.json");
 | 
	
		
			
				|  |  | +  render(<App />);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function createAndSelectTwoRectangles() {
 | 
	
		
			
				|  |  | +  UI.clickTool("rectangle");
 | 
	
		
			
				|  |  | +  mouse.down();
 | 
	
		
			
				|  |  | +  mouse.up(100, 100);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  UI.clickTool("rectangle");
 | 
	
		
			
				|  |  | +  mouse.down(10, 10);
 | 
	
		
			
				|  |  | +  mouse.up(100, 100);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Select the first element.
 | 
	
		
			
				|  |  | +  // The second rectangle is already reselected because it was the last element created
 | 
	
		
			
				|  |  | +  mouse.reset();
 | 
	
		
			
				|  |  | +  Keyboard.withModifierKeys({ shift: true }, () => {
 | 
	
		
			
				|  |  | +    mouse.click();
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function createAndSelectTwoRectanglesWithDifferentSizes() {
 | 
	
		
			
				|  |  | +  UI.clickTool("rectangle");
 | 
	
		
			
				|  |  | +  mouse.down();
 | 
	
		
			
				|  |  | +  mouse.up(100, 100);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  UI.clickTool("rectangle");
 | 
	
		
			
				|  |  | +  mouse.down(10, 10);
 | 
	
		
			
				|  |  | +  mouse.up(110, 110);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Select the first element.
 | 
	
		
			
				|  |  | +  // The second rectangle is already reselected because it was the last element created
 | 
	
		
			
				|  |  | +  mouse.reset();
 | 
	
		
			
				|  |  | +  Keyboard.withModifierKeys({ shift: true }, () => {
 | 
	
		
			
				|  |  | +    mouse.click();
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +it("aligns two objects correctly to the top", () => {
 | 
	
		
			
				|  |  | +  createAndSelectTwoRectangles();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(110);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(110);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  Keyboard.withModifierKeys({ ctrl: true, shift: true }, () => {
 | 
	
		
			
				|  |  | +    Keyboard.keyPress(KEYS.ARROW_UP);
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Check if x position did not change
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(110);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(0);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +it("aligns two objects correctly to the bottom", () => {
 | 
	
		
			
				|  |  | +  createAndSelectTwoRectangles();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(110);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(110);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  Keyboard.withModifierKeys({ ctrl: true, shift: true }, () => {
 | 
	
		
			
				|  |  | +    Keyboard.keyPress(KEYS.ARROW_DOWN);
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Check if x position did not change
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(110);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(110);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(110);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +it("aligns two objects correctly to the left", () => {
 | 
	
		
			
				|  |  | +  createAndSelectTwoRectangles();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(110);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(110);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  Keyboard.withModifierKeys({ ctrl: true, shift: true }, () => {
 | 
	
		
			
				|  |  | +    Keyboard.keyPress(KEYS.ARROW_LEFT);
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(0);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Check if y position did not change
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(110);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +it("aligns two objects correctly to the right", () => {
 | 
	
		
			
				|  |  | +  createAndSelectTwoRectangles();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(110);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(110);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  Keyboard.withModifierKeys({ ctrl: true, shift: true }, () => {
 | 
	
		
			
				|  |  | +    Keyboard.keyPress(KEYS.ARROW_RIGHT);
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(110);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(110);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Check if y position did not change
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(110);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +it("centers two objects with different sizes correctly vertically", () => {
 | 
	
		
			
				|  |  | +  createAndSelectTwoRectanglesWithDifferentSizes();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(110);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(110);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  h.app.actionManager.executeAction(actionAlignVerticallyCentered);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Check if x position did not change
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(110);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(60);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(55);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +it("centers two objects with different sizes correctly horizontally", () => {
 | 
	
		
			
				|  |  | +  createAndSelectTwoRectanglesWithDifferentSizes();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(110);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(110);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  h.app.actionManager.executeAction(actionAlignHorizontallyCentered);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(60);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(55);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Check if y position did not change
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(110);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function createAndSelectGroupAndRectangle() {
 | 
	
		
			
				|  |  | +  UI.clickTool("rectangle");
 | 
	
		
			
				|  |  | +  mouse.down();
 | 
	
		
			
				|  |  | +  mouse.up(100, 100);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  UI.clickTool("rectangle");
 | 
	
		
			
				|  |  | +  mouse.down(0, 0);
 | 
	
		
			
				|  |  | +  mouse.up(100, 100);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Select the first element.
 | 
	
		
			
				|  |  | +  // The second rectangle is already reselected because it was the last element created
 | 
	
		
			
				|  |  | +  mouse.reset();
 | 
	
		
			
				|  |  | +  Keyboard.withModifierKeys({ shift: true }, () => {
 | 
	
		
			
				|  |  | +    mouse.click();
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  h.app.actionManager.executeAction(actionGroup);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  mouse.reset();
 | 
	
		
			
				|  |  | +  UI.clickTool("rectangle");
 | 
	
		
			
				|  |  | +  mouse.down(200, 200);
 | 
	
		
			
				|  |  | +  mouse.up(100, 100);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Add the created group to the current selection
 | 
	
		
			
				|  |  | +  mouse.restorePosition(0, 0);
 | 
	
		
			
				|  |  | +  Keyboard.withModifierKeys({ shift: true }, () => {
 | 
	
		
			
				|  |  | +    mouse.click();
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +it("aligns a group with another element correctly to the top", () => {
 | 
	
		
			
				|  |  | +  createAndSelectGroupAndRectangle();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].y).toEqual(200);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  h.app.actionManager.executeAction(actionAlignTop);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].y).toEqual(0);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +it("aligns a group with another element correctly to the bottom", () => {
 | 
	
		
			
				|  |  | +  createAndSelectGroupAndRectangle();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].y).toEqual(200);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  h.app.actionManager.executeAction(actionAlignBottom);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(200);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].y).toEqual(200);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +it("aligns a group with another element correctly to the left", () => {
 | 
	
		
			
				|  |  | +  createAndSelectGroupAndRectangle();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].x).toEqual(200);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  h.app.actionManager.executeAction(actionAlignLeft);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].x).toEqual(0);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +it("aligns a group with another element correctly to the right", () => {
 | 
	
		
			
				|  |  | +  createAndSelectGroupAndRectangle();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].x).toEqual(200);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  h.app.actionManager.executeAction(actionAlignRight);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(200);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].x).toEqual(200);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +it("centers a group with another element correctly vertically", () => {
 | 
	
		
			
				|  |  | +  createAndSelectGroupAndRectangle();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].y).toEqual(200);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  h.app.actionManager.executeAction(actionAlignVerticallyCentered);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(50);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(150);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].y).toEqual(100);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +it("centers a group with another element correctly horizontally", () => {
 | 
	
		
			
				|  |  | +  createAndSelectGroupAndRectangle();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].x).toEqual(200);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  h.app.actionManager.executeAction(actionAlignHorizontallyCentered);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(50);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(150);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].x).toEqual(100);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function createAndSelectTwoGroups() {
 | 
	
		
			
				|  |  | +  UI.clickTool("rectangle");
 | 
	
		
			
				|  |  | +  mouse.down();
 | 
	
		
			
				|  |  | +  mouse.up(100, 100);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  UI.clickTool("rectangle");
 | 
	
		
			
				|  |  | +  mouse.down(0, 0);
 | 
	
		
			
				|  |  | +  mouse.up(100, 100);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Select the first element.
 | 
	
		
			
				|  |  | +  // The second rectangle is already selected because it was the last element created
 | 
	
		
			
				|  |  | +  mouse.reset();
 | 
	
		
			
				|  |  | +  Keyboard.withModifierKeys({ shift: true }, () => {
 | 
	
		
			
				|  |  | +    mouse.click();
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  h.app.actionManager.executeAction(actionGroup);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  mouse.reset();
 | 
	
		
			
				|  |  | +  UI.clickTool("rectangle");
 | 
	
		
			
				|  |  | +  mouse.down(200, 200);
 | 
	
		
			
				|  |  | +  mouse.up(100, 100);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  UI.clickTool("rectangle");
 | 
	
		
			
				|  |  | +  mouse.down();
 | 
	
		
			
				|  |  | +  mouse.up(100, 100);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  mouse.restorePosition(200, 200);
 | 
	
		
			
				|  |  | +  Keyboard.withModifierKeys({ shift: true }, () => {
 | 
	
		
			
				|  |  | +    mouse.click();
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  h.app.actionManager.executeAction(actionGroup);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Select the first group.
 | 
	
		
			
				|  |  | +  // The second group is already selected because it was the last group created
 | 
	
		
			
				|  |  | +  mouse.reset();
 | 
	
		
			
				|  |  | +  Keyboard.withModifierKeys({ shift: true }, () => {
 | 
	
		
			
				|  |  | +    mouse.click();
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +it("aligns two groups correctly to the top", () => {
 | 
	
		
			
				|  |  | +  createAndSelectTwoGroups();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].y).toEqual(200);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[3].y).toEqual(300);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  h.app.actionManager.executeAction(actionAlignTop);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].y).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[3].y).toEqual(100);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +it("aligns two groups correctly to the bottom", () => {
 | 
	
		
			
				|  |  | +  createAndSelectTwoGroups();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].y).toEqual(200);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[3].y).toEqual(300);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  h.app.actionManager.executeAction(actionAlignBottom);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(200);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(300);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].y).toEqual(200);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[3].y).toEqual(300);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +it("aligns two groups correctly to the left", () => {
 | 
	
		
			
				|  |  | +  createAndSelectTwoGroups();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].x).toEqual(200);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[3].x).toEqual(300);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  h.app.actionManager.executeAction(actionAlignLeft);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].x).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[3].x).toEqual(100);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +it("aligns two groups correctly to the right", () => {
 | 
	
		
			
				|  |  | +  createAndSelectTwoGroups();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].x).toEqual(200);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[3].x).toEqual(300);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  h.app.actionManager.executeAction(actionAlignRight);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(200);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(300);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].x).toEqual(200);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[3].x).toEqual(300);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +it("centers two groups correctly vertically", () => {
 | 
	
		
			
				|  |  | +  createAndSelectTwoGroups();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].y).toEqual(200);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[3].y).toEqual(300);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  h.app.actionManager.executeAction(actionAlignVerticallyCentered);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(200);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].y).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[3].y).toEqual(200);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +it("centers two groups correctly horizontally", () => {
 | 
	
		
			
				|  |  | +  createAndSelectTwoGroups();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].x).toEqual(200);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[3].x).toEqual(300);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  h.app.actionManager.executeAction(actionAlignHorizontallyCentered);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(200);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].x).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[3].x).toEqual(200);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function createAndSelectNestedGroupAndRectangle() {
 | 
	
		
			
				|  |  | +  UI.clickTool("rectangle");
 | 
	
		
			
				|  |  | +  mouse.down();
 | 
	
		
			
				|  |  | +  mouse.up(100, 100);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  UI.clickTool("rectangle");
 | 
	
		
			
				|  |  | +  mouse.down(0, 0);
 | 
	
		
			
				|  |  | +  mouse.up(100, 100);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Select the first element.
 | 
	
		
			
				|  |  | +  // The second rectangle is already reselected because it was the last element created
 | 
	
		
			
				|  |  | +  mouse.reset();
 | 
	
		
			
				|  |  | +  Keyboard.withModifierKeys({ shift: true }, () => {
 | 
	
		
			
				|  |  | +    mouse.click();
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Create first group of rectangles
 | 
	
		
			
				|  |  | +  h.app.actionManager.executeAction(actionGroup);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  mouse.reset();
 | 
	
		
			
				|  |  | +  UI.clickTool("rectangle");
 | 
	
		
			
				|  |  | +  mouse.down(200, 200);
 | 
	
		
			
				|  |  | +  mouse.up(100, 100);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Add group to current selection
 | 
	
		
			
				|  |  | +  mouse.restorePosition(0, 0);
 | 
	
		
			
				|  |  | +  Keyboard.withModifierKeys({ shift: true }, () => {
 | 
	
		
			
				|  |  | +    mouse.click();
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Create the nested group
 | 
	
		
			
				|  |  | +  h.app.actionManager.executeAction(actionGroup);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  mouse.reset();
 | 
	
		
			
				|  |  | +  UI.clickTool("rectangle");
 | 
	
		
			
				|  |  | +  mouse.down(300, 300);
 | 
	
		
			
				|  |  | +  mouse.up(100, 100);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Select the nested group, the rectangle is already selected
 | 
	
		
			
				|  |  | +  mouse.reset();
 | 
	
		
			
				|  |  | +  Keyboard.withModifierKeys({ shift: true }, () => {
 | 
	
		
			
				|  |  | +    mouse.click();
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +it("aligns nested group and other element correctly to the top", () => {
 | 
	
		
			
				|  |  | +  createAndSelectNestedGroupAndRectangle();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].y).toEqual(200);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[3].y).toEqual(300);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  h.app.actionManager.executeAction(actionAlignTop);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].y).toEqual(200);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[3].y).toEqual(0);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +it("aligns nested group and other element correctly to the bottom", () => {
 | 
	
		
			
				|  |  | +  createAndSelectNestedGroupAndRectangle();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].y).toEqual(200);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[3].y).toEqual(300);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  h.app.actionManager.executeAction(actionAlignBottom);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(200);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].y).toEqual(300);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[3].y).toEqual(300);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +it("aligns nested group and other element correctly to the left", () => {
 | 
	
		
			
				|  |  | +  createAndSelectNestedGroupAndRectangle();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].x).toEqual(200);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[3].x).toEqual(300);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  h.app.actionManager.executeAction(actionAlignLeft);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].x).toEqual(200);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[3].x).toEqual(0);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +it("aligns nested group and other element correctly to the right", () => {
 | 
	
		
			
				|  |  | +  createAndSelectNestedGroupAndRectangle();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].x).toEqual(200);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[3].x).toEqual(300);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  h.app.actionManager.executeAction(actionAlignRight);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(200);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].x).toEqual(300);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[3].x).toEqual(300);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +it("centers nested group and other element correctly vertically", () => {
 | 
	
		
			
				|  |  | +  createAndSelectNestedGroupAndRectangle();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].y).toEqual(200);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[3].y).toEqual(300);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  h.app.actionManager.executeAction(actionAlignVerticallyCentered);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].y).toEqual(50);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].y).toEqual(150);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].y).toEqual(250);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[3].y).toEqual(150);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +it("centers nested group and other element correctly horizontally", () => {
 | 
	
		
			
				|  |  | +  createAndSelectNestedGroupAndRectangle();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(100);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].x).toEqual(200);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[3].x).toEqual(300);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  h.app.actionManager.executeAction(actionAlignHorizontallyCentered);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[0].x).toEqual(50);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[1].x).toEqual(150);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[2].x).toEqual(250);
 | 
	
		
			
				|  |  | +  expect(API.getSelectedElements()[3].x).toEqual(150);
 | 
	
		
			
				|  |  | +});
 |