[ { "name": "CPR 2.8 example (i): 3 days before a hearing on Friday 20 October: Monday 16 October", "args": [ "2023-10-20", 3, "at-least-before", false, [] ], "expect": { "date": "2023-10-16", "shortPeriod": true, "extended": false } }, { "name": "CPR 2.8(4) example: 3 days before a hearing on Monday 20 October: Tuesday 14 October", "args": [ "2025-10-20", 3, "at-least-before", false, [] ], "expect": { "date": "2025-10-14", "shortPeriod": true, "extended": false } }, { "name": "CPR 2.8 example (ii): at least 28 days after notice on 1 October: 30 October", "args": [ "2023-10-01", 28, "at-least-after", false, [] ], "expect": { "date": "2023-10-30", "shortPeriod": false, "extended": false } }, { "name": "CPR 2.8 example (iii): within 14 days of service on 2 October: 16 October", "args": [ "2023-10-02", 14, "within", false, [] ], "expect": { "date": "2023-10-16", "shortPeriod": false, "extended": false } }, { "name": "5 days over Easter skip Good Friday, the weekend and Easter Monday", "args": [ "2026-04-02", 5, "within", false, [] ], "expect": { "date": "2026-04-13", "shortPeriod": true, "extended": false } }, { "name": "5 days over Christmas and New Year skip both years' bank holidays", "args": [ "2025-12-23", 5, "within", false, [] ], "expect": { "date": "2026-01-02", "shortPeriod": true, "extended": false } }, { "name": "6 days is not a short period: Easter counts, calendar days only", "args": [ "2026-04-03", 6, "within", false, [] ], "expect": { "date": "2026-04-09", "shortPeriod": false, "extended": false } }, { "name": "a 7-day period ending on a Saturday stays there for an act out of court", "args": [ "2026-09-12", 7, "within", false, [] ], "expect": { "date": "2026-09-19", "shortPeriod": false, "extended": false } }, { "name": "the same period for filing at court moves to Monday (CPR 2.8(5))", "args": [ "2026-09-12", 7, "within", true, [] ], "expect": { "date": "2026-09-21", "shortPeriod": false, "extended": true } }, { "name": "14 days ending on the August bank holiday: filing is in time on Tuesday", "args": [ "2026-08-17", 14, "within", true, [] ], "expect": { "date": "2026-09-01", "shortPeriod": false, "extended": true } }, { "name": "the court office's own closure days move a filing deadline further", "args": [ "2026-12-15", 14, "within", true, [ "2026-12-29", "2026-12-30" ] ], "expect": { "date": "2026-12-31", "shortPeriod": false, "extended": true } }, { "name": "a filing deadline on an open day is not moved", "args": [ "2026-09-01", 14, "within", true, [ "2026-09-16" ] ], "expect": { "date": "2026-09-15", "shortPeriod": false, "extended": false } }, { "name": "at least 3 days after notice on a Friday: the clear days are Monday to Wednesday", "args": [ "2026-09-18", 3, "at-least-after", false, [] ], "expect": { "date": "2026-09-24", "shortPeriod": true, "extended": false } }, { "name": "3 days before a Thursday hearing: Monday to Wednesday are clear, so literally the Sunday", "args": [ "2026-09-24", 3, "at-least-before", false, [] ], "expect": { "date": "2026-09-20", "shortPeriod": true, "extended": false } }, { "name": "7 clear days before a hearing count every calendar day", "args": [ "2026-09-24", 7, "at-least-before", false, [] ], "expect": { "date": "2026-09-16", "shortPeriod": false, "extended": false } }, { "name": "a short period triggered on a Saturday starts counting on Monday", "args": [ "2026-09-19", 2, "within", false, [] ], "expect": { "date": "2026-09-22", "shortPeriod": true, "extended": false } }, { "name": "1 day within, from a Friday: Monday", "args": [ "2026-09-18", 1, "within", false, [] ], "expect": { "date": "2026-09-21", "shortPeriod": true, "extended": false } }, { "name": "zero days is an error", "args": [ "2026-09-18", 0, "within", false, [] ], "expectError": "days must be an integer of at least 1" }, { "name": "CPR 2.8(5) cannot move a before-deadline later", "args": [ "2026-09-24", 3, "at-least-before", true, [] ], "expectError": "atCourtOffice applies only to a within period" }, { "name": "closed days without atCourtOffice are an error, not ignored", "args": [ "2026-09-01", 14, "within", false, [ "2026-09-15" ] ], "expectError": "courtClosedDays only apply when atCourtOffice is true" }, { "name": "a short period in a year without published bank holidays is an error", "args": [ "2029-03-01", 3, "within", false, [] ], "expectError": "no bank holiday data" }, { "name": "an impossible trigger date is an error", "args": [ "2026-02-30", 3, "within", false, [] ], "expectError": "not a real calendar date" }, { "name": "an unknown rule is an error", "args": [ "2026-09-18", 3, "by", false, [] ], "expectError": "unknown deadline rule" } ]