123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- import { getLineHeight } from "@excalidraw/common";
- import { API } from "@excalidraw/excalidraw/tests/helpers/api";
- import { FONT_FAMILY } from "@excalidraw/common";
- import {
- computeContainerDimensionForBoundText,
- getContainerCoords,
- getBoundTextMaxWidth,
- getBoundTextMaxHeight,
- } from "../src/textElement";
- import { detectLineHeight, getLineHeightInPx } from "../src/textMeasurements";
- import type { ExcalidrawTextElementWithContainer } from "../src/types";
- describe("Test measureText", () => {
- describe("Test getContainerCoords", () => {
- const params = { width: 200, height: 100, x: 10, y: 20 };
- it("should compute coords correctly when ellipse", () => {
- const element = API.createElement({
- type: "ellipse",
- ...params,
- });
- expect(getContainerCoords(element)).toEqual({
- x: 44.2893218813452455,
- y: 39.64466094067262,
- });
- });
- it("should compute coords correctly when rectangle", () => {
- const element = API.createElement({
- type: "rectangle",
- ...params,
- });
- expect(getContainerCoords(element)).toEqual({
- x: 15,
- y: 25,
- });
- });
- it("should compute coords correctly when diamond", () => {
- const element = API.createElement({
- type: "diamond",
- ...params,
- });
- expect(getContainerCoords(element)).toEqual({
- x: 65,
- y: 50,
- });
- });
- });
- describe("Test computeContainerDimensionForBoundText", () => {
- const params = {
- width: 178,
- height: 194,
- };
- it("should compute container height correctly for rectangle", () => {
- const element = API.createElement({
- type: "rectangle",
- ...params,
- });
- expect(computeContainerDimensionForBoundText(150, element.type)).toEqual(
- 160,
- );
- });
- it("should compute container height correctly for ellipse", () => {
- const element = API.createElement({
- type: "ellipse",
- ...params,
- });
- expect(computeContainerDimensionForBoundText(150, element.type)).toEqual(
- 226,
- );
- });
- it("should compute container height correctly for diamond", () => {
- const element = API.createElement({
- type: "diamond",
- ...params,
- });
- expect(computeContainerDimensionForBoundText(150, element.type)).toEqual(
- 320,
- );
- });
- });
- describe("Test getBoundTextMaxWidth", () => {
- const params = {
- width: 178,
- height: 194,
- };
- it("should return max width when container is rectangle", () => {
- const container = API.createElement({ type: "rectangle", ...params });
- expect(getBoundTextMaxWidth(container, null)).toBe(168);
- });
- it("should return max width when container is ellipse", () => {
- const container = API.createElement({ type: "ellipse", ...params });
- expect(getBoundTextMaxWidth(container, null)).toBe(116);
- });
- it("should return max width when container is diamond", () => {
- const container = API.createElement({ type: "diamond", ...params });
- expect(getBoundTextMaxWidth(container, null)).toBe(79);
- });
- });
- describe("Test getBoundTextMaxHeight", () => {
- const params = {
- width: 178,
- height: 194,
- id: '"container-id',
- };
- const boundTextElement = API.createElement({
- type: "text",
- id: "text-id",
- x: 560.51171875,
- y: 202.033203125,
- width: 154,
- height: 175,
- fontSize: 20,
- fontFamily: 1,
- text: "Excalidraw is a\nvirtual \nopensource \nwhiteboard for \nsketching \nhand-drawn like\ndiagrams",
- textAlign: "center",
- verticalAlign: "middle",
- containerId: params.id,
- }) as ExcalidrawTextElementWithContainer;
- it("should return max height when container is rectangle", () => {
- const container = API.createElement({ type: "rectangle", ...params });
- expect(getBoundTextMaxHeight(container, boundTextElement)).toBe(184);
- });
- it("should return max height when container is ellipse", () => {
- const container = API.createElement({ type: "ellipse", ...params });
- expect(getBoundTextMaxHeight(container, boundTextElement)).toBe(127);
- });
- it("should return max height when container is diamond", () => {
- const container = API.createElement({ type: "diamond", ...params });
- expect(getBoundTextMaxHeight(container, boundTextElement)).toBe(87);
- });
- it("should return max height when container is arrow", () => {
- const container = API.createElement({
- type: "arrow",
- ...params,
- });
- expect(getBoundTextMaxHeight(container, boundTextElement)).toBe(194);
- });
- it("should return max height when container is arrow and height is less than threshold", () => {
- const container = API.createElement({
- type: "arrow",
- ...params,
- height: 70,
- boundElements: [{ type: "text", id: "text-id" }],
- });
- expect(getBoundTextMaxHeight(container, boundTextElement)).toBe(
- boundTextElement.height,
- );
- });
- });
- });
- const textElement = API.createElement({
- type: "text",
- text: "Excalidraw is a\nvirtual \nopensource \nwhiteboard for \nsketching \nhand-drawn like\ndiagrams",
- fontSize: 20,
- fontFamily: 1,
- height: 175,
- });
- describe("Test detectLineHeight", () => {
- it("should return correct line height", () => {
- expect(detectLineHeight(textElement)).toBe(1.25);
- });
- });
- describe("Test getLineHeightInPx", () => {
- it("should return correct line height", () => {
- expect(
- getLineHeightInPx(textElement.fontSize, textElement.lineHeight),
- ).toBe(25);
- });
- });
- describe("Test getDefaultLineHeight", () => {
- it("should return line height using default font family when not passed", () => {
- //@ts-ignore
- expect(getLineHeight()).toBe(1.25);
- });
- it("should return line height using default font family for unknown font", () => {
- const UNKNOWN_FONT = 5;
- expect(getLineHeight(UNKNOWN_FONT)).toBe(1.25);
- });
- it("should return correct line height", () => {
- expect(getLineHeight(FONT_FAMILY.Cascadia)).toBe(1.2);
- });
- });
|