Functional Weave
Code in Rust

money.apply-rate@1.0.1

vectors.json

3,543 bytes · view raw

[
  { "name": "20 percent VAT on 100 pounds", "args": [{ "minor": 10000, "currency": "GBP" }, 2000, "half-up"], "expect": { "minor": 2000, "currency": "GBP" } },
  { "name": "20 percent of 1.99 rounds up", "args": [{ "minor": 199, "currency": "GBP" }, 2000, "half-up"], "expect": { "minor": 40, "currency": "GBP" } },
  { "name": "5 percent reduced rate", "args": [{ "minor": 4999, "currency": "GBP" }, 500, "half-up"], "expect": { "minor": 250, "currency": "GBP" } },
  { "name": "exact half rounds up under half-up", "args": [{ "minor": 5, "currency": "GBP" }, 5000, "half-up"], "expect": { "minor": 3, "currency": "GBP" } },
  { "name": "exact half rounds to even under half-even", "args": [{ "minor": 5, "currency": "GBP" }, 5000, "half-even"], "expect": { "minor": 2, "currency": "GBP" } },
  { "name": "down never rounds up", "args": [{ "minor": 199, "currency": "GBP" }, 2000, "down"], "expect": { "minor": 39, "currency": "GBP" } },
  { "name": "zero rate", "args": [{ "minor": 12345, "currency": "GBP" }, 0, "half-up"], "expect": { "minor": 0, "currency": "GBP" } },
  { "name": "100 percent is the amount itself", "args": [{ "minor": 12345, "currency": "GBP" }, 10000, "half-up"], "expect": { "minor": 12345, "currency": "GBP" } },
  { "name": "quarter of a percent", "args": [{ "minor": 100000, "currency": "GBP" }, 25, "half-up"], "expect": { "minor": 250, "currency": "GBP" } },
  { "name": "credits rate symmetrically", "args": [{ "minor": -199, "currency": "GBP" }, 2000, "half-up"], "expect": { "minor": -40, "currency": "GBP" } },
  { "name": "a negative half rounds away from zero under half-up, not towards it as Math.round does", "args": [{ "minor": -5, "currency": "GBP" }, 5000, "half-up"], "expect": { "minor": -3, "currency": "GBP" } },
  { "name": "half-even rounds an odd quotient's half up", "args": [{ "minor": 15, "currency": "GBP" }, 5000, "half-even"], "expect": { "minor": 8, "currency": "GBP" } },
  { "name": "up rounds any fraction away from zero", "args": [{ "minor": 101, "currency": "GBP" }, 100, "up"], "expect": { "minor": 2, "currency": "GBP" } },
  { "name": "up on a credit rounds away from zero too", "args": [{ "minor": -101, "currency": "GBP" }, 100, "up"], "expect": { "minor": -2, "currency": "GBP" } },
  { "name": "down on a credit truncates towards zero", "args": [{ "minor": -199, "currency": "GBP" }, 2000, "down"], "expect": { "minor": -39, "currency": "GBP" } },
  { "name": "a rate above 100 percent", "args": [{ "minor": 1000, "currency": "GBP" }, 15000, "half-up"], "expect": { "minor": 1500, "currency": "GBP" } },
  { "name": "a negative rate, as a discount", "args": [{ "minor": 1999, "currency": "GBP" }, -1000, "half-up"], "expect": { "minor": -200, "currency": "GBP" } },
  { "name": "a large amount stays exact", "args": [{ "minor": 900719925474, "currency": "GBP" }, 2000, "half-up"], "expect": { "minor": 180143985095, "currency": "GBP" } },
  { "name": "zero-decimal currency", "args": [{ "minor": 1234, "currency": "JPY" }, 1000, "half-even"], "expect": { "minor": 123, "currency": "JPY" } },
  { "name": "a zero amount is zero at any rate", "args": [{ "minor": 0, "currency": "JPY" }, 2000, "up"], "expect": { "minor": 0, "currency": "JPY" } },
  { "name": "an unknown rounding mode is an error, not a default", "args": [{ "minor": 100, "currency": "GBP" }, 2000, "nearest"], "expectError": "unknown rounding mode" },
  { "name": "an invalid currency on the amount is an error", "args": [{ "minor": 100, "currency": "gbp" }, 2000, "half-up"], "expectError": "ISO 4217" }
]