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