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