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}`);
  });
});
