import { describe, expect, it } from "vitest";
import { AREA_UNIT } from "@/lib/config";
import { formatArea, formatNumber } from "@/lib/format/number";
/**
* 数値の表示整形(指示書AN 段階5 / §8-4)。
*
* ★★守っているもの★★
* 1. ★3桁区切りになること★(`341635` は読めない)
* 2. ★丸めは表示だけ・小数第1位を四捨五入★(`CLAUDE.md` §4.3)
* 3. ★`NaN` / `Infinity` を画面に出さないこと★
* 4. ★単位は `AREA_UNIT` から出ること★(`"㎡"` を直書きしていない)
*/
describe("formatNumber", () => {
it("3桁区切りにする", () => {
expect(formatNumber(341635)).toBe("341,635");
expect(formatNumber(494000)).toBe("494,000");
expect(formatNumber(1234567890)).toBe("1,234,567,890");
});
it("区切りが要らない桁はそのまま出す", () => {
expect(formatNumber(0)).toBe("0");
expect(formatNumber(7)).toBe("7");
expect(formatNumber(999)).toBe("999");
expect(formatNumber(1000)).toBe("1,000");
});
it("小数第1位を四捨五入して整数にする", () => {
expect(formatNumber(341635.4)).toBe("341,635");
expect(formatNumber(341635.5)).toBe("341,636");
expect(formatNumber(0.5)).toBe("1");
// ★-0 を "-0" と出さない★
expect(formatNumber(-0.4)).toBe("0");
});
it("負の値も3桁区切りにする", () => {
expect(formatNumber(-341635)).toBe("-341,635");
});
it("有限でない値は - にする(0 と書かない)", () => {
expect(formatNumber(Number.NaN)).toBe("-");
expect(formatNumber(Number.POSITIVE_INFINITY)).toBe("-");
expect(formatNumber(Number.NEGATIVE_INFINITY)).toBe("-");
});
});
describe("formatArea", () => {
it("3桁区切りの数値に単位を付ける", () => {
expect(formatArea(341635)).toBe(`341,635${AREA_UNIT}`);
});
it("単位は設定値から出す(画面に直書きしていない)", () => {
expect(formatArea(0)).toBe(`0${AREA_UNIT}`);
expect(formatArea(0).endsWith(AREA_UNIT)).toBe(true);
});
it("有限でない値でも単位の付いた文字列を返す(∞ を出さない)", () => {
expect(formatArea(Number.POSITIVE_INFINITY)).toBe(`-${AREA_UNIT}`);
});
});