54 lines
1.9 KiB
TypeScript
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);
|
|
});
|
|
});
|