import unittest
from example import shortest_hops


class TraversalTests(unittest.TestCase):
    def test_shortest_path(self):
        graph = {'a': ['b', 'c', 'b'], 'b': ['a', 'd'], 'c': ['d'], 'd': ['d'], 'x': []}
        path = shortest_hops(graph, 'a', 'd')
        self.assertEqual(len(path), 3)
        self.assertEqual(path[0], 'a')
        self.assertEqual(path[-1], 'd')
        self.assertTrue(all(v in graph[u] for u, v in zip(path, path[1:])))
        self.assertIsNone(shortest_hops(graph, 'a', 'x'))

    def test_source_target_and_unknown(self):
        self.assertEqual(shortest_hops({'a': []}, 'a', 'a'), ['a'])
        self.assertEqual(shortest_hops({'a': ['b']}, 'a', 'b'), ['a', 'b'])
        self.assertEqual(shortest_hops({None: ['b']}, None, 'b'), [None, 'b'])
        with self.assertRaises(ValueError):
            shortest_hops({'a': []}, 'z', 'a')


if __name__ == '__main__':
    unittest.main()
