Functional Weave
Code in Rust

lending.loan-payment@1.0.1

vectors.json

5,096 bytes · view raw

[
 {
  "name": "\u00a3100,000 mortgage at 5% over 25 years is \u00a3584.59 a month",
  "args": [
   {
    "minor": 10000000,
    "currency": "GBP"
   },
   500,
   300,
   12,
   "half-up"
  ],
  "expect": {
   "minor": 58459,
   "currency": "GBP"
  }
 },
 {
  "name": "the same mortgage rounded up so it never under-repays",
  "args": [
   {
    "minor": 10000000,
    "currency": "GBP"
   },
   500,
   300,
   12,
   "up"
  ],
  "expect": {
   "minor": 58460,
   "currency": "GBP"
  }
 },
 {
  "name": "\u00a31,000 at 12% over a year",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   1200,
   12,
   12,
   "half-up"
  ],
  "expect": {
   "minor": 8885,
   "currency": "GBP"
  }
 },
 {
  "name": "rounding down the same loan",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   1200,
   12,
   12,
   "down"
  ],
  "expect": {
   "minor": 8884,
   "currency": "GBP"
  }
 },
 {
  "name": "zero rate is the principal divided equally",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   0,
   12,
   12,
   "half-up"
  ],
  "expect": {
   "minor": 8333,
   "currency": "GBP"
  }
 },
 {
  "name": "zero rate rounded up",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   0,
   12,
   12,
   "up"
  ],
  "expect": {
   "minor": 8334,
   "currency": "GBP"
  }
 },
 {
  "name": "\u00a3150.00 over a year at 0% divides exactly",
  "args": [
   {
    "minor": 15000,
    "currency": "GBP"
   },
   0,
   12,
   12,
   "half-up"
  ],
  "expect": {
   "minor": 1250,
   "currency": "GBP"
  }
 },
 {
  "name": "an exact half penny (\u00a31.50 over 12 months is 12.5p) rounds away from zero under half-up",
  "args": [
   {
    "minor": 150,
    "currency": "GBP"
   },
   0,
   12,
   12,
   "half-up"
  ],
  "expect": {
   "minor": 13,
   "currency": "GBP"
  }
 },
 {
  "name": "half-even sends the exact half to the even penny",
  "args": [
   {
    "minor": 150,
    "currency": "GBP"
   },
   0,
   12,
   12,
   "half-even"
  ],
  "expect": {
   "minor": 12,
   "currency": "GBP"
  }
 },
 {
  "name": "\u00a325,000 car loan at 3.99% over five years",
  "args": [
   {
    "minor": 2500000,
    "currency": "GBP"
   },
   399,
   60,
   12,
   "half-up"
  ],
  "expect": {
   "minor": 46030,
   "currency": "GBP"
  }
 },
 {
  "name": "weekly payments over two years at 6.5%",
  "args": [
   {
    "minor": 1000000,
    "currency": "GBP"
   },
   650,
   24,
   52,
   "half-up"
  ],
  "expect": {
   "minor": 10260,
   "currency": "GBP"
  }
 },
 {
  "name": "quarterly payments over three years at 8%",
  "args": [
   {
    "minor": 500000,
    "currency": "GBP"
   },
   800,
   36,
   4,
   "half-up"
  ],
  "expect": {
   "minor": 47280,
   "currency": "GBP"
  }
 },
 {
  "name": "a single annual payment is principal plus a year's interest",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   1000,
   12,
   1,
   "half-up"
  ],
  "expect": {
   "minor": 110000,
   "currency": "GBP"
  }
 },
 {
  "name": "fortnightly over three years",
  "args": [
   {
    "minor": 300000,
    "currency": "GBP"
   },
   700,
   36,
   26,
   "half-up"
  ],
  "expect": {
   "minor": 4269,
   "currency": "GBP"
  }
 },
 {
  "name": "forty years at 4.25% in euros",
  "args": [
   {
    "minor": 35000000,
    "currency": "EUR"
   },
   425,
   480,
   12,
   "half-up"
  ],
  "expect": {
   "minor": 151767,
   "currency": "EUR"
  }
 },
 {
  "name": "a very high rate: 1000% over 12 months",
  "args": [
   {
    "minor": 50000,
    "currency": "GBP"
   },
   100000,
   12,
   12,
   "half-up"
  ],
  "expect": {
   "minor": 41696,
   "currency": "GBP"
  }
 },
 {
  "name": "a zero principal is refused",
  "args": [
   {
    "minor": 0,
    "currency": "GBP"
   },
   500,
   12,
   12,
   "half-up"
  ],
  "expectError": "principal must be greater than zero"
 },
 {
  "name": "a negative rate is refused",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   -1,
   12,
   12,
   "half-up"
  ],
  "expectError": "annualRateBasisPoints must be between 0 and 100000"
 },
 {
  "name": "payments per year above 52 are refused",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   500,
   12,
   365,
   "half-up"
  ],
  "expectError": "paymentsPerYear must be between 1 and 52"
 },
 {
  "name": "a zero term is refused",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   500,
   0,
   12,
   "half-up"
  ],
  "expectError": "termMonths must be at least 1"
 },
 {
  "name": "a term that is not a whole number of payments",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   500,
   13,
   4,
   "half-up"
  ],
  "expectError": "is not a whole number of payments"
 },
 {
  "name": "more payments than the limit",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   500,
   1200,
   52,
   "half-up"
  ],
  "expectError": "payment limit"
 },
 {
  "name": "an unknown rounding mode",
  "args": [
   {
    "minor": 100000,
    "currency": "GBP"
   },
   500,
   12,
   12,
   "nearest"
  ],
  "expectError": "unknown rounding mode"
 }
]