[
{
"name": "rolled-up: 12.07% of \u00a3300 is \u00a336.21",
"args": [
"rolled-up",
{
"minor": 30000,
"currency": "GBP"
},
[],
"2024-04-01"
],
"expect": {
"amount": {
"minor": 3621,
"currency": "GBP"
},
"weeksCounted": 0
}
},
{
"name": "rolled-up: 12.07% of \u00a3123.45 is \u00a314.900415, rounded to \u00a314.90",
"args": [
"rolled-up",
{
"minor": 12345,
"currency": "GBP"
},
[],
"2025-01-01"
],
"expect": {
"amount": {
"minor": 1490,
"currency": "GBP"
},
"weeksCounted": 0
}
},
{
"name": "rolled-up: half a penny rounds up (\u00a350 gives \u00a36.035)",
"args": [
"rolled-up",
{
"minor": 5000,
"currency": "GBP"
},
[],
"2025-01-01"
],
"expect": {
"amount": {
"minor": 604,
"currency": "GBP"
},
"weeksCounted": 0
}
},
{
"name": "rolled-up: nothing earned, nothing added",
"args": [
"rolled-up",
{
"minor": 0,
"currency": "GBP"
},
[],
"2025-01-01"
],
"expect": {
"amount": {
"minor": 0,
"currency": "GBP"
},
"weeksCounted": 0
}
},
{
"name": "rolled-up holiday pay is not lawful for a leave year that began before 1 April 2024",
"args": [
"rolled-up",
{
"minor": 30000,
"currency": "GBP"
},
[],
"2024-03-31"
],
"expectError": "no rolled-up holiday pay rule for 2024-03-31"
},
{
"name": "52 weeks at \u00a3400 average \u00a3400",
"args": [
"average-week",
{
"minor": 0,
"currency": "GBP"
},
[
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
}
],
"2025-06-02"
],
"expect": {
"amount": {
"minor": 40000,
"currency": "GBP"
},
"weeksCounted": 52
}
},
{
"name": "unpaid weeks are skipped and earlier weeks brought in to make 52",
"args": [
"average-week",
{
"minor": 0,
"currency": "GBP"
},
[
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 99999,
"currency": "GBP"
}
],
"2025-06-02"
],
"expect": {
"amount": {
"minor": 40000,
"currency": "GBP"
},
"weeksCounted": 52
}
},
{
"name": "fewer than 52 paid weeks: average over those there are",
"args": [
"average-week",
{
"minor": 0,
"currency": "GBP"
},
[
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 30000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 40000,
"currency": "GBP"
},
{
"minor": 50000,
"currency": "GBP"
}
],
"2025-06-02"
],
"expect": {
"amount": {
"minor": 40000,
"currency": "GBP"
},
"weeksCounted": 9
}
},
{
"name": "no week further back than 104 counts, even to make up 52",
"args": [
"average-week",
{
"minor": 0,
"currency": "GBP"
},
[
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
},
{
"minor": 20000,
"currency": "GBP"
}
],
"2025-06-02"
],
"expect": {
"amount": {
"minor": 20000,
"currency": "GBP"
},
"weeksCounted": 44
}
},
{
"name": "the average is rounded to the nearest penny, half up",
"args": [
"average-week",
{
"minor": 0,
"currency": "GBP"
},
[
{
"minor": 10001,
"currency": "GBP"
},
{
"minor": 10000,
"currency": "GBP"
}
],
"2025-06-02"
],
"expect": {
"amount": {
"minor": 10001,
"currency": "GBP"
},
"weeksCounted": 2
}
},
{
"name": "a third of a penny rounds down",
"args": [
"average-week",
{
"minor": 0,
"currency": "GBP"
},
[
{
"minor": 10001,
"currency": "GBP"
},
{
"minor": 10000,
"currency": "GBP"
},
{
"minor": 10000,
"currency": "GBP"
}
],
"2025-06-02"
],
"expect": {
"amount": {
"minor": 10000,
"currency": "GBP"
},
"weeksCounted": 3
}
},
{
"name": "two thirds of a penny rounds up",
"args": [
"average-week",
{
"minor": 0,
"currency": "GBP"
},
[
{
"minor": 10002,
"currency": "GBP"
},
{
"minor": 10000,
"currency": "GBP"
},
{
"minor": 10000,
"currency": "GBP"
}
],
"2025-06-02"
],
"expect": {
"amount": {
"minor": 10001,
"currency": "GBP"
},
"weeksCounted": 3
}
},
{
"name": "no paid week in the window is an error",
"args": [
"average-week",
{
"minor": 0,
"currency": "GBP"
},
[
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
},
{
"minor": 0,
"currency": "GBP"
}
],
"2025-06-02"
],
"expectError": "no week with pay in the last 104 weeks"
},
{
"name": "an empty history is an error",
"args": [
"average-week",
{
"minor": 0,
"currency": "GBP"
},
[],
"2025-06-02"
],
"expectError": "no week with pay"
},
{
"name": "negative weekly pay is an error",
"args": [
"average-week",
{
"minor": 0,
"currency": "GBP"
},
[
{
"minor": 10000,
"currency": "GBP"
},
{
"minor": -500,
"currency": "GBP"
}
],
"2025-06-02"
],
"expectError": "weekly pay must not be negative"
},
{
"name": "mixed currencies are an error",
"args": [
"average-week",
{
"minor": 0,
"currency": "GBP"
},
[
{
"minor": 10000,
"currency": "GBP"
},
{
"minor": 10000,
"currency": "EUR"
}
],
"2025-06-02"
],
"expectError": "currency mismatch"
},
{
"name": "the 52-week reference period did not exist before 6 April 2020",
"args": [
"average-week",
{
"minor": 0,
"currency": "GBP"
},
[
{
"minor": 10000,
"currency": "GBP"
}
],
"2020-04-05"
],
"expectError": "no average-week holiday pay rule for 2020-04-05"
},
{
"name": "negative period pay is an error",
"args": [
"rolled-up",
{
"minor": -1,
"currency": "GBP"
},
[],
"2025-01-01"
],
"expectError": "periodPay must not be negative"
}
]