from typing import TYPE_CHECKING import pytest from pyority_queue import PureQueue if TYPE_CHECKING: from pyority_queue import Comparable type PureQueueInitializer = list[Comparable] | tuple[Comparable, ...] def test_empty_creation(): queue = PureQueue() assert len(queue) == 0 @pytest.mark.parametrize("items", ([], [0, 1, 2], (0, 1, 2), (0.0, 1.0, 2.0), range(100))) def test_creation(items: PureQueueInitializer): queue = PureQueue(items) assert len(queue) == len(items) @pytest.mark.parametrize("items", ([], (0,), (-1, 3), range(100))) def test_iteration(items: PureQueueInitializer): queue = PureQueue(items) assert len(list(queue)) == len(items) @pytest.mark.parametrize("items", ([], (-3, 5), (3.0, 2.0, 1.0), (3, 6, 8, 5, 7, 4, 2, 0), range(100))) def test_sorting(items: PureQueueInitializer): queue = PureQueue(items) assert list(queue) == sorted(items) def test_insertion(): queue = PureQueue[int]((4, 2, 8, 6)) queue.insert(7) queue.insert(0) queue.insert(3) assert list(queue) == [0, 2, 3, 4, 6, 7, 8] def test_removal(): queue = PureQueue[int]((4, 2, 8, 6)) assert queue.pop() == 2 assert queue.pop() == 4 assert queue.pop() == 6 assert queue.pop() == 8 assert len(queue) == 0 def test_mixed_removal(): queue = PureQueue[int]((4, 2, 8, 6)) assert queue.pop() == 2 assert list(queue) == [4, 6, 8] def test_empty_removal(): queue = PureQueue() with pytest.raises(IndexError): queue.pop() def test_duplicates(): queue = PureQueue[int]((0, 0, 0, 5, 5)) queue.insert(3) queue.insert(3) assert list(queue) == [0, 0, 0, 3, 3, 5, 5] def test_mixed_iteration(): queue = PureQueue[int]((4, 2, 8, 6)) results = [] for number in queue: results.append(number) if len(queue): queue.insert(queue.pop() * 2) assert results == [2, 6, 8, 32]