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