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