[
{
"name": "a claim's life: reserve, part payment, strengthening, an overpayment of the reserve, a recovery, closure",
"args": [
[
{
"date": "2026-01-10",
"kind": "reserve",
"amount": {
"minor": 500000,
"currency": "GBP"
}
},
{
"date": "2026-02-01",
"kind": "payment",
"amount": {
"minor": 150000,
"currency": "GBP"
}
},
{
"date": "2026-03-01",
"kind": "reserve",
"amount": {
"minor": 450000,
"currency": "GBP"
}
},
{
"date": "2026-04-01",
"kind": "payment",
"amount": {
"minor": 500000,
"currency": "GBP"
}
},
{
"date": "2026-05-01",
"kind": "recovery",
"amount": {
"minor": 80000,
"currency": "GBP"
}
},
{
"date": "2026-05-01",
"kind": "reserve",
"amount": {
"minor": 0,
"currency": "GBP"
}
}
],
"GBP"
],
"expect": [
{
"date": "2026-01-10",
"kind": "reserve",
"paid": {
"minor": 0,
"currency": "GBP"
},
"recovered": {
"minor": 0,
"currency": "GBP"
},
"outstanding": {
"minor": 500000,
"currency": "GBP"
},
"incurred": {
"minor": 500000,
"currency": "GBP"
},
"movement": {
"minor": 500000,
"currency": "GBP"
}
},
{
"date": "2026-02-01",
"kind": "payment",
"paid": {
"minor": 150000,
"currency": "GBP"
},
"recovered": {
"minor": 0,
"currency": "GBP"
},
"outstanding": {
"minor": 350000,
"currency": "GBP"
},
"incurred": {
"minor": 500000,
"currency": "GBP"
},
"movement": {
"minor": 0,
"currency": "GBP"
}
},
{
"date": "2026-03-01",
"kind": "reserve",
"paid": {
"minor": 150000,
"currency": "GBP"
},
"recovered": {
"minor": 0,
"currency": "GBP"
},
"outstanding": {
"minor": 450000,
"currency": "GBP"
},
"incurred": {
"minor": 600000,
"currency": "GBP"
},
"movement": {
"minor": 100000,
"currency": "GBP"
}
},
{
"date": "2026-04-01",
"kind": "payment",
"paid": {
"minor": 650000,
"currency": "GBP"
},
"recovered": {
"minor": 0,
"currency": "GBP"
},
"outstanding": {
"minor": 0,
"currency": "GBP"
},
"incurred": {
"minor": 650000,
"currency": "GBP"
},
"movement": {
"minor": 50000,
"currency": "GBP"
}
},
{
"date": "2026-05-01",
"kind": "recovery",
"paid": {
"minor": 650000,
"currency": "GBP"
},
"recovered": {
"minor": 80000,
"currency": "GBP"
},
"outstanding": {
"minor": 0,
"currency": "GBP"
},
"incurred": {
"minor": 570000,
"currency": "GBP"
},
"movement": {
"minor": -80000,
"currency": "GBP"
}
},
{
"date": "2026-05-01",
"kind": "reserve",
"paid": {
"minor": 650000,
"currency": "GBP"
},
"recovered": {
"minor": 80000,
"currency": "GBP"
},
"outstanding": {
"minor": 0,
"currency": "GBP"
},
"incurred": {
"minor": 570000,
"currency": "GBP"
},
"movement": {
"minor": 0,
"currency": "GBP"
}
}
]
},
{
"name": "no transactions, no positions",
"args": [
[],
"GBP"
],
"expect": []
},
{
"name": "a claim withdrawn: the reserve released to nil is a negative movement",
"args": [
[
{
"date": "2026-01-10",
"kind": "reserve",
"amount": {
"minor": 200000,
"currency": "GBP"
}
},
{
"date": "2026-06-30",
"kind": "reserve",
"amount": {
"minor": 0,
"currency": "GBP"
}
}
],
"GBP"
],
"expect": [
{
"date": "2026-01-10",
"kind": "reserve",
"paid": {
"minor": 0,
"currency": "GBP"
},
"recovered": {
"minor": 0,
"currency": "GBP"
},
"outstanding": {
"minor": 200000,
"currency": "GBP"
},
"incurred": {
"minor": 200000,
"currency": "GBP"
},
"movement": {
"minor": 200000,
"currency": "GBP"
}
},
{
"date": "2026-06-30",
"kind": "reserve",
"paid": {
"minor": 0,
"currency": "GBP"
},
"recovered": {
"minor": 0,
"currency": "GBP"
},
"outstanding": {
"minor": 0,
"currency": "GBP"
},
"incurred": {
"minor": 0,
"currency": "GBP"
},
"movement": {
"minor": -200000,
"currency": "GBP"
}
}
]
},
{
"name": "a payment with no reserve set raises incurred by the whole payment",
"args": [
[
{
"date": "2026-01-10",
"kind": "payment",
"amount": {
"minor": 12345,
"currency": "GBP"
}
}
],
"GBP"
],
"expect": [
{
"date": "2026-01-10",
"kind": "payment",
"paid": {
"minor": 12345,
"currency": "GBP"
},
"recovered": {
"minor": 0,
"currency": "GBP"
},
"outstanding": {
"minor": 0,
"currency": "GBP"
},
"incurred": {
"minor": 12345,
"currency": "GBP"
},
"movement": {
"minor": 12345,
"currency": "GBP"
}
}
]
},
{
"name": "a payment within the reserve moves nothing",
"args": [
[
{
"date": "2026-01-10",
"kind": "reserve",
"amount": {
"minor": 100000,
"currency": "GBP"
}
},
{
"date": "2026-01-11",
"kind": "payment",
"amount": {
"minor": 100000,
"currency": "GBP"
}
}
],
"GBP"
],
"expect": [
{
"date": "2026-01-10",
"kind": "reserve",
"paid": {
"minor": 0,
"currency": "GBP"
},
"recovered": {
"minor": 0,
"currency": "GBP"
},
"outstanding": {
"minor": 100000,
"currency": "GBP"
},
"incurred": {
"minor": 100000,
"currency": "GBP"
},
"movement": {
"minor": 100000,
"currency": "GBP"
}
},
{
"date": "2026-01-11",
"kind": "payment",
"paid": {
"minor": 100000,
"currency": "GBP"
},
"recovered": {
"minor": 0,
"currency": "GBP"
},
"outstanding": {
"minor": 0,
"currency": "GBP"
},
"incurred": {
"minor": 100000,
"currency": "GBP"
},
"movement": {
"minor": 0,
"currency": "GBP"
}
}
]
},
{
"name": "a reserve cut after a payment",
"args": [
[
{
"date": "2026-01-10",
"kind": "reserve",
"amount": {
"minor": 100000,
"currency": "GBP"
}
},
{
"date": "2026-01-20",
"kind": "payment",
"amount": {
"minor": 30000,
"currency": "GBP"
}
},
{
"date": "2026-02-01",
"kind": "reserve",
"amount": {
"minor": 20000,
"currency": "GBP"
}
}
],
"GBP"
],
"expect": [
{
"date": "2026-01-10",
"kind": "reserve",
"paid": {
"minor": 0,
"currency": "GBP"
},
"recovered": {
"minor": 0,
"currency": "GBP"
},
"outstanding": {
"minor": 100000,
"currency": "GBP"
},
"incurred": {
"minor": 100000,
"currency": "GBP"
},
"movement": {
"minor": 100000,
"currency": "GBP"
}
},
{
"date": "2026-01-20",
"kind": "payment",
"paid": {
"minor": 30000,
"currency": "GBP"
},
"recovered": {
"minor": 0,
"currency": "GBP"
},
"outstanding": {
"minor": 70000,
"currency": "GBP"
},
"incurred": {
"minor": 100000,
"currency": "GBP"
},
"movement": {
"minor": 0,
"currency": "GBP"
}
},
{
"date": "2026-02-01",
"kind": "reserve",
"paid": {
"minor": 30000,
"currency": "GBP"
},
"recovered": {
"minor": 0,
"currency": "GBP"
},
"outstanding": {
"minor": 20000,
"currency": "GBP"
},
"incurred": {
"minor": 50000,
"currency": "GBP"
},
"movement": {
"minor": -50000,
"currency": "GBP"
}
}
]
},
{
"name": "recoveries can take incurred below zero on a claim recovered in full with costs",
"args": [
[
{
"date": "2026-01-10",
"kind": "payment",
"amount": {
"minor": 1000,
"currency": "GBP"
}
},
{
"date": "2026-03-10",
"kind": "recovery",
"amount": {
"minor": 1500,
"currency": "GBP"
}
}
],
"GBP"
],
"expect": [
{
"date": "2026-01-10",
"kind": "payment",
"paid": {
"minor": 1000,
"currency": "GBP"
},
"recovered": {
"minor": 0,
"currency": "GBP"
},
"outstanding": {
"minor": 0,
"currency": "GBP"
},
"incurred": {
"minor": 1000,
"currency": "GBP"
},
"movement": {
"minor": 1000,
"currency": "GBP"
}
},
{
"date": "2026-03-10",
"kind": "recovery",
"paid": {
"minor": 1000,
"currency": "GBP"
},
"recovered": {
"minor": 1500,
"currency": "GBP"
},
"outstanding": {
"minor": 0,
"currency": "GBP"
},
"incurred": {
"minor": -500,
"currency": "GBP"
},
"movement": {
"minor": -1500,
"currency": "GBP"
}
}
]
},
{
"name": "transactions out of date order are refused",
"args": [
[
{
"date": "2026-02-01",
"kind": "reserve",
"amount": {
"minor": 100,
"currency": "GBP"
}
},
{
"date": "2026-01-01",
"kind": "payment",
"amount": {
"minor": 50,
"currency": "GBP"
}
}
],
"GBP"
],
"expectError": "transactions must be in date order: 2026-01-01 comes after 2026-02-01"
},
{
"name": "a negative reserve is refused",
"args": [
[
{
"date": "2026-02-01",
"kind": "reserve",
"amount": {
"minor": -100,
"currency": "GBP"
}
}
],
"GBP"
],
"expectError": "a reserve must not be negative"
},
{
"name": "a zero payment is refused",
"args": [
[
{
"date": "2026-02-01",
"kind": "payment",
"amount": {
"minor": 0,
"currency": "GBP"
}
}
],
"GBP"
],
"expectError": "a payment must be more than zero"
},
{
"name": "a negative recovery is refused",
"args": [
[
{
"date": "2026-02-01",
"kind": "recovery",
"amount": {
"minor": -5,
"currency": "GBP"
}
}
],
"GBP"
],
"expectError": "a recovery must be more than zero"
},
{
"name": "an unknown kind is refused",
"args": [
[
{
"date": "2026-02-01",
"kind": "expense",
"amount": {
"minor": 5,
"currency": "GBP"
}
}
],
"GBP"
],
"expectError": "unknown transaction kind"
},
{
"name": "a transaction in another currency is refused",
"args": [
[
{
"date": "2026-02-01",
"kind": "reserve",
"amount": {
"minor": 5,
"currency": "EUR"
}
}
],
"GBP"
],
"expectError": "currency mismatch"
},
{
"name": "a malformed date is refused",
"args": [
[
{
"date": "2026-02-30",
"kind": "reserve",
"amount": {
"minor": 5,
"currency": "GBP"
}
}
],
"GBP"
],
"expectError": "is not a real calendar date"
}
]