import random
import unittest
from example import top_k


class HeapTests(unittest.TestCase):
    def test_edges(self):
        self.assertEqual(top_k([], 2), [])
        self.assertEqual(top_k([3], 0), [])
        self.assertEqual(top_k([3], 8), [3])
        with self.assertRaises(ValueError):
            top_k([1], -1)

    def test_stream_against_sort(self):
        rng = random.Random(10)
        for n in range(60):
            values = [rng.randint(-10, 10) for _ in range(n)]
            for k in (0, 1, 4, 100):
                self.assertEqual(top_k(iter(values), k), sorted(values, reverse=True)[:k])


if __name__ == '__main__':
    unittest.main()
