import { test } from "node:test"; import assert from "node:assert/strict"; import { formatMoney, formatAmount, formatMoneyCompact, formatPct, formatDelta, formatPp, deltaTone, formatRate, formatDate, formatMonth, } from "./format.ts"; // Spazio non separabile e segno meno tipografico, come nelle regole del design system. const S = "\u00A0"; const M = "\u2212"; test("importi in EN: simbolo davanti, 2 decimali", () => { assert.equal(formatMoney(1234.56, "EUR"), `€${S}1,234.56`); assert.equal(formatMoney(-8420, "EUR"), `${M}€${S}8,420.00`); assert.equal(formatMoney(31980, "USD"), `$${S}31,980.00`); }); test("importi in IT: simbolo dopo, migliaia sempre raggruppate", () => { assert.equal(formatMoney(1234.56, "EUR", { locale: "it" }), `1.234,56${S}€`); assert.equal(formatMoney(-8420, "EUR", { locale: "it" }), `${M}8.420,00${S}€`); }); test("zero è 0.00, mai −0.00; dato mancante è un trattino", () => { assert.equal(formatMoney(-0.001, "EUR"), `€${S}0.00`); assert.equal(formatMoney(null, "EUR"), "—"); assert.equal(formatAmount(undefined), "—"); }); test("righe di costo in una sezione (−): solo il valore assoluto", () => { assert.equal(formatMoney(-8420, "EUR", { magnitude: true }), `€${S}8,420.00`); assert.equal(formatAmount(-8420, { magnitude: true }), "8,420.00"); }); test("KPI compatti", () => { assert.equal(formatMoneyCompact(74215.4, "EUR"), `€${S}74.2k`); assert.equal(formatMoneyCompact(1240000, "EUR"), `€${S}1.24M`); assert.equal(formatMoneyCompact(74215.4, "EUR", { locale: "it" }), `74,2k${S}€`); assert.equal(formatMoneyCompact(1240000, "EUR", { locale: "it" }), `1,24${S}Mln${S}€`); assert.equal(formatMoneyCompact(-4100, "EUR"), `${M}€${S}4.1k`); assert.equal(formatMoneyCompact(840, "EUR"), `€${S}840`); assert.equal(formatMoneyCompact(999960, "EUR"), `€${S}1.00M`); }); test("percentuali e delta", () => { assert.equal(formatPct(18.44), "18.4%"); assert.equal(formatPct(18.44, { locale: "it" }), "18,4%"); assert.equal(formatDelta(108.3, 100), "+8.3%"); assert.equal(formatDelta(98.4, 100), `${M}1.6%`); assert.equal(formatDelta(50, 0), "n/a"); assert.equal(formatDelta(20000, 1), ">999%"); assert.equal(formatPp(-1.6), `${M}1.6${S}pp`); assert.equal(formatPp(-1.6, { locale: "it" }), `${M}1,6${S}p.p.`); }); test("colore del delta: per i costi salire è negativo", () => { assert.equal(deltaTone(110, 100), "positive"); assert.equal(deltaTone(110, 100, false), "negative"); assert.equal(deltaTone(100, 0), "neutral"); }); test("tasso di cambio sempre a 6 decimali", () => { assert.equal(formatRate(1.08642), "1.086420"); assert.equal(formatRate(1.08642, { locale: "it" }), "1,086420"); assert.equal(formatRate(null), "—"); }); test("date senza slash e senza slittamento di fuso", () => { assert.equal(formatDate("2026-03-12"), `12${S}Mar${S}2026`); assert.equal(formatDate("2026-03-12", { locale: "it" }), `12${S}mar${S}2026`); assert.equal(formatDate(null), "—"); assert.equal(formatMonth(2026, 2), `Mar${S}2026`); });