Files
helper-tools/tests/helpers/numbers-units.test.ts
T
2026-09-01 02:33:45 +02:00

54 lines
1.9 KiB
TypeScript

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