mirror of
				https://github.com/excalidraw/excalidraw.git
				synced 2025-11-03 20:34:40 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			129 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import {
 | 
						|
  distributeHorizontally,
 | 
						|
  distributeVertically,
 | 
						|
} from "@excalidraw/excalidraw/actions";
 | 
						|
import { defaultLang, setLanguage } from "@excalidraw/excalidraw/i18n";
 | 
						|
import { Excalidraw } from "@excalidraw/excalidraw";
 | 
						|
 | 
						|
import { API } from "@excalidraw/excalidraw/tests/helpers/api";
 | 
						|
import { UI, Pointer, Keyboard } from "@excalidraw/excalidraw/tests/helpers/ui";
 | 
						|
import {
 | 
						|
  act,
 | 
						|
  unmountComponent,
 | 
						|
  render,
 | 
						|
} from "@excalidraw/excalidraw/tests/test-utils";
 | 
						|
 | 
						|
const mouse = new Pointer("mouse");
 | 
						|
 | 
						|
// Scenario: three rectangles that will be distributed with gaps
 | 
						|
const createAndSelectThreeRectanglesWithGap = () => {
 | 
						|
  UI.clickTool("rectangle");
 | 
						|
  mouse.down();
 | 
						|
  mouse.up(100, 100);
 | 
						|
  mouse.reset();
 | 
						|
 | 
						|
  UI.clickTool("rectangle");
 | 
						|
  mouse.down(10, 10);
 | 
						|
  mouse.up(100, 100);
 | 
						|
  mouse.reset();
 | 
						|
 | 
						|
  UI.clickTool("rectangle");
 | 
						|
  mouse.down(300, 300);
 | 
						|
  mouse.up(100, 100);
 | 
						|
  mouse.reset();
 | 
						|
 | 
						|
  // Last rectangle is selected by default
 | 
						|
  Keyboard.withModifierKeys({ shift: true }, () => {
 | 
						|
    mouse.click(0, 10);
 | 
						|
    mouse.click(10, 0);
 | 
						|
  });
 | 
						|
};
 | 
						|
 | 
						|
// Scenario: three rectangles that will be distributed by their centers
 | 
						|
const createAndSelectThreeRectanglesWithoutGap = () => {
 | 
						|
  UI.clickTool("rectangle");
 | 
						|
  mouse.down();
 | 
						|
  mouse.up(100, 100);
 | 
						|
  mouse.reset();
 | 
						|
 | 
						|
  UI.clickTool("rectangle");
 | 
						|
  mouse.down(10, 10);
 | 
						|
  mouse.up(200, 200);
 | 
						|
  mouse.reset();
 | 
						|
 | 
						|
  UI.clickTool("rectangle");
 | 
						|
  mouse.down(200, 200);
 | 
						|
  mouse.up(100, 100);
 | 
						|
  mouse.reset();
 | 
						|
 | 
						|
  // Last rectangle is selected by default
 | 
						|
  Keyboard.withModifierKeys({ shift: true }, () => {
 | 
						|
    mouse.click(0, 10);
 | 
						|
    mouse.click(10, 0);
 | 
						|
  });
 | 
						|
};
 | 
						|
 | 
						|
describe("distributing", () => {
 | 
						|
  beforeEach(async () => {
 | 
						|
    unmountComponent();
 | 
						|
    mouse.reset();
 | 
						|
 | 
						|
    await act(() => {
 | 
						|
      return setLanguage(defaultLang);
 | 
						|
    });
 | 
						|
    await render(<Excalidraw handleKeyboardGlobally={true} />);
 | 
						|
  });
 | 
						|
 | 
						|
  it("should distribute selected elements horizontally", async () => {
 | 
						|
    createAndSelectThreeRectanglesWithGap();
 | 
						|
    expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
						|
    expect(API.getSelectedElements()[1].x).toEqual(10);
 | 
						|
    expect(API.getSelectedElements()[2].x).toEqual(300);
 | 
						|
 | 
						|
    API.executeAction(distributeHorizontally);
 | 
						|
 | 
						|
    expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
						|
    expect(API.getSelectedElements()[1].x).toEqual(150);
 | 
						|
    expect(API.getSelectedElements()[2].x).toEqual(300);
 | 
						|
  });
 | 
						|
 | 
						|
  it("should distribute selected elements vertically", async () => {
 | 
						|
    createAndSelectThreeRectanglesWithGap();
 | 
						|
    expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
						|
    expect(API.getSelectedElements()[1].y).toEqual(10);
 | 
						|
    expect(API.getSelectedElements()[2].y).toEqual(300);
 | 
						|
 | 
						|
    API.executeAction(distributeVertically);
 | 
						|
 | 
						|
    expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
						|
    expect(API.getSelectedElements()[1].y).toEqual(150);
 | 
						|
    expect(API.getSelectedElements()[2].y).toEqual(300);
 | 
						|
  });
 | 
						|
 | 
						|
  it("should distribute selected elements horizontally based on their centers", async () => {
 | 
						|
    createAndSelectThreeRectanglesWithoutGap();
 | 
						|
    expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
						|
    expect(API.getSelectedElements()[1].x).toEqual(10);
 | 
						|
    expect(API.getSelectedElements()[2].x).toEqual(200);
 | 
						|
 | 
						|
    API.executeAction(distributeHorizontally);
 | 
						|
 | 
						|
    expect(API.getSelectedElements()[0].x).toEqual(0);
 | 
						|
    expect(API.getSelectedElements()[1].x).toEqual(50);
 | 
						|
    expect(API.getSelectedElements()[2].x).toEqual(200);
 | 
						|
  });
 | 
						|
 | 
						|
  it("should distribute selected elements vertically with based on their centers", async () => {
 | 
						|
    createAndSelectThreeRectanglesWithoutGap();
 | 
						|
    expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
						|
    expect(API.getSelectedElements()[1].y).toEqual(10);
 | 
						|
    expect(API.getSelectedElements()[2].y).toEqual(200);
 | 
						|
 | 
						|
    API.executeAction(distributeVertically);
 | 
						|
 | 
						|
    expect(API.getSelectedElements()[0].y).toEqual(0);
 | 
						|
    expect(API.getSelectedElements()[1].y).toEqual(50);
 | 
						|
    expect(API.getSelectedElements()[2].y).toEqual(200);
 | 
						|
  });
 | 
						|
});
 |