[ { "name": "38 of 380 sessions missed is exactly 10%: persistently absent", "args": [ 380, 38, "2025-10-01" ], "expect": { "attendanceBasisPoints": 9000, "absenceBasisPoints": 1000, "persistentlyAbsent": true, "severelyAbsent": false } }, { "name": "37 of 380 is 9.74%: not persistently absent", "args": [ 380, 37, "2025-10-01" ], "expect": { "attendanceBasisPoints": 9026, "absenceBasisPoints": 974, "persistentlyAbsent": false, "severelyAbsent": false } }, { "name": "250 of 2,501 rounds to 10.00% but is under 10%: not persistently absent", "args": [ 2501, 250, "2025-10-01" ], "expect": { "attendanceBasisPoints": 9000, "absenceBasisPoints": 1000, "persistentlyAbsent": false, "severelyAbsent": false } }, { "name": "190 of 380 is exactly half: severely absent", "args": [ 380, 190, "2025-10-01" ], "expect": { "attendanceBasisPoints": 5000, "absenceBasisPoints": 5000, "persistentlyAbsent": true, "severelyAbsent": true } }, { "name": "189 of 380 is just under half", "args": [ 380, 189, "2025-10-01" ], "expect": { "attendanceBasisPoints": 5026, "absenceBasisPoints": 4974, "persistentlyAbsent": true, "severelyAbsent": false } }, { "name": "no sessions missed", "args": [ 380, 0, "2025-10-01" ], "expect": { "attendanceBasisPoints": 10000, "absenceBasisPoints": 0, "persistentlyAbsent": false, "severelyAbsent": false } }, { "name": "every session missed", "args": [ 380, 380, "2025-10-01" ], "expect": { "attendanceBasisPoints": 0, "absenceBasisPoints": 10000, "persistentlyAbsent": true, "severelyAbsent": true } }, { "name": "a half basis point rounds absence up and attendance is what is left, so they sum to 100%", "args": [ 20000, 1, "2025-10-01" ], "expect": { "attendanceBasisPoints": 9999, "absenceBasisPoints": 1, "persistentlyAbsent": false, "severelyAbsent": false } }, { "name": "a single possible session, attended", "args": [ 1, 0, "2025-10-01" ], "expect": { "attendanceBasisPoints": 10000, "absenceBasisPoints": 0, "persistentlyAbsent": false, "severelyAbsent": false } }, { "name": "2016/17, before severe absence was published: severe is null", "args": [ 380, 190, "2016-10-01" ], "expect": { "attendanceBasisPoints": 5000, "absenceBasisPoints": 5000, "persistentlyAbsent": true, "severelyAbsent": null } }, { "name": "the last day before severe absence data", "args": [ 380, 190, "2018-08-31" ], "expect": { "attendanceBasisPoints": 5000, "absenceBasisPoints": 5000, "persistentlyAbsent": true, "severelyAbsent": null } }, { "name": "the first day of 2018/19", "args": [ 380, 190, "2018-09-01" ], "expect": { "attendanceBasisPoints": 5000, "absenceBasisPoints": 5000, "persistentlyAbsent": true, "severelyAbsent": true } }, { "name": "the first day of the 10% definition", "args": [ 380, 38, "2015-09-01" ], "expect": { "attendanceBasisPoints": 9000, "absenceBasisPoints": 1000, "persistentlyAbsent": true, "severelyAbsent": null } }, { "name": "before 2015/16 there is no per-pupil 10% definition", "args": [ 380, 38, "2015-08-31" ], "expectError": "no persistent absence definition on 2015-08-31" }, { "name": "more sessions missed than possible is an error", "args": [ 380, 381, "2025-10-01" ], "expectError": "missedSessions must be a whole number from 0 to possibleSessions (380), received 381" }, { "name": "negative missed sessions is an error", "args": [ 380, -1, "2025-10-01" ], "expectError": "missedSessions must be a whole number from 0 to possibleSessions (380), received -1" }, { "name": "half a session is an error", "args": [ 380, 1.5, "2025-10-01" ], "expectError": "missedSessions must be a whole number from 0 to possibleSessions (380), received 1.5" }, { "name": "no possible sessions is an error", "args": [ 0, 0, "2025-10-01" ], "expectError": "possibleSessions must be a whole number of 1 or more, received 0" }, { "name": "an impossible date is an error", "args": [ 380, 38, "2025-02-30" ], "expectError": "\"2025-02-30\" is not a real calendar date" } ]