import { describe, expect, it } from "vitest"; import { convertDataUnit, convertNumberBase, convertUnit, formatBigIntRadix, parseBigIntRadix, unitDimension, } from "../../src/helpers"; describe("BigInt number bases", () => { it("parses and formats exact large integers from base 2 through 36", () => { expect(parseBigIntRadix("-0xFF_FF", 16)).toBe(-65_535n); expect(convertNumberBase("11111111", 2, 16, { uppercase: true })).toBe( "FF", ); expect( formatBigIntRadix(0x1234abcdn, 16, { prefix: true, groupSize: 4 }), ).toBe("0x1234_abcd"); expect(parseBigIntRadix("zz", 36)).toBe(1295n); }); it("rejects invalid radices, digits, separators, and digit bombs", () => { expect(() => parseBigIntRadix("2", 2)).toThrow(/Digit/u); expect(() => parseBigIntRadix("10", 1)).toThrow(/Radix/u); expect(() => parseBigIntRadix("_1", 10)).toThrow(/separator/u); expect(() => parseBigIntRadix("1234", 10, { maxDigits: 3 })).toThrow( /exceeds/u, ); }); }); describe("unit conversion", () => { it("distinguishes decimal and binary data units", () => { expect(convertDataUnit(1, "MiB", "B")).toBe(1_048_576); expect(convertDataUnit(1, "MB", "B")).toBe(1_000_000); expect(convertDataUnit(8, "b", "B")).toBe(1); expect(() => convertDataUnit(Number.MAX_VALUE, "TB", "b")).toThrow( /finite number range/u, ); }); it("converts compatible physical units and affine temperatures", () => { expect(convertUnit(1, "mi", "km")).toBeCloseTo(1.609344, 12); expect(convertUnit(1, "lb", "kg")).toBeCloseTo(0.45359237, 12); expect(convertUnit(32, "F", "C")).toBeCloseTo(0, 12); expect(convertUnit(0, "C", "K")).toBeCloseTo(273.15, 12); expect(convertUnit(2, "week", "day")).toBe(14); expect(unitDimension("cm")).toBe("length"); expect(() => convertUnit(1, "m", "kg")).toThrow(/Cannot convert/u); }); });