Functional Weave
Code in TypeScript

lending.apr@1.0.1

vectors.json

22,762 bytes · view raw

[
 {
  "name": "\u00a31,000 repaid with \u00a31,100 a year later is 10.0%",
  "args": [
   [
    {
     "period": 0,
     "amount": {
      "minor": 100000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "period": 12,
     "amount": {
      "minor": 110000,
      "currency": "GBP"
     }
    }
   ],
   12
  ],
  "expect": {
   "basisPoints": 1000,
   "display": "10.0%",
   "preciseBasisPoints": 1000
  }
 },
 {
  "name": "\u00a31,000 repaid with \u00a31,210 two years later is 10.0%",
  "args": [
   [
    {
     "period": 0,
     "amount": {
      "minor": 100000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "period": 24,
     "amount": {
      "minor": 121000,
      "currency": "GBP"
     }
    }
   ],
   12
  ],
  "expect": {
   "basisPoints": 1000,
   "display": "10.0%",
   "preciseBasisPoints": 1000
  }
 },
 {
  "name": "the same in whole years",
  "args": [
   [
    {
     "period": 0,
     "amount": {
      "minor": 100000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "period": 1,
     "amount": {
      "minor": 105000,
      "currency": "GBP"
     }
    }
   ],
   1
  ],
  "expect": {
   "basisPoints": 500,
   "display": "5.0%",
   "preciseBasisPoints": 500
  }
 },
 {
  "name": "\u00a31,000 over 12 monthly payments of \u00a388.85",
  "args": [
   [
    {
     "period": 0,
     "amount": {
      "minor": 100000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "period": 1,
     "amount": {
      "minor": 8885,
      "currency": "GBP"
     }
    },
    {
     "period": 2,
     "amount": {
      "minor": 8885,
      "currency": "GBP"
     }
    },
    {
     "period": 3,
     "amount": {
      "minor": 8885,
      "currency": "GBP"
     }
    },
    {
     "period": 4,
     "amount": {
      "minor": 8885,
      "currency": "GBP"
     }
    },
    {
     "period": 5,
     "amount": {
      "minor": 8885,
      "currency": "GBP"
     }
    },
    {
     "period": 6,
     "amount": {
      "minor": 8885,
      "currency": "GBP"
     }
    },
    {
     "period": 7,
     "amount": {
      "minor": 8885,
      "currency": "GBP"
     }
    },
    {
     "period": 8,
     "amount": {
      "minor": 8885,
      "currency": "GBP"
     }
    },
    {
     "period": 9,
     "amount": {
      "minor": 8885,
      "currency": "GBP"
     }
    },
    {
     "period": 10,
     "amount": {
      "minor": 8885,
      "currency": "GBP"
     }
    },
    {
     "period": 11,
     "amount": {
      "minor": 8885,
      "currency": "GBP"
     }
    },
    {
     "period": 12,
     "amount": {
      "minor": 8885,
      "currency": "GBP"
     }
    }
   ],
   12
  ],
  "expect": {
   "basisPoints": 1270,
   "display": "12.7%",
   "preciseBasisPoints": 1269
  }
 },
 {
  "name": "an arrangement fee paid at drawdown raises the APR",
  "args": [
   [
    {
     "period": 0,
     "amount": {
      "minor": 100000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "period": 0,
     "amount": {
      "minor": 5000,
      "currency": "GBP"
     }
    },
    {
     "period": 1,
     "amount": {
      "minor": 8885,
      "currency": "GBP"
     }
    },
    {
     "period": 2,
     "amount": {
      "minor": 8885,
      "currency": "GBP"
     }
    },
    {
     "period": 3,
     "amount": {
      "minor": 8885,
      "currency": "GBP"
     }
    },
    {
     "period": 4,
     "amount": {
      "minor": 8885,
      "currency": "GBP"
     }
    },
    {
     "period": 5,
     "amount": {
      "minor": 8885,
      "currency": "GBP"
     }
    },
    {
     "period": 6,
     "amount": {
      "minor": 8885,
      "currency": "GBP"
     }
    },
    {
     "period": 7,
     "amount": {
      "minor": 8885,
      "currency": "GBP"
     }
    },
    {
     "period": 8,
     "amount": {
      "minor": 8885,
      "currency": "GBP"
     }
    },
    {
     "period": 9,
     "amount": {
      "minor": 8885,
      "currency": "GBP"
     }
    },
    {
     "period": 10,
     "amount": {
      "minor": 8885,
      "currency": "GBP"
     }
    },
    {
     "period": 11,
     "amount": {
      "minor": 8885,
      "currency": "GBP"
     }
    },
    {
     "period": 12,
     "amount": {
      "minor": 8885,
      "currency": "GBP"
     }
    }
   ],
   12
  ],
  "expect": {
   "basisPoints": 2420,
   "display": "24.2%",
   "preciseBasisPoints": 2419
  }
 },
 {
  "name": "a \u00a325,000 car loan: 60 payments of \u00a3460.30",
  "args": [
   [
    {
     "period": 0,
     "amount": {
      "minor": 2500000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "period": 1,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 2,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 3,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 4,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 5,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 6,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 7,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 8,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 9,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 10,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 11,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 12,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 13,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 14,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 15,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 16,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 17,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 18,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 19,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 20,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 21,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 22,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 23,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 24,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 25,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 26,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 27,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 28,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 29,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 30,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 31,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 32,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 33,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 34,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 35,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 36,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 37,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 38,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 39,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 40,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 41,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 42,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 43,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 44,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 45,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 46,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 47,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 48,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 49,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 50,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 51,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 52,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 53,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 54,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 55,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 56,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 57,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 58,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 59,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    },
    {
     "period": 60,
     "amount": {
      "minor": 46030,
      "currency": "GBP"
     }
    }
   ],
   12
  ],
  "expect": {
   "basisPoints": 410,
   "display": "4.1%",
   "preciseBasisPoints": 406
  }
 },
 {
  "name": "a payday loan: \u00a3100, \u00a3124 back after 30 days",
  "args": [
   [
    {
     "period": 0,
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "period": 30,
     "amount": {
      "minor": 12400,
      "currency": "GBP"
     }
    }
   ],
   365
  ],
  "expect": {
   "basisPoints": 126970,
   "display": "1269.7%",
   "preciseBasisPoints": 126972
  }
 },
 {
  "name": "weekly: \u00a3500 repaid by 26 payments of \u00a321",
  "args": [
   [
    {
     "period": 0,
     "amount": {
      "minor": 50000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "period": 1,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    },
    {
     "period": 2,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    },
    {
     "period": 3,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    },
    {
     "period": 4,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    },
    {
     "period": 5,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    },
    {
     "period": 6,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    },
    {
     "period": 7,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    },
    {
     "period": 8,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    },
    {
     "period": 9,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    },
    {
     "period": 10,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    },
    {
     "period": 11,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    },
    {
     "period": 12,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    },
    {
     "period": 13,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    },
    {
     "period": 14,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    },
    {
     "period": 15,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    },
    {
     "period": 16,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    },
    {
     "period": 17,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    },
    {
     "period": 18,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    },
    {
     "period": 19,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    },
    {
     "period": 20,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    },
    {
     "period": 21,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    },
    {
     "period": 22,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    },
    {
     "period": 23,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    },
    {
     "period": 24,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    },
    {
     "period": 25,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    },
    {
     "period": 26,
     "amount": {
      "minor": 2100,
      "currency": "GBP"
     }
    }
   ],
   52
  ],
  "expect": {
   "basisPoints": 4100,
   "display": "41.0%",
   "preciseBasisPoints": 4102
  }
 },
 {
  "name": "two drawdowns a month apart",
  "args": [
   [
    {
     "period": 0,
     "amount": {
      "minor": 50000,
      "currency": "GBP"
     }
    },
    {
     "period": 1,
     "amount": {
      "minor": 50000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "period": 2,
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "period": 3,
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "period": 4,
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "period": 5,
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "period": 6,
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "period": 7,
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "period": 8,
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "period": 9,
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "period": 10,
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "period": 11,
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "period": 12,
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    }
   ],
   12
  ],
  "expect": {
   "basisPoints": 1950,
   "display": "19.5%",
   "preciseBasisPoints": 1947
  }
 },
 {
  "name": "interest-free credit is 0.0%",
  "args": [
   [
    {
     "period": 0,
     "amount": {
      "minor": 100000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "period": 1,
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "period": 2,
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "period": 3,
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "period": 4,
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "period": 5,
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "period": 6,
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "period": 7,
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "period": 8,
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "period": 9,
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    },
    {
     "period": 10,
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    }
   ],
   12
  ],
  "expect": {
   "basisPoints": 0,
   "display": "0.0%",
   "preciseBasisPoints": 0
  }
 },
 {
  "name": "exactly 12.65% rounds up to 12.7%: the figure at the second decimal place is 5",
  "args": [
   [
    {
     "period": 0,
     "amount": {
      "minor": 100000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "period": 1,
     "amount": {
      "minor": 112650,
      "currency": "GBP"
     }
    }
   ],
   1
  ],
  "expect": {
   "basisPoints": 1270,
   "display": "12.7%",
   "preciseBasisPoints": 1265
  }
 },
 {
  "name": "exactly 12.64% stays 12.6%",
  "args": [
   [
    {
     "period": 0,
     "amount": {
      "minor": 100000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "period": 1,
     "amount": {
      "minor": 112640,
      "currency": "GBP"
     }
    }
   ],
   1
  ],
  "expect": {
   "basisPoints": 1260,
   "display": "12.6%",
   "preciseBasisPoints": 1264
  }
 },
 {
  "name": "quarterly repayments",
  "args": [
   [
    {
     "period": 0,
     "amount": {
      "minor": 400000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "period": 1,
     "amount": {
      "minor": 110000,
      "currency": "GBP"
     }
    },
    {
     "period": 2,
     "amount": {
      "minor": 110000,
      "currency": "GBP"
     }
    },
    {
     "period": 3,
     "amount": {
      "minor": 110000,
      "currency": "GBP"
     }
    },
    {
     "period": 4,
     "amount": {
      "minor": 110000,
      "currency": "GBP"
     }
    }
   ],
   4
  ],
  "expect": {
   "basisPoints": 1660,
   "display": "16.6%",
   "preciseBasisPoints": 1665
  }
 },
 {
  "name": "eleven level payments and a larger final one",
  "args": [
   [
    {
     "period": 0,
     "amount": {
      "minor": 120000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "period": 1,
     "amount": {
      "minor": 12000,
      "currency": "GBP"
     }
    },
    {
     "period": 2,
     "amount": {
      "minor": 12000,
      "currency": "GBP"
     }
    },
    {
     "period": 3,
     "amount": {
      "minor": 12000,
      "currency": "GBP"
     }
    },
    {
     "period": 4,
     "amount": {
      "minor": 12000,
      "currency": "GBP"
     }
    },
    {
     "period": 5,
     "amount": {
      "minor": 12000,
      "currency": "GBP"
     }
    },
    {
     "period": 6,
     "amount": {
      "minor": 12000,
      "currency": "GBP"
     }
    },
    {
     "period": 7,
     "amount": {
      "minor": 12000,
      "currency": "GBP"
     }
    },
    {
     "period": 8,
     "amount": {
      "minor": 12000,
      "currency": "GBP"
     }
    },
    {
     "period": 9,
     "amount": {
      "minor": 12000,
      "currency": "GBP"
     }
    },
    {
     "period": 10,
     "amount": {
      "minor": 12000,
      "currency": "GBP"
     }
    },
    {
     "period": 11,
     "amount": {
      "minor": 12000,
      "currency": "GBP"
     }
    },
    {
     "period": 12,
     "amount": {
      "minor": 23170,
      "currency": "GBP"
     }
    }
   ],
   12
  ],
  "expect": {
   "basisPoints": 5910,
   "display": "59.1%",
   "preciseBasisPoints": 5910
  }
 },
 {
  "name": "no advances",
  "args": [
   [],
   [
    {
     "period": 1,
     "amount": {
      "minor": 100,
      "currency": "GBP"
     }
    }
   ],
   12
  ],
  "expectError": "advances must not be empty"
 },
 {
  "name": "no repayments",
  "args": [
   [
    {
     "period": 0,
     "amount": {
      "minor": 100,
      "currency": "GBP"
     }
    }
   ],
   [],
   12
  ],
  "expectError": "repayments must not be empty"
 },
 {
  "name": "repayments below the credit would be a negative APR",
  "args": [
   [
    {
     "period": 0,
     "amount": {
      "minor": 100000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "period": 12,
     "amount": {
      "minor": 90000,
      "currency": "GBP"
     }
    }
   ],
   12
  ],
  "expectError": "the APR would be negative"
 },
 {
  "name": "the first drawdown must be at period 0",
  "args": [
   [
    {
     "period": 1,
     "amount": {
      "minor": 100000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "period": 12,
     "amount": {
      "minor": 110000,
      "currency": "GBP"
     }
    }
   ],
   12
  ],
  "expectError": "the earliest advance must be at period 0"
 },
 {
  "name": "a drawdown after a repayment makes the APR not unique",
  "args": [
   [
    {
     "period": 0,
     "amount": {
      "minor": 100000,
      "currency": "GBP"
     }
    },
    {
     "period": 6,
     "amount": {
      "minor": 50000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "period": 3,
     "amount": {
      "minor": 60000,
      "currency": "GBP"
     }
    },
    {
     "period": 12,
     "amount": {
      "minor": 110000,
      "currency": "GBP"
     }
    }
   ],
   12
  ],
  "expectError": "the APR would not be unique"
 },
 {
  "name": "a period unit that is not a CONC year fraction",
  "args": [
   [
    {
     "period": 0,
     "amount": {
      "minor": 100000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "period": 12,
     "amount": {
      "minor": 110000,
      "currency": "GBP"
     }
    }
   ],
   24
  ],
  "expectError": "periodsPerYear must be 1, 2, 4, 12, 52 or 365"
 },
 {
  "name": "a zero amount is refused",
  "args": [
   [
    {
     "period": 0,
     "amount": {
      "minor": 100000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "period": 12,
     "amount": {
      "minor": 0,
      "currency": "GBP"
     }
    }
   ],
   12
  ],
  "expectError": "every amount must be greater than zero"
 },
 {
  "name": "mixed currencies are refused",
  "args": [
   [
    {
     "period": 0,
     "amount": {
      "minor": 100000,
      "currency": "GBP"
     }
    }
   ],
   [
    {
     "period": 12,
     "amount": {
      "minor": 110000,
      "currency": "EUR"
     }
    }
   ],
   12
  ],
  "expectError": "currency mismatch"
 }
]