import { describe, expect, it } from "vitest";
import { cmToIn, inToCm, kgToLb, lbToKg, mToIn, tToLb, toAxelWholeInches, toAxelWholePounds, weightValueToLb, dimValueToIn, normalizeWeightUnit, normalizeDimUnit, weightUnitAmbiguousMessage } from "@/modules/quote/unit-converter";

describe("unit-converter", () => {
  it("227kg → 500.45lb（ROUND_HALF_UP，JS 浮点 227×2.20462）", () => {
    expect(kgToLb(227)).toBe(500.45);
  });

  it("122cm → 48.03in", () => {
    expect(cmToIn(122)).toBe(48.03);
  });

  it("1.2m → 47.24in", () => {
    expect(mToIn(1.2)).toBe(47.24);
  });

  it("0.5t → 1102.31lb", () => {
    expect(tToLb(0.5)).toBe(1102.31);
  });

  it("120cm 转 axel 尺寸向上取整为 48in", () => {
    expect(toAxelWholeInches(cmToIn(120))).toBe(48);
  });

  it("1.2m 转 axel 尺寸向上取整为 48in", () => {
    expect(toAxelWholeInches(mToIn(1.2))).toBe(48);
  });

  it("500kg 转 axel 重量向上取整为 1103lb", () => {
    expect(toAxelWholePounds(kgToLb(500))).toBe(1103);
  });

  it("0.5t 转 axel 重量向上取整为 1103lb", () => {
    expect(toAxelWholePounds(tToLb(0.5))).toBe(1103);
  });

  it("500lb 不变", () => {
    expect(kgToLb(500 / 2.20462)).toBeCloseTo(500, 0);
  });

  it("lbToKg / inToCm 互逆", () => {
    expect(lbToKg(500)).toBe(226.8);
    expect(inToCm(48)).toBe(121.92);
    expect(kgToLb(lbToKg(500))).toBeCloseTo(500, 1);
    expect(cmToIn(inToCm(48))).toBeCloseTo(48, 1);
  });

  it("normalizeWeightUnit 支持别名，拒绝 ton/tons 歧义", () => {
    expect(normalizeWeightUnit("LBS")).toBe("lb");
    expect(normalizeWeightUnit("tonne")).toBe("t");
    expect(normalizeWeightUnit("tonnes")).toBe("t");
    expect(normalizeWeightUnit("t")).toBe("t");
    expect(normalizeWeightUnit("ton")).toBeNull();
    expect(normalizeWeightUnit("tons")).toBeNull();
    expect(normalizeWeightUnit("stone")).toBeNull();
    expect(weightUnitAmbiguousMessage("ton")).toMatch(/歧义/);
  });

  it("normalizeDimUnit 支持别名", () => {
    expect(normalizeDimUnit("INCH")).toBe("in");
    expect(normalizeDimUnit("meter")).toBe("m");
    expect(normalizeDimUnit("CM")).toBe("cm");
  });

  it("weightValueToLb / dimValueToIn", () => {
    expect(weightValueToLb(500, "kg")).toBe(1102.31);
    expect(weightValueToLb(0.5, "t")).toBe(1102.31);
    expect(dimValueToIn(1.2, "m")).toBe(47.24);
  });
});
