import unittest

from Maze import *
from Searching import *

m_str = '**********\n*.*..*...*\n*..*...*.*\n**...**...\n..*.*...**\n*..*..*..*\n**..*..*.*\n*.*.**.*.*\n*......*.*\n**********\n'
m_path = [(1, 4), (1, 5), (2, 5), (2, 6), (3, 6), (3, 7), (3, 8), (4, 8), (5, 8), (6, 8), (6, 7), (6, 6), (5, 6), (5, 5), (5, 4), (6, 4), (7, 4), (7, 3), (8, 3), (9, 3)]

t_str = '**********\n**.T......\n...**.**.*\n***..*...*\n*..*..T***\n*.**.**..*\n*.*.T*..**\n*..*.**..*\n**...T..**\n**********\n'
t_path = [(1, 2), (2, 2), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1), (8, 1), (8, 2), (8, 3), (7, 3), (6, 3), (6, 4), (5, 4), (4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (5, 8), (4, 8), (4, 7), (4, 6), (4, 5), (4, 4), (5, 4), (6, 4), (6, 3), (7, 3), (8, 3), (8, 2), (8, 1), (9, 1)]

no_t_str = '**********\n**........\n...**.**.*\n***..*...*\n*..*...***\n*.**.**..*\n*.*..*..**\n*..*.**..*\n**......**\n**********\n'
no_t_path = [(1, 2), (2, 2), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1)]

class TestMaze(unittest.TestCase):
    def setUp(self):
        self.m = Maze(m_str)
        self.m_t = Maze(t_str)
        self.no_t = Maze(no_t_str)

    def test_maze_str(self):
        self.assertEqual(str(self.m), m_str)

    def test_search_1(self):
        path, proc, gen, purged = breadth_first(State(self.m))
        self.assertTrue(self.m.is_valid_path(path))
        self.assertEqual(path, m_path)

    def test_breadth_randomized(self):
        for i in range(100):
            m = Maze((25,25))
            path, proc, gen, purged = breadth_first(State(m))
            self.assertTrue(m.is_valid_path(path))

    def test_treasure(self):
        path, proc, gen, purged = breadth_first(State(self.m_t))
        self.assertTrue(self.m_t.is_valid_path(path))
        self.assertEqual(path, t_path)

        path2, proc2, gen2, purged2 = breadth_first(State(self.no_t))
        self.assertEqual(path2, no_t_path)
        self.assertTrue(self.no_t.is_valid_path(path2))
        self.assertFalse(self.m_t.is_valid_path(path2))

    def test_treasure_randomized_1(self):
        for i in range(10):
            m = Maze((10,10), 2)
            path, proc, gen, purged = breadth_first(State(m))
            self.assertTrue(m.is_valid_path(path))
            
if __name__ == '__main__':
    unittest.main()
