"""Test Home Assistant pressure utility functions."""
import pytest

from homeassistant.const import UnitOfPressure
from homeassistant.exceptions import HomeAssistantError
import homeassistant.util.pressure as pressure_util

INVALID_SYMBOL = "bob"
VALID_SYMBOL = UnitOfPressure.PA


def test_raise_deprecation_warning(caplog: pytest.LogCaptureFixture) -> None:
    """Ensure that a warning is raised on use of convert."""
    assert pressure_util.convert(2, UnitOfPressure.PA, UnitOfPressure.PA) == 2
    assert "use unit_conversion.PressureConverter instead" in caplog.text


def test_convert_same_unit() -> None:
    """Test conversion from any unit to same unit."""
    assert pressure_util.convert(2, UnitOfPressure.PA, UnitOfPressure.PA) == 2
    assert pressure_util.convert(3, UnitOfPressure.HPA, UnitOfPressure.HPA) == 3
    assert pressure_util.convert(4, UnitOfPressure.MBAR, UnitOfPressure.MBAR) == 4
    assert pressure_util.convert(5, UnitOfPressure.INHG, UnitOfPressure.INHG) == 5
    assert pressure_util.convert(6, UnitOfPressure.KPA, UnitOfPressure.KPA) == 6
    assert pressure_util.convert(7, UnitOfPressure.CBAR, UnitOfPressure.CBAR) == 7
    assert pressure_util.convert(8, UnitOfPressure.MMHG, UnitOfPressure.MMHG) == 8


def test_convert_invalid_unit() -> None:
    """Test exception is thrown for invalid units."""
    with pytest.raises(HomeAssistantError, match="is not a recognized .* unit"):
        pressure_util.convert(5, INVALID_SYMBOL, VALID_SYMBOL)

    with pytest.raises(HomeAssistantError, match="is not a recognized .* unit"):
        pressure_util.convert(5, VALID_SYMBOL, INVALID_SYMBOL)


def test_convert_nonnumeric_value() -> None:
    """Test exception is thrown for nonnumeric type."""
    with pytest.raises(TypeError):
        pressure_util.convert("a", UnitOfPressure.HPA, UnitOfPressure.INHG)


def test_convert_from_hpascals() -> None:
    """Test conversion from hPA to other units."""
    hpascals = 1000
    assert pressure_util.convert(
        hpascals, UnitOfPressure.HPA, UnitOfPressure.PSI
    ) == pytest.approx(14.5037743897)
    assert pressure_util.convert(
        hpascals, UnitOfPressure.HPA, UnitOfPressure.INHG
    ) == pytest.approx(29.5299801647)
    assert pressure_util.convert(
        hpascals, UnitOfPressure.HPA, UnitOfPressure.PA
    ) == pytest.approx(100000)
    assert pressure_util.convert(
        hpascals, UnitOfPressure.HPA, UnitOfPressure.KPA
    ) == pytest.approx(100)
    assert pressure_util.convert(
        hpascals, UnitOfPressure.HPA, UnitOfPressure.MBAR
    ) == pytest.approx(1000)
    assert pressure_util.convert(
        hpascals, UnitOfPressure.HPA, UnitOfPressure.CBAR
    ) == pytest.approx(100)


def test_convert_from_kpascals() -> None:
    """Test conversion from hPA to other units."""
    kpascals = 100
    assert pressure_util.convert(
        kpascals, UnitOfPressure.KPA, UnitOfPressure.PSI
    ) == pytest.approx(14.5037743897)
    assert pressure_util.convert(
        kpascals, UnitOfPressure.KPA, UnitOfPressure.INHG
    ) == pytest.approx(29.5299801647)
    assert pressure_util.convert(
        kpascals, UnitOfPressure.KPA, UnitOfPressure.PA
    ) == pytest.approx(100000)
    assert pressure_util.convert(
        kpascals, UnitOfPressure.KPA, UnitOfPressure.HPA
    ) == pytest.approx(1000)
    assert pressure_util.convert(
        kpascals, UnitOfPressure.KPA, UnitOfPressure.MBAR
    ) == pytest.approx(1000)
    assert pressure_util.convert(
        kpascals, UnitOfPressure.KPA, UnitOfPressure.CBAR
    ) == pytest.approx(100)


def test_convert_from_inhg() -> None:
    """Test conversion from inHg to other units."""
    inhg = 30
    assert pressure_util.convert(
        inhg, UnitOfPressure.INHG, UnitOfPressure.PSI
    ) == pytest.approx(14.7346266155)
    assert pressure_util.convert(
        inhg, UnitOfPressure.INHG, UnitOfPressure.KPA
    ) == pytest.approx(101.59167)
    assert pressure_util.convert(
        inhg, UnitOfPressure.INHG, UnitOfPressure.HPA
    ) == pytest.approx(1015.9167)
    assert pressure_util.convert(
        inhg, UnitOfPressure.INHG, UnitOfPressure.PA
    ) == pytest.approx(101591.67)
    assert pressure_util.convert(
        inhg, UnitOfPressure.INHG, UnitOfPressure.MBAR
    ) == pytest.approx(1015.9167)
    assert pressure_util.convert(
        inhg, UnitOfPressure.INHG, UnitOfPressure.CBAR
    ) == pytest.approx(101.59167)
    assert pressure_util.convert(
        inhg, UnitOfPressure.INHG, UnitOfPressure.MMHG
    ) == pytest.approx(762)


def test_convert_from_mmhg() -> None:
    """Test conversion from mmHg to other units."""
    inhg = 30
    assert pressure_util.convert(
        inhg, UnitOfPressure.MMHG, UnitOfPressure.PSI
    ) == pytest.approx(0.580103)
    assert pressure_util.convert(
        inhg, UnitOfPressure.MMHG, UnitOfPressure.KPA
    ) == pytest.approx(3.99967)
    assert pressure_util.convert(
        inhg, UnitOfPressure.MMHG, UnitOfPressure.HPA
    ) == pytest.approx(39.9967)
    assert pressure_util.convert(
        inhg, UnitOfPressure.MMHG, UnitOfPressure.PA
    ) == pytest.approx(3999.67)
    assert pressure_util.convert(
        inhg, UnitOfPressure.MMHG, UnitOfPressure.MBAR
    ) == pytest.approx(39.9967)
    assert pressure_util.convert(
        inhg, UnitOfPressure.MMHG, UnitOfPressure.CBAR
    ) == pytest.approx(3.99967)
    assert pressure_util.convert(
        inhg, UnitOfPressure.MMHG, UnitOfPressure.INHG
    ) == pytest.approx(1.181102)