def test_assign_priority_via_pop():
    new_pq = PriorityQueue()
    for i in range(5):
        new_pq.insert(Job(priority=i + 1))
    new_pq.jobs[-1].time_created -= 100
    new_pq.insert(Job(priority=6))
    new_pq.pop()
    assert [job.priority for job in new_pq.jobs] == [6, 5, 1, 4, 2]
def test_assign_priority_via_pop():
    new_pq = PriorityQueue()
    for i in range(5):
        new_pq.insert(Job(priority=i+1))
    new_pq.jobs[-1].time_created -= 100
    new_pq.insert(Job(priority=6))
    new_pq.pop()
    assert [job.priority for job in new_pq.jobs] == [6, 5, 1, 4, 2]
def test_assign_priority_via_pop():
    new_pq = PriorityQueue()
    for _ in range(4):
        new_pq.insert(Job(priority=1))
    new_pq.jobs[3].time_created -= 100
    new_pq.pop()
    assert [job.priority for job in new_pq.jobs] == [6, 1, 1]
    new_pq.jobs[2].time_created -= 100
    new_pq._operations = 4
    new_pq.pop()
    assert [job.priority for job in new_pq.jobs] == [6, 1]
def test_assign_priority_via_pop():
    new_pq = PriorityQueue()
    for _ in range(4):
        new_pq.insert(Job(priority=1))
    new_pq.jobs[3].time_created -= 100
    new_pq.pop()
    assert [job.priority for job in new_pq.jobs] == [6,  1,  1]
    new_pq.jobs[2].time_created -= 100
    new_pq._operations = 4
    new_pq.pop()
    assert [job.priority for job in new_pq.jobs] == [6,  1]
    def test_delete(self):
        pq = PriorityQueue()
        pq.add_element(5)
        pq.add_element(4)
        pq.add_element(6)
        pq.add_element(6)
        pq.add_element(3)
        pq.add_element(7)

        self.assertTrue(pq.elements[0] == 7)
        self.assertTrue(pq.elements[1] == 6)
        self.assertTrue(pq.elements[2] == 6)
        self.assertTrue(pq.elements[3] == 4)
        self.assertTrue(pq.elements[4] == 3)
        self.assertTrue(pq.elements[5] == 5)

        for i in xrange(6, len(pq.elements)):
            self.assertTrue(pq.elements[i] is None)

        res = pq.pop()
        self.assertTrue(res == 7)
def test_empty_pop():
    pq = PriorityQueue()
    with pytest.raises(IndexError):
        pq.pop()
def test_empty_pop():
    pq = PriorityQueue()
    with pytest.raises(IndexError):
        pq.pop()
class PriorityQueueTest(unittest.TestCase):

    def setUp(self):
        self.queue = PriorityQueue()

    @istest
    def starts_at_zero_size(self):
        self.assertEqual(0, len(self.queue))

    @istest
    def can_push_an_elements(self):
        self.queue.push('a')
        self.assertEqual(1, len(self.queue))

    @istest
    def can_push_multiple_elements(self):
        self.queue.push('a')
        self.queue.push('b')
        self.queue.push('c')
        self.assertEqual(3, len(self.queue))

    @istest
    def can_pop_an_element(self):
        expected_element = 'a'
        self.queue.push(expected_element)
        self.assertEqual(expected_element,  self.queue.pop())
        self.assertEqual(0, len(self.queue))

    @istest
    def can_pop_multiple_element(self):
        expected_output = set(['a', 'b', 'c'])
        for item in expected_output:
            self.queue.push(item)
        actual_output = set()
        while self.queue:
            actual_output.add(self.queue.pop())
        self.assertEqual(expected_output,  actual_output)
        self.assertEqual(0, len(self.queue))

    @istest
    def can_pop_items_in_priority_order(self):
        self.queue.push('a', 10)
        self.queue.push('b', 50)
        self.queue.push('c', 1)

        self.assertEqual('c', self.queue.pop())
        self.assertEqual('a', self.queue.pop())
        self.assertEqual('b', self.queue.pop())

    @istest
    def no_priority_defaults_to_lowest_priority(self):
        self.queue.push('a')
        self.queue.push('b', 99)
        self.assertEqual('b', self.queue.pop())
        self.assertEqual('a', self.queue.pop())

    @istest
    def remove_elements(self):
        self.queue.push('a', 9)
        self.queue.push('b', 99)
        self.queue.remove('a')
        self.assertEqual(1, len(self.queue))
        self.assertEqual('b', self.queue.pop())
        self.assertEqual(0, len(self.queue))

    @istest
    def empty_queue_throws_key_error(self):
        with self.assertRaises(KeyError):
            self.queue.pop()
        with self.assertRaises(KeyError):
            self.queue.push('a')
            self.queue.pop()
            self.queue.pop()
        with self.assertRaises(KeyError):
            self.queue.push('b')
            self.queue.remove('b')
            self.queue.pop()

    @istest
    def can_update_priority(self):
        self.queue.push('a', 99)
        self.queue.push('b', 10)
        self.assertEqual(2, len(self.queue))
        self.queue.update('a', 3)
        self.assertEqual(2, len(self.queue))
        self.assertEqual('a', self.queue.pop())
        self.assertEqual('b', self.queue.pop())
        self.assertEqual(0, len(self.queue))