Functional Weave
Code in TypeScript

money.add@1.0.1

vectors.json

2,196 bytes · view raw

[
  { "name": "adds pence", "args": [{ "minor": 1999, "currency": "GBP" }, { "minor": 1, "currency": "GBP" }], "expect": { "minor": 2000, "currency": "GBP" } },
  { "name": "adds zero", "args": [{ "minor": 2500, "currency": "GBP" }, { "minor": 0, "currency": "GBP" }], "expect": { "minor": 2500, "currency": "GBP" } },
  { "name": "adds a negative (a credit)", "args": [{ "minor": 2500, "currency": "GBP" }, { "minor": -1000, "currency": "GBP" }], "expect": { "minor": 1500, "currency": "GBP" } },
  { "name": "mixing currencies is an error", "args": [{ "minor": 100, "currency": "GBP" }, { "minor": 100, "currency": "EUR" }], "expectError": "currency mismatch" },
  { "name": "a credit larger than the amount goes below zero", "args": [{ "minor": 100, "currency": "GBP" }, { "minor": -250, "currency": "GBP" }], "expect": { "minor": -150, "currency": "GBP" } },
  { "name": "two credits add up to a bigger credit", "args": [{ "minor": -300, "currency": "GBP" }, { "minor": -200, "currency": "GBP" }], "expect": { "minor": -500, "currency": "GBP" } },
  { "name": "a credit that cancels the amount exactly is zero", "args": [{ "minor": 2500, "currency": "GBP" }, { "minor": -2500, "currency": "GBP" }], "expect": { "minor": 0, "currency": "GBP" } },
  { "name": "zero-decimal currency", "args": [{ "minor": 1500, "currency": "JPY" }, { "minor": 2500, "currency": "JPY" }], "expect": { "minor": 4000, "currency": "JPY" } },
  { "name": "up to the largest safe integer, exactly", "args": [{ "minor": 9007199254740990, "currency": "GBP" }, { "minor": 1, "currency": "GBP" }], "expect": { "minor": 9007199254740991, "currency": "GBP" } },
  { "name": "mixed currencies are refused even when both are zero", "args": [{ "minor": 0, "currency": "GBP" }, { "minor": 0, "currency": "EUR" }], "expectError": "currency mismatch" },
  { "name": "currency codes are compared exactly, so GBP and gbp do not mix", "args": [{ "minor": 100, "currency": "GBP" }, { "minor": 100, "currency": "gbp" }], "expectError": "currency mismatch" },
  { "name": "matching but invalid currencies are still refused", "args": [{ "minor": 1, "currency": "gbp" }, { "minor": 1, "currency": "gbp" }], "expectError": "ISO 4217" }
]