from datetime import timedelta

import pytest

import progressbar2


@pytest.mark.parametrize(
    'poll_interval,expected',
    [
        (1, 1),
        (timedelta(seconds=1), 1),
        (0.001, 0.001),
        (timedelta(microseconds=1000), 0.001),
    ],
)
@pytest.mark.parametrize(
    'parameter',
    [
        'poll_interval',
        'min_poll_interval',
    ],
)
def test_poll_interval(parameter, poll_interval, expected) -> None:
    # Test int, float and timedelta intervals
    bar = progressbar2.ProgressBar(**{parameter: poll_interval})
    assert getattr(bar, parameter) == expected


@pytest.mark.parametrize(
    'interval',
    [
        1,
        timedelta(seconds=1),
    ],
)
def test_intervals(monkeypatch, interval) -> None:
    monkeypatch.setattr(
        progressbar2.ProgressBar,
        '_MINIMUM_UPDATE_INTERVAL',
        interval,
    )
    bar = progressbar2.ProgressBar(max_value=100)

    # Initially there should be no last_update_time
    assert bar.last_update_time is None

    # After updating there should be a last_update_time
    bar.update(1)
    assert bar.last_update_time

    # We should not need an update if the time is nearly the same as before
    last_update_time = bar.last_update_time
    bar.update(2)
    assert bar.last_update_time == last_update_time

    # We should need an update if we're beyond the poll_interval
    bar._last_update_time -= 2
    bar.update(3)
    assert bar.last_update_time != last_update_time
