"""Test homeasssitant distance utility functions."""

import unittest
import homeassistant.util.distance as distance_util
from homeassistant.const import (LENGTH_KILOMETERS, LENGTH_METERS, LENGTH_FEET,
                                 LENGTH_MILES)

INVALID_SYMBOL = 'bob'
VALID_SYMBOL = LENGTH_KILOMETERS


class TestDistanceUtil(unittest.TestCase):
    """Test the distance utility functions."""

    def test_convert_same_unit(self):
        """Test conversion from any unit to same unit."""
        self.assertEqual(5,
                         distance_util.convert(5, LENGTH_KILOMETERS,
                                               LENGTH_KILOMETERS))
        self.assertEqual(2,
                         distance_util.convert(2, LENGTH_METERS,
                                               LENGTH_METERS))
        self.assertEqual(10,
                         distance_util.convert(10, LENGTH_MILES, LENGTH_MILES))
        self.assertEqual(9,
                         distance_util.convert(9, LENGTH_FEET, LENGTH_FEET))

    def test_convert_invalid_unit(self):
        """Test exception is thrown for invalid units."""
        with self.assertRaises(ValueError):
            distance_util.convert(5, INVALID_SYMBOL,
                                  VALID_SYMBOL)

        with self.assertRaises(ValueError):
            distance_util.convert(5, VALID_SYMBOL,
                                  INVALID_SYMBOL)

    def test_convert_nonnumeric_value(self):
        """Test exception is thrown for nonnumeric type."""
        with self.assertRaises(TypeError):
            distance_util.convert('a', LENGTH_KILOMETERS, LENGTH_METERS)

    def test_convert_from_miles(self):
        """Test conversion from miles to other units."""
        miles = 5
        self.assertEqual(
            distance_util.convert(miles, LENGTH_MILES, LENGTH_KILOMETERS),
            8.04672)
        self.assertEqual(
            distance_util.convert(miles, LENGTH_MILES, LENGTH_METERS),
            8046.72)
        self.assertEqual(
            distance_util.convert(miles, LENGTH_MILES, LENGTH_FEET),
            26400.0008448)

    def test_convert_from_feet(self):
        """Test conversion from feet to other units."""
        feet = 5000
        self.assertEqual(
            distance_util.convert(feet, LENGTH_FEET, LENGTH_KILOMETERS),
            1.524)
        self.assertEqual(
            distance_util.convert(feet, LENGTH_FEET, LENGTH_METERS),
            1524)
        self.assertEqual(
            distance_util.convert(feet, LENGTH_FEET, LENGTH_MILES),
            0.9469694040000001)

    def test_convert_from_kilometers(self):
        """Test conversion from kilometers to other units."""
        km = 5
        self.assertEqual(
            distance_util.convert(km, LENGTH_KILOMETERS, LENGTH_FEET),
            16404.2)
        self.assertEqual(
            distance_util.convert(km, LENGTH_KILOMETERS, LENGTH_METERS),
            5000)
        self.assertEqual(
            distance_util.convert(km, LENGTH_KILOMETERS, LENGTH_MILES),
            3.106855)

    def test_convert_from_meters(self):
        """Test conversion from meters to other units."""
        m = 5000
        self.assertEqual(distance_util.convert(m, LENGTH_METERS, LENGTH_FEET),
                         16404.2)
        self.assertEqual(
            distance_util.convert(m, LENGTH_METERS, LENGTH_KILOMETERS),
            5)
        self.assertEqual(distance_util.convert(m, LENGTH_METERS, LENGTH_MILES),
                         3.106855)