Functional Weave
Code in TypeScript

insurance.instalment-plan@1.0.1

vectors.json

8,901 bytes · view raw

[
 {
  "name": "600.00 over ten months at a flat 10%: 66.00 a month, and an APR of 23.5%, not 10%",
  "args": [
   {
    "minor": 60000,
    "currency": "GBP"
   },
   {
    "minor": 0,
    "currency": "GBP"
   },
   10,
   1000,
   1
  ],
  "expect": {
   "deposit": {
    "minor": 0,
    "currency": "GBP"
   },
   "amountFinanced": {
    "minor": 60000,
    "currency": "GBP"
   },
   "creditCharge": {
    "minor": 6000,
    "currency": "GBP"
   },
   "instalments": [
    {
     "minor": 6600,
     "currency": "GBP"
    },
    {
     "minor": 6600,
     "currency": "GBP"
    },
    {
     "minor": 6600,
     "currency": "GBP"
    },
    {
     "minor": 6600,
     "currency": "GBP"
    },
    {
     "minor": 6600,
     "currency": "GBP"
    },
    {
     "minor": 6600,
     "currency": "GBP"
    },
    {
     "minor": 6600,
     "currency": "GBP"
    },
    {
     "minor": 6600,
     "currency": "GBP"
    },
    {
     "minor": 6600,
     "currency": "GBP"
    },
    {
     "minor": 6600,
     "currency": "GBP"
    }
   ],
   "totalPayable": {
    "minor": 66000,
    "currency": "GBP"
   },
   "apr": {
    "basisPoints": 2350,
    "display": "23.5%",
    "preciseBasisPoints": 2346
   }
  }
 },
 {
  "name": "a 20% deposit, 9.9% flat on the rest, eleven instalments: the odd 6p go on the first",
  "args": [
   {
    "minor": 74550,
    "currency": "GBP"
   },
   {
    "minor": 14910,
    "currency": "GBP"
   },
   11,
   990,
   1
  ],
  "expect": {
   "deposit": {
    "minor": 14910,
    "currency": "GBP"
   },
   "amountFinanced": {
    "minor": 59640,
    "currency": "GBP"
   },
   "creditCharge": {
    "minor": 5904,
    "currency": "GBP"
   },
   "instalments": [
    {
     "minor": 5964,
     "currency": "GBP"
    },
    {
     "minor": 5958,
     "currency": "GBP"
    },
    {
     "minor": 5958,
     "currency": "GBP"
    },
    {
     "minor": 5958,
     "currency": "GBP"
    },
    {
     "minor": 5958,
     "currency": "GBP"
    },
    {
     "minor": 5958,
     "currency": "GBP"
    },
    {
     "minor": 5958,
     "currency": "GBP"
    },
    {
     "minor": 5958,
     "currency": "GBP"
    },
    {
     "minor": 5958,
     "currency": "GBP"
    },
    {
     "minor": 5958,
     "currency": "GBP"
    },
    {
     "minor": 5958,
     "currency": "GBP"
    }
   ],
   "totalPayable": {
    "minor": 80454,
    "currency": "GBP"
   },
   "apr": {
    "basisPoints": 2110,
    "display": "21.1%",
    "preciseBasisPoints": 2109
   }
  }
 },
 {
  "name": "interest-free instalments have an APR of 0.0%",
  "args": [
   {
    "minor": 60000,
    "currency": "GBP"
   },
   {
    "minor": 0,
    "currency": "GBP"
   },
   12,
   0,
   1
  ],
  "expect": {
   "deposit": {
    "minor": 0,
    "currency": "GBP"
   },
   "amountFinanced": {
    "minor": 60000,
    "currency": "GBP"
   },
   "creditCharge": {
    "minor": 0,
    "currency": "GBP"
   },
   "instalments": [
    {
     "minor": 5000,
     "currency": "GBP"
    },
    {
     "minor": 5000,
     "currency": "GBP"
    },
    {
     "minor": 5000,
     "currency": "GBP"
    },
    {
     "minor": 5000,
     "currency": "GBP"
    },
    {
     "minor": 5000,
     "currency": "GBP"
    },
    {
     "minor": 5000,
     "currency": "GBP"
    },
    {
     "minor": 5000,
     "currency": "GBP"
    },
    {
     "minor": 5000,
     "currency": "GBP"
    },
    {
     "minor": 5000,
     "currency": "GBP"
    },
    {
     "minor": 5000,
     "currency": "GBP"
    },
    {
     "minor": 5000,
     "currency": "GBP"
    },
    {
     "minor": 5000,
     "currency": "GBP"
    }
   ],
   "totalPayable": {
    "minor": 60000,
    "currency": "GBP"
   },
   "apr": {
    "basisPoints": 0,
    "display": "0.0%",
    "preciseBasisPoints": 0
   }
  }
 },
 {
  "name": "the first instalment taken at inception brings the APR up",
  "args": [
   {
    "minor": 48000,
    "currency": "GBP"
   },
   {
    "minor": 0,
    "currency": "GBP"
   },
   12,
   1500,
   0
  ],
  "expect": {
   "deposit": {
    "minor": 0,
    "currency": "GBP"
   },
   "amountFinanced": {
    "minor": 48000,
    "currency": "GBP"
   },
   "creditCharge": {
    "minor": 7200,
    "currency": "GBP"
   },
   "instalments": [
    {
     "minor": 4600,
     "currency": "GBP"
    },
    {
     "minor": 4600,
     "currency": "GBP"
    },
    {
     "minor": 4600,
     "currency": "GBP"
    },
    {
     "minor": 4600,
     "currency": "GBP"
    },
    {
     "minor": 4600,
     "currency": "GBP"
    },
    {
     "minor": 4600,
     "currency": "GBP"
    },
    {
     "minor": 4600,
     "currency": "GBP"
    },
    {
     "minor": 4600,
     "currency": "GBP"
    },
    {
     "minor": 4600,
     "currency": "GBP"
    },
    {
     "minor": 4600,
     "currency": "GBP"
    },
    {
     "minor": 4600,
     "currency": "GBP"
    },
    {
     "minor": 4600,
     "currency": "GBP"
    }
   ],
   "totalPayable": {
    "minor": 55200,
    "currency": "GBP"
   },
   "apr": {
    "basisPoints": 3690,
    "display": "36.9%",
    "preciseBasisPoints": 3686
   }
  }
 },
 {
  "name": "one payment a month later at 5% is 1.05^12 - 1 = 79.59% a year",
  "args": [
   {
    "minor": 10000,
    "currency": "GBP"
   },
   {
    "minor": 0,
    "currency": "GBP"
   },
   1,
   500,
   1
  ],
  "expect": {
   "deposit": {
    "minor": 0,
    "currency": "GBP"
   },
   "amountFinanced": {
    "minor": 10000,
    "currency": "GBP"
   },
   "creditCharge": {
    "minor": 500,
    "currency": "GBP"
   },
   "instalments": [
    {
     "minor": 10500,
     "currency": "GBP"
    }
   ],
   "totalPayable": {
    "minor": 10500,
    "currency": "GBP"
   },
   "apr": {
    "basisPoints": 7960,
    "display": "79.6%",
    "preciseBasisPoints": 7959
   }
  }
 },
 {
  "name": "100.00 over three interest-free instalments: the odd penny goes on the first",
  "args": [
   {
    "minor": 10000,
    "currency": "GBP"
   },
   {
    "minor": 0,
    "currency": "GBP"
   },
   3,
   0,
   1
  ],
  "expect": {
   "deposit": {
    "minor": 0,
    "currency": "GBP"
   },
   "amountFinanced": {
    "minor": 10000,
    "currency": "GBP"
   },
   "creditCharge": {
    "minor": 0,
    "currency": "GBP"
   },
   "instalments": [
    {
     "minor": 3334,
     "currency": "GBP"
    },
    {
     "minor": 3333,
     "currency": "GBP"
    },
    {
     "minor": 3333,
     "currency": "GBP"
    }
   ],
   "totalPayable": {
    "minor": 10000,
    "currency": "GBP"
   },
   "apr": {
    "basisPoints": 0,
    "display": "0.0%",
    "preciseBasisPoints": 0
   }
  }
 },
 {
  "name": "a deposit of the whole premium is refused",
  "args": [
   {
    "minor": 60000,
    "currency": "GBP"
   },
   {
    "minor": 60000,
    "currency": "GBP"
   },
   10,
   1000,
   1
  ],
  "expectError": "the deposit leaves nothing to pay by instalments"
 },
 {
  "name": "a negative deposit is refused",
  "args": [
   {
    "minor": 60000,
    "currency": "GBP"
   },
   {
    "minor": -1,
    "currency": "GBP"
   },
   10,
   1000,
   1
  ],
  "expectError": "deposit must not be negative"
 },
 {
  "name": "no instalments is refused",
  "args": [
   {
    "minor": 60000,
    "currency": "GBP"
   },
   {
    "minor": 0,
    "currency": "GBP"
   },
   0,
   1000,
   1
  ],
  "expectError": "instalmentCount must be a whole number of 1 or more"
 },
 {
  "name": "a fractional count is refused",
  "args": [
   {
    "minor": 60000,
    "currency": "GBP"
   },
   {
    "minor": 0,
    "currency": "GBP"
   },
   10.5,
   1000,
   1
  ],
  "expectError": "instalmentCount must be a whole number of 1 or more"
 },
 {
  "name": "a negative charge is refused",
  "args": [
   {
    "minor": 60000,
    "currency": "GBP"
   },
   {
    "minor": 0,
    "currency": "GBP"
   },
   10,
   -1,
   1
  ],
  "expectError": "creditChargeBasisPoints must be a whole number of 0 or more"
 },
 {
  "name": "a negative first month is refused",
  "args": [
   {
    "minor": 60000,
    "currency": "GBP"
   },
   {
    "minor": 0,
    "currency": "GBP"
   },
   10,
   1000,
   -1
  ],
  "expectError": "firstInstalmentMonth must be a whole number of 0 or more"
 },
 {
  "name": "one instalment at inception is not credit",
  "args": [
   {
    "minor": 60000,
    "currency": "GBP"
   },
   {
    "minor": 0,
    "currency": "GBP"
   },
   1,
   1000,
   0
  ],
  "expectError": "a single instalment at inception is payment in full, not credit"
 },
 {
  "name": "instalments smaller than a penny are refused",
  "args": [
   {
    "minor": 5,
    "currency": "GBP"
   },
   {
    "minor": 0,
    "currency": "GBP"
   },
   10,
   0,
   1
  ],
  "expectError": "each instalment must be at least one minor unit"
 },
 {
  "name": "a deposit in another currency is refused",
  "args": [
   {
    "minor": 60000,
    "currency": "GBP"
   },
   {
    "minor": 100,
    "currency": "EUR"
   },
   10,
   1000,
   1
  ],
  "expectError": "currency mismatch"
 }
]