[ { "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" } ]