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