mirror of
https://github.com/Ku6epXBOCTuK/easy-png-tools.git
synced 2026-11-13 17:08:20 +00:00
110 lines
3.3 KiB
TypeScript
110 lines
3.3 KiB
TypeScript
import { afterEach, describe, expect, it } from "vitest";
|
||
import { TOOLS } from "../registry";
|
||
import { setLocale } from "./locale.svelte";
|
||
import {
|
||
searchTools,
|
||
toolDescription,
|
||
toolTitle,
|
||
verdictText,
|
||
} from "./schema-tool-strings";
|
||
|
||
afterEach(() => {
|
||
setLocale("ru");
|
||
});
|
||
|
||
const ids = (tools: { id: string }[]) => tools.map((t) => t.id);
|
||
|
||
describe("searchTools (кросс-языковой поиск каталога)", () => {
|
||
it("пустой запрос возвращает весь каталог", () => {
|
||
expect(searchTools(TOOLS, "")).toHaveLength(TOOLS.length);
|
||
expect(searchTools(TOOLS, " ")).toHaveLength(TOOLS.length);
|
||
});
|
||
|
||
it("находит ru-название, даже когда локаль en", () => {
|
||
setLocale("en");
|
||
expect(ids(searchTools(TOOLS, "обрез"))).toContain("crop-png");
|
||
expect(ids(searchTools(TOOLS, "пустые поля"))).toContain(
|
||
"trim-empty-space-png",
|
||
);
|
||
});
|
||
|
||
it("находит en-название, даже когда локаль ru", () => {
|
||
expect(ids(searchTools(TOOLS, "resize"))).toContain("resize-png");
|
||
expect(ids(searchTools(TOOLS, "round corners"))).toContain(
|
||
"round-corners-png",
|
||
);
|
||
});
|
||
|
||
it("находит по id", () => {
|
||
expect(ids(searchTools(TOOLS, "crop png"))).toContain("crop-png");
|
||
});
|
||
|
||
it("ё и е — один запрос", () => {
|
||
const byYo = searchTools(TOOLS, "чёрно");
|
||
const byYe = searchTools(TOOLS, "черно");
|
||
expect(ids(byYo)).toEqual(ids(byYe));
|
||
});
|
||
|
||
it("нет совпадения — пустой список", () => {
|
||
expect(searchTools(TOOLS, "квантовый тостер")).toEqual([]);
|
||
});
|
||
});
|
||
|
||
describe("metadata fallback", () => {
|
||
it("uses registry title and description in the base locale", () => {
|
||
setLocale("en");
|
||
for (const tool of TOOLS) {
|
||
expect(toolTitle(tool), `${tool.id}: title`).toBe(tool.title);
|
||
expect(toolDescription(tool), `${tool.id}: description`).toBe(
|
||
tool.description,
|
||
);
|
||
}
|
||
});
|
||
});
|
||
|
||
describe("verdictText (вердикт с vars)", () => {
|
||
it("интерполирует {vars} в обоих локалях", () => {
|
||
setLocale("ru");
|
||
expect(verdictText("png-file-size", "line", { kb: "12.3" })).toBe(
|
||
"Размер PNG: 12.3 КБ",
|
||
);
|
||
setLocale("en");
|
||
expect(verdictText("png-file-size", "line", { kb: "12.3" })).toBe(
|
||
"PNG size: 12.3 KB",
|
||
);
|
||
});
|
||
|
||
it("без vars возвращает ключ как есть при отсутствии в словаре", () => {
|
||
expect(verdictText("png-file-size", "нет-такого")).toBe("нет-такого");
|
||
});
|
||
|
||
it.each([
|
||
[
|
||
"verify-is-png",
|
||
"verifyYes",
|
||
"Да — сигнатура настоящего PNG.",
|
||
"Yes — this is a valid PNG signature.",
|
||
],
|
||
[
|
||
"png-is-transparent",
|
||
"transparentNo",
|
||
"Нет — все пиксели полностью непрозрачны.",
|
||
"No — all pixels are fully opaque.",
|
||
],
|
||
[
|
||
"png-orientation",
|
||
"orientationLandscape",
|
||
"Ландшафт — ширина больше высоты.",
|
||
"Landscape — width is greater than height.",
|
||
],
|
||
])(
|
||
"переводит verdict %s/%s в обеих локалях",
|
||
(toolId, key, ruText, enText) => {
|
||
setLocale("ru");
|
||
expect(verdictText(toolId, key)).toBe(ruText);
|
||
setLocale("en");
|
||
expect(verdictText(toolId, key)).toBe(enText);
|
||
},
|
||
);
|
||
});
|