g1t/apps/sudo/app/lib/money.test.ts
| 1 | import assert from "node:assert/strict"; |
| 2 | import { test } from "node:test"; |
| 3 | |
| 4 | import { dollarsField, parseDollars, usd } from "./money.ts"; |
| 5 | |
| 6 | test("dollars read to the cent, and small amounts keep their fractions", () => { |
| 7 | assert.equal(usd(1_250_500_000), "$1,250.50"); |
| 8 | assert.equal(usd(0), "$0.00"); |
| 9 | assert.equal(usd(12_345), "$0.0123"); |
| 10 | assert.equal(usd(-5_000_000), "−$5.00"); |
| 11 | assert.equal(usd(5_000_000, { signed: true }), "+$5.00"); |
| 12 | assert.equal(usd(null), "—"); |
| 13 | }); |
| 14 | |
| 15 | test("typed amounts become micros exactly", () => { |
| 16 | assert.equal(parseDollars("25"), 25_000_000); |
| 17 | assert.equal(parseDollars("$1,250.5"), 1_250_500_000); |
| 18 | assert.equal(parseDollars("0.07"), 70_000); |
| 19 | for (const bad of ["", "-5", "1.234", "abc", "1e3", "12345678"]) assert.equal(parseDollars(bad), null, bad); |
| 20 | assert.equal(dollarsField(1_250_500_000), "1250.50"); |
| 21 | assert.equal(dollarsField(null), ""); |
| 22 | }); |