# testlocation.py

import unittest

from util import distance, find_location, LOCATIONS


class TestLocation(unittest.TestCase):

    def test_calculate_distance(self):
        ae = self.assertEqual

        ae( 1, distance("B2", "B1"))
        ae(-1, distance("B1", "B2"))

        ae(-1, distance("R2", "R1"))
        ae(1, distance("R1", "R2"))

        ae(6, distance("B8", "B2"))

        ae(3, distance("R10", "B12"))
        ae(-5, distance("B11", "R9"))

    def test_calculate_bar_distance(self):
        ae = self.assertEqual
        ae(-3, distance("R_BAR", "B3"))
        ae(4, distance("B_BAR", "R4"))

    def test_calculate_bear_off_distance(self):
        ae = self.assertEqual
        ae(4, distance("B4", "B_BEAR_OFF"))
        ae( -6, distance("R6", "R_BEAR_OFF"))

    def test_find_location_from_distance(self):
        ae = self.assertEqual
        ae("B6", find_location("RED", "B2", 4))
        ae("B2", find_location("BLACK", "B6", 4))

        # to bear offs
        ae("B_BEAR_OFF", find_location("BLACK", "B2", 4))
        ae("B_BEAR_OFF", find_location("BLACK", "B2", 6))
        ae("R_BEAR_OFF", find_location("RED", "R2", 6))

        # from bar
        ae("R3", find_location("BLACK", "B_BAR", 3))
        ae("B6", find_location("RED", "R_BAR", 6))

        ae("B10", find_location("BLACK", "R10", 5))
        ae("R10", find_location("RED", "B10", 5))

    def test_there_are_28_locations(self):
        for loc in LOCATIONS:
            self.assertIsNotNone(loc)
        self.assertEqual(28, len(LOCATIONS))
        
        
if __name__ == "__main__":
    unittest.main()
