42 lines
1.2 KiB
TypeScript
42 lines
1.2 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import { sumMoney } from "./decimal";
|
|
|
|
describe("sumMoney", () => {
|
|
it("adds exact signed decimals independently per currency", () => {
|
|
expect(sumMoney([
|
|
{ currency: "RUB", value: "0.1" },
|
|
{ currency: "USD", value: "0.01" },
|
|
{ currency: "RUB", value: "0.2" },
|
|
{ currency: "RUB", value: "-1500000.45" },
|
|
{ currency: "USD", value: "-0.02" },
|
|
{ currency: "RUB", value: "200" },
|
|
])).toEqual([
|
|
{ currency: "RUB", value: "-1499800.15" },
|
|
{ currency: "USD", value: "-0.01" },
|
|
]);
|
|
});
|
|
|
|
it("preserves significant fractional digits and a compensated zero", () => {
|
|
expect(sumMoney([
|
|
{ currency: "RUB", value: "100.5" },
|
|
{ currency: "RUB", value: "49.50" },
|
|
{ currency: "RUB", value: "0.005" },
|
|
])).toEqual([{ currency: "RUB", value: "150.005" }]);
|
|
expect(sumMoney([
|
|
{ currency: "RUB", value: "100" },
|
|
{ currency: "RUB", value: "-100" },
|
|
])).toEqual([{ currency: "RUB", value: "0" }]);
|
|
});
|
|
|
|
it.each(["", ".", "1.2.3", "not-a-number"])(
|
|
"rejects malformed amount %s instead of treating it as zero",
|
|
(value) => {
|
|
expect(sumMoney([
|
|
{ currency: "RUB", value: "100" },
|
|
{ currency: "RUB", value },
|
|
])).toBeNull();
|
|
},
|
|
);
|
|
});
|