[ {"name":"an 11 hour rest after the day's work is a regular daily rest","args":["2026-09-21","06:00",[{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":660},{"kind":"driving","minutes":60}]],"expect":{"compliant":true,"dailyRests":1,"reducedDailyRests":0,"weeklyRests":0,"reducedWeeklyRests":0,"breaches":[]}}, {"name":"a 10 hour rest is a reduced daily rest","args":["2026-09-21","06:00",[{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":600},{"kind":"driving","minutes":60}]],"expect":{"compliant":true,"dailyRests":1,"reducedDailyRests":1,"weeklyRests":0,"reducedWeeklyRests":0,"breaches":[]}}, {"name":"3 hours then 9 hours is a split regular daily rest","args":["2026-09-21","06:00",[{"kind":"driving","minutes":240},{"kind":"rest","minutes":180},{"kind":"driving","minutes":240},{"kind":"rest","minutes":540},{"kind":"driving","minutes":60}]],"expect":{"compliant":true,"dailyRests":1,"reducedDailyRests":0,"weeklyRests":0,"reducedWeeklyRests":0,"breaches":[]}}, {"name":"9 hours then 3 hours is not a split rest: the 9 hours is a reduced daily rest","args":["2026-09-21","06:00",[{"kind":"driving","minutes":240},{"kind":"rest","minutes":540},{"kind":"driving","minutes":240},{"kind":"rest","minutes":180},{"kind":"driving","minutes":60}]],"expect":{"compliant":true,"dailyRests":1,"reducedDailyRests":1,"weeklyRests":0,"reducedWeeklyRests":0,"breaches":[]}}, {"name":"an 11 hour rest after a 14 hour day has only 10 hours inside the 24, so it is reduced","args":["2026-09-21","06:00",[{"kind":"work","minutes":840},{"kind":"rest","minutes":660},{"kind":"driving","minutes":60}]],"expect":{"compliant":true,"dailyRests":1,"reducedDailyRests":1,"weeklyRests":0,"reducedWeeklyRests":0,"breaches":[]}}, {"name":"no rest of 9 hours inside the first 24 hours is a daily rest breach at the end of them","args":["2026-09-21","06:00",[{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"work","minutes":600},{"kind":"rest","minutes":600},{"kind":"driving","minutes":60}]],"expect":{"compliant":false,"dailyRests":0,"reducedDailyRests":0,"weeklyRests":0,"reducedWeeklyRests":0,"breaches":[{"rule":"daily-rest","at":"2026-09-22T06:00","actual":45,"limit":540}]}}, {"name":"a fourth reduced daily rest before a weekly rest is one too many","args":["2026-09-21","06:00",[{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":90},{"kind":"rest","minutes":600},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":90},{"kind":"rest","minutes":600},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":90},{"kind":"rest","minutes":600},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":90},{"kind":"rest","minutes":600},{"kind":"driving","minutes":60}]],"expect":{"compliant":false,"dailyRests":4,"reducedDailyRests":4,"weeklyRests":0,"reducedWeeklyRests":0,"breaches":[{"rule":"reduced-daily-rest","at":"2026-09-24T12:00","actual":4,"limit":3}]}}, {"name":"five days then a 45 hour weekly rest on the sixth is compliant","args":["2026-09-21","06:00",[{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":2700},{"kind":"driving","minutes":60}]],"expect":{"compliant":true,"dailyRests":5,"reducedDailyRests":0,"weeklyRests":1,"reducedWeeklyRests":0,"breaches":[]}}, {"name":"a weekly rest starting after six 24-hour periods is late","args":["2026-09-21","06:00",[{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":2700},{"kind":"driving","minutes":60}]],"expect":{"compliant":false,"dailyRests":6,"reducedDailyRests":0,"weeklyRests":1,"reducedWeeklyRests":0,"breaches":[{"rule":"weekly-rest-late","at":"2026-09-27T06:00","actual":9225,"limit":8640}]}}, {"name":"two reduced weekly rests in a row","args":["2026-09-21","06:00",[{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":1440},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":1440},{"kind":"driving","minutes":60}]],"expect":{"compliant":false,"dailyRests":10,"reducedDailyRests":0,"weeklyRests":2,"reducedWeeklyRests":2,"breaches":[{"rule":"reduced-weekly-rest","at":"2026-10-03T01:30","actual":1440,"limit":2700}]}}, {"name":"seven days without a weekly rest: late from the end of the sixth 24 hours","args":["2026-09-21","06:00",[{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270},{"kind":"rest","minutes":855},{"kind":"driving","minutes":60}]],"expect":{"compliant":false,"dailyRests":7,"reducedDailyRests":0,"weeklyRests":0,"reducedWeeklyRests":0,"breaches":[{"rule":"weekly-rest-late","at":"2026-09-27T06:00","actual":10140,"limit":8640}]}}, {"name":"records that stop before the first 24 hours are up are not a breach","args":["2026-09-21","06:00",[{"kind":"driving","minutes":270},{"kind":"rest","minutes":45},{"kind":"driving","minutes":270}]],"expect":{"compliant":true,"dailyRests":0,"reducedDailyRests":0,"weeklyRests":0,"reducedWeeklyRests":0,"breaches":[]}}, {"name":"no activities is compliant","args":["2026-09-21","06:00",[]],"expect":{"compliant":true,"dailyRests":0,"reducedDailyRests":0,"weeklyRests":0,"reducedWeeklyRests":0,"breaches":[]}}, {"name":"a start time of 7:00 without a leading zero is refused","args":["2026-09-21","7:00",[{"kind":"driving","minutes":60}]],"expectError":"startTime must be HH:MM, 24-hour"}, {"name":"an unknown activity kind is refused","args":["2026-09-21","06:00",[{"kind":"sleep","minutes":600}]],"expectError":"unknown activity kind \"sleep\""}, {"name":"a fractional minute is refused","args":["2026-09-21","06:00",[{"kind":"rest","minutes":660.5}]],"expectError":"minutes must be a whole number of at least 1"}, {"name":"a negative length is refused","args":["2026-09-21","06:00",[{"kind":"rest","minutes":-5}]],"expectError":"minutes must be a whole number of at least 1"}, {"name":"dates before Regulation 561/2006 applied are refused","args":["2006-12-31","06:00",[{"kind":"driving","minutes":60}]],"expectError":"no rest limit"}, {"name": "a start date with a trailing newline is refused", "args": ["2026-09-21\n", "06:00", [{"kind": "driving", "minutes": 60}]], "expectError": "startDate must be an ISO date"}, {"name": "a start date in Arabic-Indic digits is refused", "args": ["٢٠٢٦-09-21", "06:00", [{"kind": "driving", "minutes": 60}]], "expectError": "startDate must be an ISO date"}, {"name": "a start time with a trailing newline is refused", "args": ["2026-09-21", "06:00\n", [{"kind": "driving", "minutes": 60}]], "expectError": "startTime must be HH:MM, 24-hour"}, {"name": "a start time in Arabic-Indic digits is refused", "args": ["2026-09-21", "0٦:3٠", [{"kind": "driving", "minutes": 60}]], "expectError": "startTime must be HH:MM, 24-hour"} ]