import pytest
from evrouting.charge.utils import LabelPriorityQueue
from evrouting.charge.T import Label


@pytest.fixture
def q(label, ch_function):
    _, _, cf = ch_function
    dummy_cf = {label.last_cs: cf}
    q = LabelPriorityQueue(dummy_cf)
    q.insert(label)

    # create min
    label = Label(
        t_trip=8,
        soc_last_cs=2,
        soc_profile_cs_v=label.soc_profile_cs_v,
        last_cs=1
    )

    dummy_cf[label.last_cs] = cf
    q.insert(label)

    yield q
    del q


class TestProrityQueue:
    def test_empty(self, q: LabelPriorityQueue):
        q.delete_min()
        q.delete_min()

        with pytest.raises(KeyError):
            q.delete_min()

    def test_peak(self, q: LabelPriorityQueue):
        assert q.peak_min().t_trip == 8

    def test_insert_same(self, q: LabelPriorityQueue, ch_function):
        """Should be no problem."""
        _, _, cf = ch_function
        label = q.peak_min()
        q.remove_item(label)
        q.insert(label)