[ { "name": "26 at inception is in the 25-29 band", "args": [ "2000-06-15", "2026-09-23", [ { "label": "17-20", "minAge": 17, "maxAge": 20 }, { "label": "21-24", "minAge": 21, "maxAge": 24 }, { "label": "25-29", "minAge": 25, "maxAge": 29 }, { "label": "30-49", "minAge": 30, "maxAge": 49 }, { "label": "50-69", "minAge": 50, "maxAge": 69 }, { "label": "70+", "minAge": 70, "maxAge": null } ] ], "expect": { "age": 26, "label": "25-29" } }, { "name": "a birthday on the inception date counts: 25 that day", "args": [ "2001-09-23", "2026-09-23", [ { "label": "17-20", "minAge": 17, "maxAge": 20 }, { "label": "21-24", "minAge": 21, "maxAge": 24 }, { "label": "25-29", "minAge": 25, "maxAge": 29 }, { "label": "30-49", "minAge": 30, "maxAge": 49 }, { "label": "50-69", "minAge": 50, "maxAge": 69 }, { "label": "70+", "minAge": 70, "maxAge": null } ] ], "expect": { "age": 25, "label": "25-29" } }, { "name": "the day before the 25th birthday is still 24", "args": [ "2001-09-23", "2026-09-22", [ { "label": "17-20", "minAge": 17, "maxAge": 20 }, { "label": "21-24", "minAge": 21, "maxAge": 24 }, { "label": "25-29", "minAge": 25, "maxAge": 29 }, { "label": "30-49", "minAge": 30, "maxAge": 49 }, { "label": "50-69", "minAge": 50, "maxAge": 69 }, { "label": "70+", "minAge": 70, "maxAge": null } ] ], "expect": { "age": 24, "label": "21-24" } }, { "name": "a 29 February birthday has not turned 21 on 28 February", "args": [ "2004-02-29", "2025-02-28", [ { "label": "17-20", "minAge": 17, "maxAge": 20 }, { "label": "21-24", "minAge": 21, "maxAge": 24 }, { "label": "25-29", "minAge": 25, "maxAge": 29 }, { "label": "30-49", "minAge": 30, "maxAge": 49 }, { "label": "50-69", "minAge": 50, "maxAge": 69 }, { "label": "70+", "minAge": 70, "maxAge": null } ] ], "expect": { "age": 20, "label": "17-20" } }, { "name": "and turns 21 on 1 March", "args": [ "2004-02-29", "2025-03-01", [ { "label": "17-20", "minAge": 17, "maxAge": 20 }, { "label": "21-24", "minAge": 21, "maxAge": 24 }, { "label": "25-29", "minAge": 25, "maxAge": 29 }, { "label": "30-49", "minAge": 30, "maxAge": 49 }, { "label": "50-69", "minAge": 50, "maxAge": 69 }, { "label": "70+", "minAge": 70, "maxAge": null } ] ], "expect": { "age": 21, "label": "21-24" } }, { "name": "in a leap year it turns on 29 February", "args": [ "2004-02-29", "2028-02-29", [ { "label": "17-20", "minAge": 17, "maxAge": 20 }, { "label": "21-24", "minAge": 21, "maxAge": 24 }, { "label": "25-29", "minAge": 25, "maxAge": 29 }, { "label": "30-49", "minAge": 30, "maxAge": 49 }, { "label": "50-69", "minAge": 50, "maxAge": 69 }, { "label": "70+", "minAge": 70, "maxAge": null } ] ], "expect": { "age": 24, "label": "21-24" } }, { "name": "the open top band", "args": [ "1950-01-01", "2026-09-23", [ { "label": "17-20", "minAge": 17, "maxAge": 20 }, { "label": "21-24", "minAge": 21, "maxAge": 24 }, { "label": "25-29", "minAge": 25, "maxAge": 29 }, { "label": "30-49", "minAge": 30, "maxAge": 49 }, { "label": "50-69", "minAge": 50, "maxAge": 69 }, { "label": "70+", "minAge": 70, "maxAge": null } ] ], "expect": { "age": 76, "label": "70+" } }, { "name": "exactly the youngest age", "args": [ "2009-09-23", "2026-09-23", [ { "label": "17-20", "minAge": 17, "maxAge": 20 }, { "label": "21-24", "minAge": 21, "maxAge": 24 }, { "label": "25-29", "minAge": 25, "maxAge": 29 }, { "label": "30-49", "minAge": 30, "maxAge": 49 }, { "label": "50-69", "minAge": 50, "maxAge": 69 }, { "label": "70+", "minAge": 70, "maxAge": null } ] ], "expect": { "age": 17, "label": "17-20" } }, { "name": "the upper edge of a band is inside it", "args": [ "1976-09-24", "2026-09-23", [ { "label": "17-20", "minAge": 17, "maxAge": 20 }, { "label": "21-24", "minAge": 21, "maxAge": 24 }, { "label": "25-29", "minAge": 25, "maxAge": 29 }, { "label": "30-49", "minAge": 30, "maxAge": 49 }, { "label": "50-69", "minAge": 50, "maxAge": 69 }, { "label": "70+", "minAge": 70, "maxAge": null } ] ], "expect": { "age": 49, "label": "30-49" } }, { "name": "a single open band covers everyone from its minimum", "args": [ "1990-01-01", "2026-01-01", [ { "label": "all", "minAge": 0, "maxAge": null } ] ], "expect": { "age": 36, "label": "all" } }, { "name": "too young for any band", "args": [ "2010-01-01", "2026-09-23", [ { "label": "17-20", "minAge": 17, "maxAge": 20 }, { "label": "21-24", "minAge": 21, "maxAge": 24 }, { "label": "25-29", "minAge": 25, "maxAge": 29 }, { "label": "30-49", "minAge": 30, "maxAge": 49 }, { "label": "50-69", "minAge": 50, "maxAge": 69 }, { "label": "70+", "minAge": 70, "maxAge": null } ] ], "expectError": "no band for age 16" }, { "name": "an age in a gap between bands is refused", "args": [ "2004-01-01", "2026-09-23", [ { "label": "17-20", "minAge": 17, "maxAge": 20 }, { "label": "25+", "minAge": 25, "maxAge": null } ] ], "expectError": "no band for age 22" }, { "name": "overlapping bands are refused", "args": [ "2000-01-01", "2026-09-23", [ { "label": "17-25", "minAge": 17, "maxAge": 25 }, { "label": "25-30", "minAge": 25, "maxAge": 30 } ] ], "expectError": "bands must be youngest first and not overlap" }, { "name": "an open band that is not last is refused", "args": [ "2000-01-01", "2026-09-23", [ { "label": "17+", "minAge": 17, "maxAge": null }, { "label": "25-30", "minAge": 25, "maxAge": 30 } ] ], "expectError": "only the last band may have no maxAge" }, { "name": "a band whose maximum is below its minimum is refused", "args": [ "2000-01-01", "2026-09-23", [ { "label": "odd", "minAge": 30, "maxAge": 20 } ] ], "expectError": "maxAge must be a whole number no less than minAge" }, { "name": "no bands is refused", "args": [ "2000-01-01", "2026-09-23", [] ], "expectError": "bands must not be empty" }, { "name": "inception before birth is refused", "args": [ "2026-09-23", "2026-01-01", [ { "label": "17-20", "minAge": 17, "maxAge": 20 }, { "label": "21-24", "minAge": 21, "maxAge": 24 }, { "label": "25-29", "minAge": 25, "maxAge": 29 }, { "label": "30-49", "minAge": 30, "maxAge": 49 }, { "label": "50-69", "minAge": 50, "maxAge": 69 }, { "label": "70+", "minAge": 70, "maxAge": null } ] ], "expectError": "is before birthDate" }, { "name": "a fractional minimum age is refused", "args": [ "2000-01-01", "2026-09-23", [ { "label": "x", "minAge": 17.5, "maxAge": null } ] ], "expectError": "minAge must be a whole number" } ]