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

from homeassistant.const import TEMP_CELSIUS, TEMP_FAHRENHEIT, TEMP_KELVIN
import homeassistant.util.temperature as temperature_util

INVALID_SYMBOL = "bob"
VALID_SYMBOL = TEMP_CELSIUS


def test_convert_same_unit():
    """Test conversion from any unit to same unit."""
    assert temperature_util.convert(2, TEMP_CELSIUS, TEMP_CELSIUS) == 2
    assert temperature_util.convert(3, TEMP_FAHRENHEIT, TEMP_FAHRENHEIT) == 3
    assert temperature_util.convert(4, TEMP_KELVIN, TEMP_KELVIN) == 4


def test_convert_invalid_unit():
    """Test exception is thrown for invalid units."""
    with pytest.raises(ValueError):
        temperature_util.convert(5, INVALID_SYMBOL, VALID_SYMBOL)

    with pytest.raises(ValueError):
        temperature_util.convert(5, VALID_SYMBOL, INVALID_SYMBOL)


def test_convert_nonnumeric_value():
    """Test exception is thrown for nonnumeric type."""
    with pytest.raises(TypeError):
        temperature_util.convert("a", TEMP_CELSIUS, TEMP_FAHRENHEIT)


def test_convert_from_celsius():
    """Test conversion from C to other units."""
    celsius = 100
    assert temperature_util.convert(
        celsius, TEMP_CELSIUS, TEMP_FAHRENHEIT
    ) == pytest.approx(212.0)
    assert temperature_util.convert(
        celsius, TEMP_CELSIUS, TEMP_KELVIN
    ) == pytest.approx(373.15)
    # Interval
    assert temperature_util.convert(
        celsius, TEMP_CELSIUS, TEMP_FAHRENHEIT, True
    ) == pytest.approx(180.0)
    assert temperature_util.convert(
        celsius, TEMP_CELSIUS, TEMP_KELVIN, True
    ) == pytest.approx(100)


def test_convert_from_fahrenheit():
    """Test conversion from F to other units."""
    fahrenheit = 100
    assert temperature_util.convert(
        fahrenheit, TEMP_FAHRENHEIT, TEMP_CELSIUS
    ) == pytest.approx(37.77777777777778)
    assert temperature_util.convert(
        fahrenheit, TEMP_FAHRENHEIT, TEMP_KELVIN
    ) == pytest.approx(310.92777777777775)
    # Interval
    assert temperature_util.convert(
        fahrenheit, TEMP_FAHRENHEIT, TEMP_CELSIUS, True
    ) == pytest.approx(55.55555555555556)
    assert temperature_util.convert(
        fahrenheit, TEMP_FAHRENHEIT, TEMP_KELVIN, True
    ) == pytest.approx(55.55555555555556)


def test_convert_from_kelvin():
    """Test conversion from K to other units."""
    kelvin = 100
    assert temperature_util.convert(kelvin, TEMP_KELVIN, TEMP_CELSIUS) == pytest.approx(
        -173.15
    )
    assert temperature_util.convert(
        kelvin, TEMP_KELVIN, TEMP_FAHRENHEIT
    ) == pytest.approx(-279.66999999999996)
    # Interval
    assert temperature_util.convert(
        kelvin, TEMP_KELVIN, TEMP_FAHRENHEIT, True
    ) == pytest.approx(180.0)
    assert temperature_util.convert(
        kelvin, TEMP_KELVIN, TEMP_KELVIN, True
    ) == pytest.approx(100)