* init * add: vite dev build working * fix: href serving from public * feat: add ejs plugin * feat: migrated env files and ejs templating * chore: add types related to envs * chore: add vite-env types * feat: support vite pwa * chore: upgrade vite pwa * chore: pin node version to 16.18.1 * chore: preserve use of nodejs 14 * refactor: preserve REACT_APP as env prefix * chore: support esm environment variables * fix ts config * use VITE prefix and remove vite-plugin-env-compatible * introduce import-meta-loader for building pacakge as webpack isn't compatible with import.meta syntax * lint * remove import.meta.env in main.js * set debug flag to false * migrate to vitest and use jest-canvas-mock 2.4.0 so its comp atible with vite * integrate vitest-ui * fix most of teh test * snaps * Add script for testing with vite ui * fix all tests related to mocking * fix more test * fix more * fix flip.test.tsx * fix contentxmenu snaps * fix regression snaps * fix excalidraw.test.tsx and this makes all tests finally pass :) * use node 16 * specify node version * use node 16 in lint as well * fix mobile.test.tsx * use node 16 * add style-loader * upgrade to node 18 * fix lint package.json * support eslint with vite * fix lint * fix lint * fix ts * remove pwa/sw stuff * use env vars in EJS the vite way * fix lint * move remainig jest mock/spy to vite * don't cache locales * fix regex * add fonts cache * tweak * add custom service worker * upgrade vite and create font cache again * cache fonts.css and locales * tweak * use manifestTransforms for filtering locales * use assets js pattern for locales * add font.css to globIgnore so its pushed to fonts cache * create a separate chunk for locales with rollup * remove manifestTransforms and fix glob pattern for locales to filter from workbox pre-cache * push sourcemaps in production * add comments in config * lint * use node 18 * disable pwa in dev * fix * fix * increase limit of bundle * upgrade vite-pwa to latest * remove public/workbox so workbox assets are not precached * fon't club en.json and percentages.json with manual locales chunk to fix first load+offline mode * tweak regex * remove happy-dom as its not used * add comment * use any instead of ts-ignore * cleanup * remove jest-canvas-mock resolution as vite-canvas-mock was patched locking deps at 2.4.0 * use same theme color present in entry point --------- Co-authored-by: Weslley Braga <weslley@bambee.com> Co-authored-by: dwelle <luzar.david@gmail.com>
153 lines
5.3 KiB
TypeScript
153 lines
5.3 KiB
TypeScript
import ReactDOM from "react-dom";
|
|
import { render } from "./test-utils";
|
|
import App from "../components/App";
|
|
import * as Renderer from "../renderer/renderScene";
|
|
import { reseed } from "../random";
|
|
import { UI, Keyboard } from "./helpers/ui";
|
|
import { resize } from "./utils";
|
|
import { ExcalidrawTextElement } from "../element/types";
|
|
import ExcalidrawApp from "../excalidraw-app";
|
|
import { API } from "./helpers/api";
|
|
import { KEYS } from "../keys";
|
|
import { vi } from "vitest";
|
|
|
|
// Unmount ReactDOM from root
|
|
ReactDOM.unmountComponentAtNode(document.getElementById("root")!);
|
|
|
|
const renderScene = vi.spyOn(Renderer, "renderScene");
|
|
beforeEach(() => {
|
|
localStorage.clear();
|
|
renderScene.mockClear();
|
|
reseed(7);
|
|
});
|
|
|
|
const { h } = window;
|
|
|
|
describe("resize rectangle ellipses and diamond elements", () => {
|
|
const elemData = {
|
|
x: 0,
|
|
y: 0,
|
|
width: 100,
|
|
height: 100,
|
|
};
|
|
// Value for irrelevant cursor movements
|
|
const _ = 234;
|
|
|
|
it.each`
|
|
handle | move | dimensions | topLeft
|
|
${"n"} | ${[_, -100]} | ${[100, 200]} | ${[elemData.x, -100]}
|
|
${"s"} | ${[_, 39]} | ${[100, 139]} | ${[elemData.x, elemData.x]}
|
|
${"e"} | ${[-20, _]} | ${[80, 100]} | ${[elemData.x, elemData.y]}
|
|
${"w"} | ${[-20, _]} | ${[120, 100]} | ${[-20, elemData.y]}
|
|
${"ne"} | ${[5, 55]} | ${[105, 45]} | ${[elemData.x, 55]}
|
|
${"se"} | ${[-30, -10]} | ${[70, 90]} | ${[elemData.x, elemData.y]}
|
|
${"nw"} | ${[-300, -200]} | ${[400, 300]} | ${[-300, -200]}
|
|
${"sw"} | ${[40, -20]} | ${[60, 80]} | ${[40, 0]}
|
|
`(
|
|
"resizes with handle $handle",
|
|
async ({ handle, move, dimensions, topLeft }) => {
|
|
await render(<App />);
|
|
const rectangle = UI.createElement("rectangle", elemData);
|
|
resize(rectangle, handle, move);
|
|
const element = h.elements[0];
|
|
expect([element.width, element.height]).toEqual(dimensions);
|
|
expect([element.x, element.y]).toEqual(topLeft);
|
|
},
|
|
);
|
|
|
|
it.each`
|
|
handle | move | dimensions | topLeft
|
|
${"n"} | ${[_, -100]} | ${[200, 200]} | ${[-50, -100]}
|
|
${"nw"} | ${[-300, -200]} | ${[400, 400]} | ${[-300, -300]}
|
|
${"sw"} | ${[40, -20]} | ${[80, 80]} | ${[20, 0]}
|
|
`(
|
|
"resizes with fixed side ratios on handle $handle",
|
|
async ({ handle, move, dimensions, topLeft }) => {
|
|
await render(<App />);
|
|
const rectangle = UI.createElement("rectangle", elemData);
|
|
resize(rectangle, handle, move, { shift: true });
|
|
const element = h.elements[0];
|
|
expect([element.width, element.height]).toEqual(dimensions);
|
|
expect([element.x, element.y]).toEqual(topLeft);
|
|
},
|
|
);
|
|
|
|
it.each`
|
|
handle | move | dimensions | topLeft
|
|
${"nw"} | ${[0, 120]} | ${[100, 100]} | ${[0, 100]}
|
|
${"ne"} | ${[-120, 0]} | ${[100, 100]} | ${[-100, 0]}
|
|
${"sw"} | ${[200, -200]} | ${[100, 100]} | ${[100, -100]}
|
|
${"n"} | ${[_, 150]} | ${[50, 50]} | ${[25, 100]}
|
|
`(
|
|
"Flips while resizing and keeping side ratios on handle $handle",
|
|
async ({ handle, move, dimensions, topLeft }) => {
|
|
await render(<App />);
|
|
const rectangle = UI.createElement("rectangle", elemData);
|
|
resize(rectangle, handle, move, { shift: true });
|
|
const element = h.elements[0];
|
|
expect([element.width, element.height]).toEqual(dimensions);
|
|
expect([element.x, element.y]).toEqual(topLeft);
|
|
},
|
|
);
|
|
|
|
it.each`
|
|
handle | move | dimensions | topLeft
|
|
${"ne"} | ${[50, -100]} | ${[200, 300]} | ${[-50, -100]}
|
|
${"s"} | ${[_, -20]} | ${[100, 60]} | ${[0, 20]}
|
|
`(
|
|
"Resizes from center on handle $handle",
|
|
async ({ handle, move, dimensions, topLeft }) => {
|
|
await render(<App />);
|
|
const rectangle = UI.createElement("rectangle", elemData);
|
|
resize(rectangle, handle, move, { alt: true });
|
|
const element = h.elements[0];
|
|
expect([element.width, element.height]).toEqual(dimensions);
|
|
expect([element.x, element.y]).toEqual(topLeft);
|
|
},
|
|
);
|
|
|
|
it.each`
|
|
handle | move | dimensions | topLeft
|
|
${"nw"} | ${[100, 120]} | ${[140, 140]} | ${[-20, -20]}
|
|
${"e"} | ${[-130, _]} | ${[160, 160]} | ${[-30, -30]}
|
|
`(
|
|
"Resizes from center, flips and keeps side rations on handle $handle",
|
|
async ({ handle, move, dimensions, topLeft }) => {
|
|
await render(<App />);
|
|
const rectangle = UI.createElement("rectangle", elemData);
|
|
resize(rectangle, handle, move, { alt: true, shift: true });
|
|
const element = h.elements[0];
|
|
expect([element.width, element.height]).toEqual(dimensions);
|
|
expect([element.x, element.y]).toEqual(topLeft);
|
|
},
|
|
);
|
|
});
|
|
|
|
describe("Test text element", () => {
|
|
it("should update font size via keyboard", async () => {
|
|
await render(<ExcalidrawApp />);
|
|
|
|
const textElement = API.createElement({
|
|
type: "text",
|
|
text: "abc",
|
|
});
|
|
|
|
window.h.elements = [textElement];
|
|
|
|
API.setSelectedElements([textElement]);
|
|
|
|
const origFontSize = textElement.fontSize;
|
|
|
|
Keyboard.withModifierKeys({ shift: true, ctrl: true }, () => {
|
|
Keyboard.keyDown(KEYS.CHEVRON_RIGHT);
|
|
expect((window.h.elements[0] as ExcalidrawTextElement).fontSize).toBe(
|
|
origFontSize * 1.1,
|
|
);
|
|
Keyboard.keyDown(KEYS.CHEVRON_LEFT);
|
|
expect((window.h.elements[0] as ExcalidrawTextElement).fontSize).toBe(
|
|
origFontSize,
|
|
);
|
|
});
|
|
});
|
|
});
|