Files
easy-png-tools/web/src/lib/core/textdraw.test.ts
T

85 lines
2.8 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { anchorOrigin, tileGrid, wrapText } from "./textdraw";
const measure = (s: string) => s.length * 10;
describe("anchorOrigin", () => {
it("углы и отступ считаются от краёв", () => {
expect(anchorOrigin("top-left", 100, 50, 400, 300, 30)).toEqual({
x: 30,
y: 30,
});
expect(anchorOrigin("top-right", 100, 50, 400, 300, 30)).toEqual({
x: 270,
y: 30,
});
expect(anchorOrigin("bottom-left", 100, 50, 400, 300, 30)).toEqual({
x: 30,
y: 220,
});
expect(anchorOrigin("bottom-right", 100, 50, 400, 300, 30)).toEqual({
x: 270,
y: 220,
});
});
it("центрирование — ровно половина остатка", () => {
expect(anchorOrigin("center", 100, 50, 401, 301, 0)).toEqual({
x: 150.5,
y: 125.5,
});
expect(anchorOrigin("middle-left", 100, 50, 400, 300, 12)).toEqual({
x: 12,
y: 125,
});
expect(anchorOrigin("top-center", 100, 50, 400, 300, 8)).toEqual({
x: 150,
y: 8,
});
});
});
describe("wrapText", () => {
it("жадно набирает строки в пределах ширины", () => {
// measure: 10px за символ → строка ≤ 120px = 12 символов
expect(wrapText("один два три четыре пять", 120, measure)).toEqual([
"один два три",
"четыре пять",
]);
});
it("слово длиннее ширины уходит на отдельную строку целиком", () => {
expect(
wrapText("короткое сверхдлинноеслово без переносов", 90, measure),
).toEqual(["короткое", "сверхдлинноеслово", "без", "переносов"]);
});
it("пустой и пробельный текст дают пустой массив", () => {
expect(wrapText("", 100, measure)).toEqual([]);
expect(wrapText(" \n\t ", 100, measure)).toEqual([]);
});
});
describe("tileGrid", () => {
it("стабильная сетка с шагом и центрированием", () => {
const pts = tileGrid(200, 200, 0, 60, 60, 80, 24);
expect(pts.length).toBeGreaterThan(0);
const xs = new Set(pts.map((p) => p.x));
const ys = new Set(pts.map((p) => p.y));
expect(xs.size).toBeGreaterThan(1);
expect(ys.size).toBeGreaterThan(1);
});
it("кап защищает от гигантского количества плиток", () => {
const pts = tileGrid(4000, 4000, 45, 8, 8, 100, 40);
expect(pts.length).toBeLessThanOrEqual(2500);
expect(pts.length).toBeGreaterThan(0);
});
it("обычные входные данные не триггерят кап", () => {
const pts = tileGrid(800, 600, 30, 140, 90, 160, 40);
expect(pts.length).toBeLessThanOrEqual(2500);
expect(pts.length).toBeGreaterThan(4);
});
});