Functional Weave
Code in Python

invest.isa-allowance@1.0.0

vectors.json

21,286 bytes · view raw

[
 {
  "name": "2025/26: £5,000 cash and £10,000 stocks and shares leaves £5,000",
  "args": [
   "2025-10-01",
   [
    {
     "date": "2025-04-06",
     "kind": "cash",
     "amount": {
      "minor": 500000,
      "currency": "GBP"
     }
    },
    {
     "date": "2026-04-05",
     "kind": "stocks-and-shares",
     "amount": {
      "minor": 1000000,
      "currency": "GBP"
     }
    }
   ],
   null
  ],
  "expect": {
   "taxYear": "2025/26",
   "overall": {
    "limit": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "used": {
     "minor": 1500000,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 500000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "lifetime": {
    "limit": {
     "minor": 400000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 400000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "cash": null,
   "junior": {
    "limit": {
     "minor": 900000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 900000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "exceeded": false
  }
 },
 {
  "name": "a full Lifetime ISA counts inside the £20,000",
  "args": [
   "2025-10-01",
   [
    {
     "date": "2025-05-01",
     "kind": "lifetime",
     "amount": {
      "minor": 400000,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-06-01",
     "kind": "stocks-and-shares",
     "amount": {
      "minor": 1600000,
      "currency": "GBP"
     }
    }
   ],
   null
  ],
  "expect": {
   "taxYear": "2025/26",
   "overall": {
    "limit": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "used": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 0,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "lifetime": {
    "limit": {
     "minor": 400000,
     "currency": "GBP"
    },
    "used": {
     "minor": 400000,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 0,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "cash": null,
   "junior": {
    "limit": {
     "minor": 900000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 900000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "exceeded": false
  }
 },
 {
  "name": "£18,000 elsewhere leaves £2,000 of Lifetime ISA room, not £4,000",
  "args": [
   "2025-10-01",
   [
    {
     "date": "2025-05-01",
     "kind": "stocks-and-shares",
     "amount": {
      "minor": 1800000,
      "currency": "GBP"
     }
    }
   ],
   null
  ],
  "expect": {
   "taxYear": "2025/26",
   "overall": {
    "limit": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "used": {
     "minor": 1800000,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 200000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "lifetime": {
    "limit": {
     "minor": 400000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 200000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "cash": null,
   "junior": {
    "limit": {
     "minor": 900000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 900000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "exceeded": false
  }
 },
 {
  "name": "over the overall limit by £1,000",
  "args": [
   "2024-10-01",
   [
    {
     "date": "2024-05-01",
     "kind": "cash",
     "amount": {
      "minor": 1200000,
      "currency": "GBP"
     }
    },
    {
     "date": "2025-01-01",
     "kind": "innovative-finance",
     "amount": {
      "minor": 900000,
      "currency": "GBP"
     }
    }
   ],
   null
  ],
  "expect": {
   "taxYear": "2024/25",
   "overall": {
    "limit": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "used": {
     "minor": 2100000,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 0,
     "currency": "GBP"
    },
    "exceeded": true
   },
   "lifetime": {
    "limit": {
     "minor": 400000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 0,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "cash": null,
   "junior": {
    "limit": {
     "minor": 900000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 900000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "exceeded": true
  }
 },
 {
  "name": "over the Lifetime ISA limit but inside the overall one",
  "args": [
   "2024-10-01",
   [
    {
     "date": "2024-05-01",
     "kind": "lifetime",
     "amount": {
      "minor": 450000,
      "currency": "GBP"
     }
    }
   ],
   null
  ],
  "expect": {
   "taxYear": "2024/25",
   "overall": {
    "limit": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "used": {
     "minor": 450000,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 1550000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "lifetime": {
    "limit": {
     "minor": 400000,
     "currency": "GBP"
    },
    "used": {
     "minor": 450000,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 0,
     "currency": "GBP"
    },
    "exceeded": true
   },
   "cash": null,
   "junior": {
    "limit": {
     "minor": 900000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 900000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "exceeded": true
  }
 },
 {
  "name": "Junior ISA is a separate allowance: £9,000 on top of a full adult £20,000",
  "args": [
   "2023-10-01",
   [
    {
     "date": "2023-05-01",
     "kind": "junior",
     "amount": {
      "minor": 900000,
      "currency": "GBP"
     }
    },
    {
     "date": "2023-05-01",
     "kind": "stocks-and-shares",
     "amount": {
      "minor": 2000000,
      "currency": "GBP"
     }
    }
   ],
   null
  ],
  "expect": {
   "taxYear": "2023/24",
   "overall": {
    "limit": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "used": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 0,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "lifetime": {
    "limit": {
     "minor": 400000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 0,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "cash": null,
   "junior": {
    "limit": {
     "minor": 900000,
     "currency": "GBP"
    },
    "used": {
     "minor": 900000,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 0,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "exceeded": false
  }
 },
 {
  "name": "a penny over the Junior ISA limit is exceeded",
  "args": [
   "2023-10-01",
   [
    {
     "date": "2023-05-01",
     "kind": "junior",
     "amount": {
      "minor": 900001,
      "currency": "GBP"
     }
    }
   ],
   null
  ],
  "expect": {
   "taxYear": "2023/24",
   "overall": {
    "limit": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "lifetime": {
    "limit": {
     "minor": 400000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 400000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "cash": null,
   "junior": {
    "limit": {
     "minor": 900000,
     "currency": "GBP"
    },
    "used": {
     "minor": 900001,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 0,
     "currency": "GBP"
    },
    "exceeded": true
   },
   "exceeded": true
  }
 },
 {
  "name": "2019/20 Junior ISA limit was £4,368",
  "args": [
   "2019-04-06",
   [
    {
     "date": "2019-04-06",
     "kind": "junior",
     "amount": {
      "minor": 436800,
      "currency": "GBP"
     }
    }
   ],
   null
  ],
  "expect": {
   "taxYear": "2019/20",
   "overall": {
    "limit": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "lifetime": {
    "limit": {
     "minor": 400000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 400000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "cash": null,
   "junior": {
    "limit": {
     "minor": 436800,
     "currency": "GBP"
    },
    "used": {
     "minor": 436800,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 0,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "exceeded": false
  }
 },
 {
  "name": "2017/18, the first year of £20,000 and the Lifetime ISA",
  "args": [
   "2018-04-05",
   [
    {
     "date": "2017-04-06",
     "kind": "lifetime",
     "amount": {
      "minor": 400000,
      "currency": "GBP"
     }
    },
    {
     "date": "2018-04-05",
     "kind": "cash",
     "amount": {
      "minor": 1600000,
      "currency": "GBP"
     }
    }
   ],
   null
  ],
  "expect": {
   "taxYear": "2017/18",
   "overall": {
    "limit": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "used": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 0,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "lifetime": {
    "limit": {
     "minor": 400000,
     "currency": "GBP"
    },
    "used": {
     "minor": 400000,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 0,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "cash": null,
   "junior": {
    "limit": {
     "minor": 412800,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 412800,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "exceeded": false
  }
 },
 {
  "name": "no subscriptions: every allowance is free",
  "args": [
   "2026-06-01",
   [],
   null
  ],
  "expect": {
   "taxYear": "2026/27",
   "overall": {
    "limit": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "lifetime": {
    "limit": {
     "minor": 400000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 400000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "cash": null,
   "junior": {
    "limit": {
     "minor": 900000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 900000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "exceeded": false
  }
 },
 {
  "name": "2027/28 under 65: cash is capped at £12,000 inside the £20,000",
  "args": [
   "2027-06-01",
   [
    {
     "date": "2027-05-01",
     "kind": "cash",
     "amount": {
      "minor": 1200000,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-06-01",
     "kind": "stocks-and-shares",
     "amount": {
      "minor": 800000,
      "currency": "GBP"
     }
    }
   ],
   "1970-01-01"
  ],
  "expect": {
   "taxYear": "2027/28",
   "overall": {
    "limit": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "used": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 0,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "lifetime": {
    "limit": {
     "minor": 400000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 0,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "cash": {
    "limit": {
     "minor": 1200000,
     "currency": "GBP"
    },
    "used": {
     "minor": 1200000,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 0,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "junior": {
    "limit": {
     "minor": 900000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 900000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "exceeded": false
  }
 },
 {
  "name": "2027/28 under 65: £13,000 in cash breaks the cash limit though the overall one is fine",
  "args": [
   "2027-06-01",
   [
    {
     "date": "2027-05-01",
     "kind": "cash",
     "amount": {
      "minor": 1300000,
      "currency": "GBP"
     }
    }
   ],
   "1990-12-31"
  ],
  "expect": {
   "taxYear": "2027/28",
   "overall": {
    "limit": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "used": {
     "minor": 1300000,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 700000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "lifetime": {
    "limit": {
     "minor": 400000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 400000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "cash": {
    "limit": {
     "minor": 1200000,
     "currency": "GBP"
    },
    "used": {
     "minor": 1300000,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 0,
     "currency": "GBP"
    },
    "exceeded": true
   },
   "junior": {
    "limit": {
     "minor": 900000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 900000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "exceeded": true
  }
 },
 {
  "name": "2027/28 under 65 with little in cash: cash room is £12,000 less cash used",
  "args": [
   "2027-06-01",
   [
    {
     "date": "2027-05-01",
     "kind": "cash",
     "amount": {
      "minor": 200000,
      "currency": "GBP"
     }
    },
    {
     "date": "2027-05-01",
     "kind": "stocks-and-shares",
     "amount": {
      "minor": 500000,
      "currency": "GBP"
     }
    }
   ],
   "1990-12-31"
  ],
  "expect": {
   "taxYear": "2027/28",
   "overall": {
    "limit": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "used": {
     "minor": 700000,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 1300000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "lifetime": {
    "limit": {
     "minor": 400000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 400000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "cash": {
    "limit": {
     "minor": 1200000,
     "currency": "GBP"
    },
    "used": {
     "minor": 200000,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 1000000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "junior": {
    "limit": {
     "minor": 900000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 900000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "exceeded": false
  }
 },
 {
  "name": "2027/28 turning 65 during the year (1 March 2028): the whole £20,000 may be cash",
  "args": [
   "2027-06-01",
   [
    {
     "date": "2027-05-01",
     "kind": "cash",
     "amount": {
      "minor": 2000000,
      "currency": "GBP"
     }
    }
   ],
   "1963-03-01"
  ],
  "expect": {
   "taxYear": "2027/28",
   "overall": {
    "limit": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "used": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 0,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "lifetime": {
    "limit": {
     "minor": 400000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 0,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "cash": null,
   "junior": {
    "limit": {
     "minor": 900000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 900000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "exceeded": false
  }
 },
 {
  "name": "2027/28 turning 65 on 6 April 2028, the day after the year ends: still under 65",
  "args": [
   "2027-06-01",
   [
    {
     "date": "2027-05-01",
     "kind": "cash",
     "amount": {
      "minor": 2000000,
      "currency": "GBP"
     }
    }
   ],
   "1963-04-06"
  ],
  "expect": {
   "taxYear": "2027/28",
   "overall": {
    "limit": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "used": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 0,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "lifetime": {
    "limit": {
     "minor": 400000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 0,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "cash": {
    "limit": {
     "minor": 1200000,
     "currency": "GBP"
    },
    "used": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 0,
     "currency": "GBP"
    },
    "exceeded": true
   },
   "junior": {
    "limit": {
     "minor": 900000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 900000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "exceeded": true
  }
 },
 {
  "name": "before 2027/28 the date of birth is not needed and cash may take the whole allowance",
  "args": [
   "2026-06-01",
   [
    {
     "date": "2026-05-01",
     "kind": "cash",
     "amount": {
      "minor": 2000000,
      "currency": "GBP"
     }
    }
   ],
   null
  ],
  "expect": {
   "taxYear": "2026/27",
   "overall": {
    "limit": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "used": {
     "minor": 2000000,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 0,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "lifetime": {
    "limit": {
     "minor": 400000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 0,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "cash": null,
   "junior": {
    "limit": {
     "minor": 900000,
     "currency": "GBP"
    },
    "used": {
     "minor": 0,
     "currency": "GBP"
    },
    "remaining": {
     "minor": 900000,
     "currency": "GBP"
    },
    "exceeded": false
   },
   "exceeded": false
  }
 },
 {
  "name": "2027/28 needs the date of birth",
  "args": [
   "2027-06-01",
   [],
   null
  ],
  "expectError": "dateOfBirth is needed for 2027/28"
 },
 {
  "name": "a subscription outside the tax year is refused",
  "args": [
   "2025-10-01",
   [
    {
     "date": "2025-04-05",
     "kind": "cash",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    }
   ],
   null
  ],
  "expectError": "the subscription on 2025-04-05 is outside the 2025/26 tax year"
 },
 {
  "name": "years before 2017/18 are not covered",
  "args": [
   "2016-10-01",
   [],
   null
  ],
  "expectError": "no ISA limits for 2016-10-01"
 },
 {
  "name": "years after 2027/28 are not covered",
  "args": [
   "2028-04-06",
   [],
   null
  ],
  "expectError": "no ISA limits for 2028-04-06"
 },
 {
  "name": "a zero subscription is refused",
  "args": [
   "2025-10-01",
   [
    {
     "date": "2025-05-01",
     "kind": "cash",
     "amount": {
      "minor": 0,
      "currency": "GBP"
     }
    }
   ],
   null
  ],
  "expectError": "a subscription must be a whole number of pence greater than zero"
 },
 {
  "name": "fractional pence are refused",
  "args": [
   "2025-10-01",
   [
    {
     "date": "2025-05-01",
     "kind": "cash",
     "amount": {
      "minor": 100.5,
      "currency": "GBP"
     }
    }
   ],
   null
  ],
  "expectError": "a subscription must be a whole number of pence greater than zero"
 },
 {
  "name": "amounts must be in sterling",
  "args": [
   "2025-10-01",
   [
    {
     "date": "2025-05-01",
     "kind": "cash",
     "amount": {
      "minor": 10000,
      "currency": "EUR"
     }
    }
   ],
   null
  ],
  "expectError": "subscriptions must be in GBP"
 },
 {
  "name": "an unknown kind is refused",
  "args": [
   "2025-10-01",
   [
    {
     "date": "2025-05-01",
     "kind": "help-to-buy",
     "amount": {
      "minor": 10000,
      "currency": "GBP"
     }
    }
   ],
   null
  ],
  "expectError": "kind must be cash, stocks-and-shares, innovative-finance, lifetime or junior"
 },
 {
  "name": "a malformed date is refused",
  "args": [
   "2025/10/01",
   [],
   null
  ],
  "expectError": "taxYearDate must be an ISO date"
 }
]