Functional Weave
Code in Rust

education.timetable-clash@1.0.0

vectors.json

11,176 bytes · view raw

[
 {
  "name": "a week's morning: the assembly overlap is reported before the room clash, by overlap start; back-to-back lessons do not clash",
  "args": [
   [
    {
     "id": "maths-7a",
     "day": 1,
     "start": 540,
     "end": 600,
     "rooms": [
      "R1"
     ],
     "teachers": [
      "JS"
     ],
     "groups": [
      "7A"
     ]
    },
    {
     "id": "english-7b",
     "day": 1,
     "start": 570,
     "end": 630,
     "rooms": [
      "R1"
     ],
     "teachers": [
      "AB"
     ],
     "groups": [
      "7B"
     ]
    },
    {
     "id": "science-7a",
     "day": 1,
     "start": 600,
     "end": 660,
     "rooms": [
      "LAB"
     ],
     "teachers": [
      "JS"
     ],
     "groups": [
      "7A"
     ]
    },
    {
     "id": "pe-7a",
     "day": 2,
     "start": 540,
     "end": 600,
     "rooms": [
      "GYM"
     ],
     "teachers": [
      "JS"
     ],
     "groups": [
      "7A"
     ]
    },
    {
     "id": "assembly",
     "day": 1,
     "start": 525,
     "end": 555,
     "rooms": [
      "HALL"
     ],
     "teachers": [
      "JS",
      "AB"
     ],
     "groups": [
      "7A",
      "7B"
     ]
    }
   ]
  ],
  "expect": [
   {
    "first": "maths-7a",
    "second": "assembly",
    "day": 1,
    "start": 540,
    "end": 555,
    "rooms": [],
    "teachers": [
     "JS"
    ],
    "groups": [
     "7A"
    ]
   },
   {
    "first": "maths-7a",
    "second": "english-7b",
    "day": 1,
    "start": 570,
    "end": 600,
    "rooms": [
     "R1"
    ],
    "teachers": [],
    "groups": []
   }
  ]
 },
 {
  "name": "no sessions, no clashes",
  "args": [
   []
  ],
  "expect": []
 },
 {
  "name": "one session cannot clash",
  "args": [
   [
    {
     "id": "maths-7a",
     "day": 1,
     "start": 540,
     "end": 600,
     "rooms": [
      "R1"
     ],
     "teachers": [
      "JS"
     ],
     "groups": [
      "7A"
     ]
    }
   ]
  ],
  "expect": []
 },
 {
  "name": "a session ending at 600 and one starting at 600 in the same room do not clash",
  "args": [
   [
    {
     "id": "maths-7a",
     "day": 1,
     "start": 540,
     "end": 600,
     "rooms": [
      "R1"
     ],
     "teachers": [
      "JS"
     ],
     "groups": [
      "7A"
     ]
    },
    {
     "id": "next",
     "day": 1,
     "start": 600,
     "end": 660,
     "rooms": [
      "R1"
     ],
     "teachers": [
      "JS"
     ],
     "groups": [
      "7A"
     ]
    }
   ]
  ],
  "expect": []
 },
 {
  "name": "one minute of overlap is a clash on everything shared",
  "args": [
   [
    {
     "id": "maths-7a",
     "day": 1,
     "start": 540,
     "end": 600,
     "rooms": [
      "R1"
     ],
     "teachers": [
      "JS"
     ],
     "groups": [
      "7A"
     ]
    },
    {
     "id": "next",
     "day": 1,
     "start": 599,
     "end": 660,
     "rooms": [
      "R1"
     ],
     "teachers": [
      "JS"
     ],
     "groups": [
      "7A"
     ]
    }
   ]
  ],
  "expect": [
   {
    "first": "maths-7a",
    "second": "next",
    "day": 1,
    "start": 599,
    "end": 600,
    "rooms": [
     "R1"
    ],
    "teachers": [
     "JS"
    ],
    "groups": [
     "7A"
    ]
   }
  ]
 },
 {
  "name": "the same resources on different days do not clash",
  "args": [
   [
    {
     "id": "maths-7a",
     "day": 1,
     "start": 540,
     "end": 600,
     "rooms": [
      "R1"
     ],
     "teachers": [
      "JS"
     ],
     "groups": [
      "7A"
     ]
    },
    {
     "id": "pe-7a",
     "day": 2,
     "start": 540,
     "end": 600,
     "rooms": [
      "GYM"
     ],
     "teachers": [
      "JS"
     ],
     "groups": [
      "7A"
     ]
    }
   ]
  ],
  "expect": []
 },
 {
  "name": "a long session containing a short one: the overlap is the short one",
  "args": [
   [
    {
     "id": "exam",
     "day": 3,
     "start": 540,
     "end": 720,
     "rooms": [
      "HALL"
     ],
     "teachers": [
      "INV"
     ],
     "groups": [
      "11"
     ]
    },
    {
     "id": "mock",
     "day": 3,
     "start": 600,
     "end": 630,
     "rooms": [
      "R9"
     ],
     "teachers": [
      "XY"
     ],
     "groups": [
      "11"
     ]
    }
   ]
  ],
  "expect": [
   {
    "first": "exam",
    "second": "mock",
    "day": 3,
    "start": 600,
    "end": 630,
    "rooms": [],
    "teachers": [],
    "groups": [
     "11"
    ]
   }
  ]
 },
 {
  "name": "overlapping in time but sharing nothing is fine",
  "args": [
   [
    {
     "id": "maths-7a",
     "day": 1,
     "start": 540,
     "end": 600,
     "rooms": [
      "R1"
     ],
     "teachers": [
      "JS"
     ],
     "groups": [
      "7A"
     ]
    },
    {
     "id": "art-8c",
     "day": 1,
     "start": 540,
     "end": 600,
     "rooms": [
      "ART"
     ],
     "teachers": [
      "KL"
     ],
     "groups": [
      "8C"
     ]
    }
   ]
  ],
  "expect": []
 },
 {
  "name": "team teaching: any one teacher in common is a clash, and shared names follow the first session's order",
  "args": [
   [
    {
     "id": "s1",
     "day": 1,
     "start": 540,
     "end": 600,
     "rooms": [
      "R1"
     ],
     "teachers": [
      "T2",
      "T1",
      "T3"
     ],
     "groups": [
      "G1"
     ]
    },
    {
     "id": "s2",
     "day": 1,
     "start": 570,
     "end": 630,
     "rooms": [
      "R2"
     ],
     "teachers": [
      "T3",
      "T2"
     ],
     "groups": [
      "G2"
     ]
    }
   ]
  ],
  "expect": [
   {
    "first": "s1",
    "second": "s2",
    "day": 1,
    "start": 570,
    "end": 600,
    "rooms": [],
    "teachers": [
     "T2",
     "T3"
    ],
    "groups": []
   }
  ]
 },
 {
  "name": "equal overlap starts are ordered by input position",
  "args": [
   [
    {
     "id": "a",
     "day": 1,
     "start": 540,
     "end": 600,
     "rooms": [
      "R1"
     ],
     "teachers": [],
     "groups": []
    },
    {
     "id": "b",
     "day": 1,
     "start": 540,
     "end": 600,
     "rooms": [
      "R1"
     ],
     "teachers": [],
     "groups": []
    },
    {
     "id": "c",
     "day": 1,
     "start": 540,
     "end": 600,
     "rooms": [
      "R1"
     ],
     "teachers": [],
     "groups": []
    }
   ]
  ],
  "expect": [
   {
    "first": "a",
    "second": "b",
    "day": 1,
    "start": 540,
    "end": 600,
    "rooms": [
     "R1"
    ],
    "teachers": [],
    "groups": []
   },
   {
    "first": "a",
    "second": "c",
    "day": 1,
    "start": 540,
    "end": 600,
    "rooms": [
     "R1"
    ],
    "teachers": [],
    "groups": []
   },
   {
    "first": "b",
    "second": "c",
    "day": 1,
    "start": 540,
    "end": 600,
    "rooms": [
     "R1"
    ],
    "teachers": [],
    "groups": []
   }
  ]
 },
 {
  "name": "later days come after earlier ones whatever the input order",
  "args": [
   [
    {
     "id": "x",
     "day": 2,
     "start": 540,
     "end": 600,
     "rooms": [
      "R1"
     ],
     "teachers": [],
     "groups": []
    },
    {
     "id": "y",
     "day": 2,
     "start": 550,
     "end": 600,
     "rooms": [
      "R1"
     ],
     "teachers": [],
     "groups": []
    },
    {
     "id": "p",
     "day": 1,
     "start": 900,
     "end": 960,
     "rooms": [
      "R1"
     ],
     "teachers": [],
     "groups": []
    },
    {
     "id": "q",
     "day": 1,
     "start": 930,
     "end": 990,
     "rooms": [
      "R1"
     ],
     "teachers": [],
     "groups": []
    }
   ]
  ],
  "expect": [
   {
    "first": "p",
    "second": "q",
    "day": 1,
    "start": 930,
    "end": 960,
    "rooms": [
     "R1"
    ],
    "teachers": [],
    "groups": []
   },
   {
    "first": "x",
    "second": "y",
    "day": 2,
    "start": 550,
    "end": 600,
    "rooms": [
     "R1"
    ],
    "teachers": [],
    "groups": []
   }
  ]
 },
 {
  "name": "a session with no rooms, teachers or groups clashes with nothing",
  "args": [
   [
    {
     "id": "free",
     "day": 1,
     "start": 540,
     "end": 600,
     "rooms": [],
     "teachers": [],
     "groups": []
    },
    {
     "id": "maths-7a",
     "day": 1,
     "start": 540,
     "end": 600,
     "rooms": [
      "R1"
     ],
     "teachers": [
      "JS"
     ],
     "groups": [
      "7A"
     ]
    }
   ]
  ],
  "expect": []
 },
 {
  "name": "a whole day up to midnight",
  "args": [
   [
    {
     "id": "d1",
     "day": 4,
     "start": 0,
     "end": 1440,
     "rooms": [
      "R1"
     ],
     "teachers": [],
     "groups": []
    },
    {
     "id": "d2",
     "day": 4,
     "start": 1380,
     "end": 1440,
     "rooms": [
      "R1"
     ],
     "teachers": [],
     "groups": []
    }
   ]
  ],
  "expect": [
   {
    "first": "d1",
    "second": "d2",
    "day": 4,
    "start": 1380,
    "end": 1440,
    "rooms": [
     "R1"
    ],
    "teachers": [],
    "groups": []
   }
  ]
 },
 {
  "name": "a repeated id is an error",
  "args": [
   [
    {
     "id": "maths-7a",
     "day": 1,
     "start": 540,
     "end": 600,
     "rooms": [
      "R1"
     ],
     "teachers": [
      "JS"
     ],
     "groups": [
      "7A"
     ]
    },
    {
     "id": "maths-7a",
     "day": 1,
     "start": 540,
     "end": 600,
     "rooms": [
      "R1"
     ],
     "teachers": [
      "JS"
     ],
     "groups": [
      "7A"
     ]
    }
   ]
  ],
  "expectError": "session id \"maths-7a\" appears twice"
 },
 {
  "name": "an end before the start is an error",
  "args": [
   [
    {
     "id": "bad",
     "day": 1,
     "start": 600,
     "end": 540,
     "rooms": [],
     "teachers": [],
     "groups": []
    }
   ]
  ],
  "expectError": "end must be a whole minute after start and no later than 1440, received 540 for \"bad\""
 },
 {
  "name": "a zero-length session is an error",
  "args": [
   [
    {
     "id": "bad",
     "day": 1,
     "start": 600,
     "end": 600,
     "rooms": [],
     "teachers": [],
     "groups": []
    }
   ]
  ],
  "expectError": "end must be a whole minute after start and no later than 1440, received 600 for \"bad\""
 },
 {
  "name": "an end past midnight is an error",
  "args": [
   [
    {
     "id": "bad",
     "day": 1,
     "start": 1400,
     "end": 1441,
     "rooms": [],
     "teachers": [],
     "groups": []
    }
   ]
  ],
  "expectError": "end must be a whole minute after start and no later than 1440, received 1441 for \"bad\""
 },
 {
  "name": "a negative start is an error",
  "args": [
   [
    {
     "id": "bad",
     "day": 1,
     "start": -1,
     "end": 60,
     "rooms": [],
     "teachers": [],
     "groups": []
    }
   ]
  ],
  "expectError": "start must be a whole minute from 0 to 1439, received -1 for \"bad\""
 },
 {
  "name": "a fractional minute is an error",
  "args": [
   [
    {
     "id": "bad",
     "day": 1,
     "start": 540.5,
     "end": 600,
     "rooms": [],
     "teachers": [],
     "groups": []
    }
   ]
  ],
  "expectError": "start must be a whole minute from 0 to 1439, received 540.5 for \"bad\""
 },
 {
  "name": "day 0 is an error",
  "args": [
   [
    {
     "id": "bad",
     "day": 0,
     "start": 540,
     "end": 600,
     "rooms": [],
     "teachers": [],
     "groups": []
    }
   ]
  ],
  "expectError": "day must be a whole number of 1 or more, received 0 for \"bad\""
 }
]