pyority_queue/tests/paired_queue.py

97 lines
2.1 KiB
Python

from typing import Any, TYPE_CHECKING
import pytest
from pyority_queue import PairedQueue
if TYPE_CHECKING:
from pyority_queue import Comparable
type PairedQueueInitializer = dict[Any, Comparable] | list[tuple[Any, Comparable]] | tuple[tuple[Any, Comparable], ...]
def test_empty_creation():
queue = PairedQueue()
assert len(queue) == 0
@pytest.mark.parametrize("items", (
[],
[("a", 0), ("b", 1), ("c", 2)],
((0, 0), (1, 1), (2, 2)),
((0.0, 0.0), (1.0, 1.0), (2.0, 2.0)),
((lambda: None, 0),),
((Exception(), 0.0),),
(([], -1),),
{},
{"a": 0, "b": 1, "c": 2},
))
def test_creation(items: PairedQueueInitializer):
queue = PairedQueue(items)
assert len(queue) == len(items)
@pytest.mark.parametrize("items", (
[],
((0, 0),),
((-1, -1), (3, 3)),
))
def test_iteration(items: PairedQueueInitializer):
queue = PairedQueue(items)
assert len(list(queue)) == len(items)
@pytest.mark.parametrize("items", (
[],
(("a", -3), ("b", 5)),
(("c", 3.0), ("b", 2.0), ("a", 1.0)),
(("c", 3), ("f", 6), ("h", 8), ("e", 5), ("g", 7), ("d", 4), ("b", 2), ("a", 0)),
))
def test_sorting(items: PairedQueueInitializer):
queue = PairedQueue(items)
in_order = list(queue)
assert in_order == sorted(in_order)
def test_insertion():
queue = PairedQueue({"a": 1, "b": 2, "c": 3})
queue["d"] = 4
queue["e"] = 5
assert list(queue) == ["a", "b", "c", "d", "e"]
def test_removal():
queue = PairedQueue[str, int]({"a": 1, "b": 2, "c": 3})
assert queue.pop() == "a"
assert queue.pop() == "b"
assert queue.pop() == "c"
assert len(queue) == 0
def test_mixed_removal():
queue = PairedQueue[str, int]({"a": 1, "b": 2, "c": 3})
assert queue.pop() == "a"
assert list(queue) == ["b", "c"]
def test_empty_removal():
queue = PairedQueue()
with pytest.raises(IndexError):
queue.pop()
def test_duplicates():
queue = PairedQueue[str, int]((("a", 0), ("a", 0), ("a", 2)))
queue["b"] = 1
queue["b"] = 3
assert list(queue) == ["a", "a", "b", "a", "b"]
def test_mixed_iteration():
queue = PairedQueue[str, int]({"a": 1, "b": 2, "c": 3})
results = []
for char in queue:
results.append(char)
if len(queue):
queue[queue.pop()] = 10
assert results == ["a", "c", "b"]