68 lines
2.1 KiB
Python
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() |