import assert from "node:assert/strict"; import test from "node:test"; import { activityLevel, plural } from "../../src/lib/presentation.ts"; import { fishVisualFamily } from "../../src/lib/fish-visuals.ts"; import { tackleVisualKind, tackleVisualTone } from "../../src/lib/tackle-visuals.ts"; import { waterbodyVisual } from "../../src/lib/waterbody-visuals.ts"; test("activity levels share one complete 0-100 scale", () => { assert.deepEqual( [0, 39, 40, 59, 60, 79, 80, 100].map(score => activityLevel(score).short), ["Низкий", "Низкий", "Средний", "Средний", "Высокий", "Высокий", "Очень высокий", "Очень высокий"], ); }); test("Russian plural forms cover common and exceptional endings", () => { const forms = ["точка", "точки", "точек"] as const; assert.deepEqual( [0, 1, 2, 5, 11, 21, 22, 25].map(number => plural(number, forms)), ["точек", "точка", "точки", "точек", "точек", "точка", "точки", "точек"], ); }); test("fish visual families follow body type instead of a name hash", () => { assert.deepEqual( ["Щука", "Озёрная форель", "Карп", "Окунь", "Сом", "Угорь", "Палтус", "Треска", "Неизвестная рыба"].map(fishVisualFamily), ["pike", "salmonid", "cyprinid", "perch", "catfish", "eel", "flatfish", "marine", "generic"], ); }); test("tackle glyphs only infer a type from explicit name terms", () => { assert.deepEqual( ["Spiker #2", "Minnow 80F", "Salmon T1 Shad", "Клубничный бойл", "Червь", "Карповый монтаж", "Model 42", null].map(tackleVisualKind), ["spinner", "wobbler", "soft", "boilie", "worm", "rig", "unknown", "unknown"], ); assert.equal(tackleVisualTone("Spiker #2"), tackleVisualTone("spiker #2")); }); test("waterbody fingerprints are stable, bounded and entity-specific", () => { const kuori = waterbodyVisual("kuori"); assert.deepEqual(kuori, waterbodyVisual(" KUORI ")); assert.notDeepEqual(kuori, waterbodyVisual("vyunok")); assert.ok(kuori.shore >= 0 && kuori.shore < 8); assert.ok(kuori.waves >= 1 && kuori.waves <= 3); assert.ok(kuori.markerX >= 32 && kuori.markerX <= 90); assert.ok(kuori.markerY >= 18 && kuori.markerY <= 40); assert.match(kuori.code, /^[0-9A-Z]{2}$/); });