import pytest

from downscaling import HysteresisDownscaler


def test_equal_thresholds():
    downscaler = HysteresisDownscaler(up_threshold=50, down_threshold=50)
    assert downscaler.scale(60) == 60
    assert downscaler.scale(55) == 55
    assert downscaler.scale(50) == 50
    assert downscaler.scale(45) == 50  # Should stay at 50 because down_threshold reached
    assert downscaler.scale(55) == 50 # Stays at 50 because it needs to reach the up threshold to move again
    assert downscaler.scale(60) == 60 # Moves to 60


def test_high_input_values():
    downscaler = HysteresisDownscaler(up_threshold=50, down_threshold=20)
    assert downscaler.scale(1000) == 1000
    assert downscaler.scale(55) == 55


def test_low_input_values():
    downscaler = HysteresisDownscaler(up_threshold=50, down_threshold=20)
    assert downscaler.scale(-1000) == -1000
    assert downscaler.scale(25) == 25


def test_extreme_thresholds():
    downscaler = HysteresisDownscaler(up_threshold=1000, down_threshold=-1000)
    assert downscaler.scale(500) == 500
    assert downscaler.scale(1000) == 1000
    assert downscaler.scale(500) == 1000 # Stays at 1000 until it hits -1000
    assert downscaler.scale(-1000) == -1000
    assert downscaler.scale(500) == -1000


def test_edge_case_up_less_than_down():
    with pytest.raises(ValueError):
        HysteresisDownscaler(up_threshold=20, down_threshold=50)


def test_initial_value_around_thresholds():
    downscaler = HysteresisDownscaler(up_threshold=60, down_threshold=40)
    assert downscaler.scale(50) == 50
    assert downscaler.scale(65) == 65
    assert downscaler.scale(45) == 65  # Stays at 65
    assert downscaler.scale(35) == 35
