Functional Weave
Code in Python

education.academic-year@1.0.0

vectors.json

7,254 bytes · view raw

[
 {
  "name": "mid-October is autumn term of 2025/26",
  "args": [
   "2025-10-15",
   null,
   [
    {
     "name": "summer",
     "start": "2026-04-13",
     "end": "2026-07-22"
    },
    {
     "name": "autumn",
     "start": "2025-09-03",
     "end": "2025-12-19"
    },
    {
     "name": "spring",
     "start": "2026-01-05",
     "end": "2026-03-27"
    }
   ]
  ],
  "expect": {
   "label": "2025/26",
   "start": "2025-09-01",
   "end": "2026-08-31",
   "term": "autumn",
   "termStart": "2025-09-03",
   "termEnd": "2025-12-19"
  }
 },
 {
  "name": "1 September starts the year, but term has not begun",
  "args": [
   "2025-09-01",
   null,
   [
    {
     "name": "summer",
     "start": "2026-04-13",
     "end": "2026-07-22"
    },
    {
     "name": "autumn",
     "start": "2025-09-03",
     "end": "2025-12-19"
    },
    {
     "name": "spring",
     "start": "2026-01-05",
     "end": "2026-03-27"
    }
   ]
  ],
  "expect": {
   "label": "2025/26",
   "start": "2025-09-01",
   "end": "2026-08-31",
   "term": null,
   "termStart": null,
   "termEnd": null
  }
 },
 {
  "name": "31 August is the last day of the previous year",
  "args": [
   "2025-08-31",
   null,
   [
    {
     "name": "summer",
     "start": "2026-04-13",
     "end": "2026-07-22"
    },
    {
     "name": "autumn",
     "start": "2025-09-03",
     "end": "2025-12-19"
    },
    {
     "name": "spring",
     "start": "2026-01-05",
     "end": "2026-03-27"
    }
   ]
  ],
  "expect": {
   "label": "2024/25",
   "start": "2024-09-01",
   "end": "2025-08-31",
   "term": null,
   "termStart": null,
   "termEnd": null
  }
 },
 {
  "name": "Christmas is in the year but in no term",
  "args": [
   "2025-12-25",
   null,
   [
    {
     "name": "summer",
     "start": "2026-04-13",
     "end": "2026-07-22"
    },
    {
     "name": "autumn",
     "start": "2025-09-03",
     "end": "2025-12-19"
    },
    {
     "name": "spring",
     "start": "2026-01-05",
     "end": "2026-03-27"
    }
   ]
  ],
  "expect": {
   "label": "2025/26",
   "start": "2025-09-01",
   "end": "2026-08-31",
   "term": null,
   "termStart": null,
   "termEnd": null
  }
 },
 {
  "name": "a term's last day is inside it",
  "args": [
   "2025-12-19",
   null,
   [
    {
     "name": "summer",
     "start": "2026-04-13",
     "end": "2026-07-22"
    },
    {
     "name": "autumn",
     "start": "2025-09-03",
     "end": "2025-12-19"
    },
    {
     "name": "spring",
     "start": "2026-01-05",
     "end": "2026-03-27"
    }
   ]
  ],
  "expect": {
   "label": "2025/26",
   "start": "2025-09-01",
   "end": "2026-08-31",
   "term": "autumn",
   "termStart": "2025-09-03",
   "termEnd": "2025-12-19"
  }
 },
 {
  "name": "a term's first day is inside it",
  "args": [
   "2026-04-13",
   null,
   [
    {
     "name": "summer",
     "start": "2026-04-13",
     "end": "2026-07-22"
    },
    {
     "name": "autumn",
     "start": "2025-09-03",
     "end": "2025-12-19"
    },
    {
     "name": "spring",
     "start": "2026-01-05",
     "end": "2026-03-27"
    }
   ]
  ],
  "expect": {
   "label": "2025/26",
   "start": "2025-09-01",
   "end": "2026-08-31",
   "term": "summer",
   "termStart": "2026-04-13",
   "termEnd": "2026-07-22"
  }
 },
 {
  "name": "the summer holiday after the last term",
  "args": [
   "2026-08-15",
   null,
   [
    {
     "name": "summer",
     "start": "2026-04-13",
     "end": "2026-07-22"
    },
    {
     "name": "autumn",
     "start": "2025-09-03",
     "end": "2025-12-19"
    },
    {
     "name": "spring",
     "start": "2026-01-05",
     "end": "2026-03-27"
    }
   ]
  ],
  "expect": {
   "label": "2025/26",
   "start": "2025-09-01",
   "end": "2026-08-31",
   "term": null,
   "termStart": null,
   "termEnd": null
  }
 },
 {
  "name": "no terms given",
  "args": [
   "2026-02-01",
   null,
   []
  ],
  "expect": {
   "label": "2025/26",
   "start": "2025-09-01",
   "end": "2026-08-31",
   "term": null,
   "termStart": null,
   "termEnd": null
  }
 },
 {
  "name": "an August start",
  "args": [
   "2025-08-01",
   "08-01",
   []
  ],
  "expect": {
   "label": "2025/26",
   "start": "2025-08-01",
   "end": "2026-07-31",
   "term": null,
   "termStart": null,
   "termEnd": null
  }
 },
 {
  "name": "the day before an August start",
  "args": [
   "2025-07-31",
   "08-01",
   []
  ],
  "expect": {
   "label": "2024/25",
   "start": "2024-08-01",
   "end": "2025-07-31",
   "term": null,
   "termStart": null,
   "termEnd": null
  }
 },
 {
  "name": "a 1 January start is one calendar year",
  "args": [
   "2026-06-30",
   "01-01",
   []
  ],
  "expect": {
   "label": "2026",
   "start": "2026-01-01",
   "end": "2026-12-31",
   "term": null,
   "termStart": null,
   "termEnd": null
  }
 },
 {
  "name": "the century turns in the label",
  "args": [
   "1999-12-01",
   null,
   []
  ],
  "expect": {
   "label": "1999/00",
   "start": "1999-09-01",
   "end": "2000-08-31",
   "term": null,
   "termStart": null,
   "termEnd": null
  }
 },
 {
  "name": "a 1 March start ends on 29 February in a leap year",
  "args": [
   "2024-02-29",
   "03-01",
   []
  ],
  "expect": {
   "label": "2023/24",
   "start": "2023-03-01",
   "end": "2024-02-29",
   "term": null,
   "termStart": null,
   "termEnd": null
  }
 },
 {
  "name": "and on 28 February otherwise",
  "args": [
   "2025-02-28",
   "03-01",
   []
  ],
  "expect": {
   "label": "2024/25",
   "start": "2024-03-01",
   "end": "2025-02-28",
   "term": null,
   "termStart": null,
   "termEnd": null
  }
 },
 {
  "name": "a term outside the year is still found by date",
  "args": [
   "2025-09-25",
   "10-01",
   [
    {
     "name": "welcome week",
     "start": "2025-09-22",
     "end": "2025-09-26"
    }
   ]
  ],
  "expect": {
   "label": "2024/25",
   "start": "2024-10-01",
   "end": "2025-09-30",
   "term": "welcome week",
   "termStart": "2025-09-22",
   "termEnd": "2025-09-26"
  }
 },
 {
  "name": "29 February is not a day every year has",
  "args": [
   "2025-10-15",
   "02-29",
   []
  ],
  "expectError": "yearStart must be MM-DD on a day every year has, received \"02-29\""
 },
 {
  "name": "a thirteenth month is an error",
  "args": [
   "2025-10-15",
   "13-01",
   []
  ],
  "expectError": "yearStart must be MM-DD on a day every year has, received \"13-01\""
 },
 {
  "name": "an unpadded yearStart is an error",
  "args": [
   "2025-10-15",
   "9-1",
   []
  ],
  "expectError": "yearStart must be MM-DD on a day every year has, received \"9-1\""
 },
 {
  "name": "a term ending before it starts is an error",
  "args": [
   "2025-10-15",
   null,
   [
    {
     "name": "autumn",
     "start": "2025-12-19",
     "end": "2025-09-03"
    }
   ]
  ],
  "expectError": "term autumn ends (2025-09-03) before it starts (2025-12-19)"
 },
 {
  "name": "overlapping terms are an error",
  "args": [
   "2025-10-15",
   null,
   [
    {
     "name": "autumn",
     "start": "2025-09-03",
     "end": "2025-12-19"
    },
    {
     "name": "winter",
     "start": "2025-12-19",
     "end": "2026-03-27"
    }
   ]
  ],
  "expectError": "terms autumn and winter overlap"
 },
 {
  "name": "an impossible date is an error",
  "args": [
   "2025-02-30",
   null,
   []
  ],
  "expectError": "\"2025-02-30\" is not a real calendar date"
 }
]