Files
troupe-standup/wizard-work/beam/test_min_meeting_rooms.py
T

68 lines
2.1 KiB
Python

import random
import unittest
from min_meeting_rooms import min_meeting_rooms, min_rooms_heap
class TestMinMeetingRooms(unittest.TestCase):
def test_empty(self):
self.assertEqual(min_meeting_rooms([]), 0)
self.assertEqual(min_rooms_heap([]), 0)
def test_single(self):
self.assertEqual(min_meeting_rooms([(1, 5)]), 1)
def test_no_overlap(self):
self.assertEqual(min_meeting_rooms([(1, 2), (2, 3), (3, 4)]), 1)
def test_all_overlap(self):
self.assertEqual(min_meeting_rooms([(1, 5), (2, 6), (3, 7)]), 3)
def test_touching_not_overlap(self):
self.assertEqual(min_meeting_rooms([(1, 2), (2, 3)]), 1)
def test_unsorted(self):
self.assertEqual(min_meeting_rooms([(5, 9), (1, 3), (4, 6)]), 2)
def test_bad_interval_raises(self):
with self.assertRaises(ValueError):
min_meeting_rooms([(5, 3)])
def test_random_vs_heap(self):
rng = random.Random(123)
for _ in range(3000):
n = rng.randint(0, 8)
ivs = []
for _ in range(n):
s = rng.randint(0, 6)
e = s + rng.randint(0, 6)
ivs.append((s, e))
a = min_meeting_rooms(ivs)
b = min_rooms_heap(ivs)
self.assertEqual(a, b, (ivs, a, b))
def test_random_bruteforce(self):
# brute force via per-time max concurrency on integer grid
rng = random.Random(999)
for _ in range(2000):
n = rng.randint(0, 7)
ivs = []
for _ in range(n):
s = rng.randint(0, 5)
e = s + rng.randint(1, 5)
ivs.append((s, e))
# brute
times = set()
for s, e in ivs:
for t in range(s, e):
times.add(t)
best = 0
for t in times:
c = sum(1 for s, e in ivs if s <= t < e)
if c > best:
best = c
self.assertEqual(min_meeting_rooms(ivs), best, (ivs,))
if __name__ == "__main__":
unittest.main()