class IntegrationTests(unittest.TestCase):
    def setUp(self):
        self.node = Node()
        self.node_fail = NodeFailure()
        self.path = Path(self.node_fail)
        self.g = nx.Graph()
        self.g.add_nodes_from([0, 1, 2, 3, 4])

    def test_direct_path(self):
        self.g.add_weighted_edges_from([(1, 2, 1), (2, 4, 3), (1, 3, 1),
                                        (3, 4, 2)])
        self.node.n = 5
        self.node.src = 1
        self.node.dest = 4
        self.path.find_path(self.g, self.node.src, self.node.dest)
        self.assertEqual(self.path.path, [1, 3, 4])

    def test_direct_path_w_update(self):
        self.g.add_weighted_edges_from([(1, 2, 1), (2, 4, 3), (1, 3, 1),
                                        (3, 4, 2)])
        self.node.n = 5
        self.node.src = 1
        self.node.dest = 4
        self.node_fail.fail_prob = 0
        self.node_fail.node_probs = [.2, .3, .1, .4, .5]
        self.path.find_path(self.g, self.node.src, self.node.dest)
        self.path.update(self.g, 5, self.node.src, self.node.dest)
        self.assertEqual(self.path.path, [1, 3, 4])

    def test_direct_path_cost(self):
        self.g.add_weighted_edges_from([(1, 2, 1), (2, 4, 3), (1, 3, 1),
                                        (3, 4, 2)])
        self.node.n = 5
        self.node.src = 1
        self.node.dest = 4
        self.node_fail.fail_prob = 0
        self.node_fail.node_probs = [.2, .3, .1, .4, .5]
        self.path.find_path(self.g, self.node.src, self.node.dest)
        self.path.update(self.g, 5, self.node.src, self.node.dest)
        self.path.get_cost(self.g, self.node.src, self.node.dest)
        self.assertEqual(self.path.cost, 3)
class TestPathMethods(unittest.TestCase):
    def setUp(self):
        self.node_fail = NodeFailure()
        self.path = Path(self.node_fail)
        self.g = nx.Graph()
        self.g.add_nodes_from([1, 2, 3, 4, 5])

    def test_find_path_direct(self):
        self.g.add_edge(1, 3)
        self.path.find_path(self.g, 1, 3)
        self.assertEqual(self.path.path, [1, 3])

    def test_find_path_multi(self):
        self.g.add_edges_from([(1, 2), (2, 5), (1, 3), (3, 5)])
        self.path.find_path(self.g, 1, 5)
        self.assertEqual(self.path.path, [1, 2, 5])

    def test_find_path_shortest(self):
        self.g.add_weighted_edges_from([(1, 2, 1), (2, 5, 3), (1, 3, 1),
                                        (3, 5, 2)])
        self.path.find_path(self.g, 1, 5)
        self.assertEqual(self.path.path, [1, 3, 5])

    def test_find_dpath(self):
        self.g.add_edge(1, 5)
        self.path.find_path(self.g, 1, 5)
        self.assertEqual(self.path.dpath, [1, 5])

    def test_find_bfpath(self):
        self.g.add_edge(1, 2)
        self.path.find_path(self.g, 1, 2)
        self.assertEqual(self.path.bfpath, [1, 2])

    def test_find_path_none(self):
        self.g.add_edge(1, 3)
        self.path.find_path(self.g, 1, 5)
        self.assertEqual(self.path.path, [])

    def test_find_dpath_none(self):
        self.g.add_edge(1, 5)
        self.path.find_path(self.g, 1, 3)
        self.assertEqual(self.path.dpath, [])

    def test_find_bfpath_none(self):
        self.g.add_edge(1, 2)
        self.path.find_path(self.g, 1, 3)
        self.assertEqual(self.path.bfpath, [])

    def test_update(self):
        node_num = self.g.number_of_nodes()
        self.node_fail.fail_prob = .99
        self.node_fail.node_probs = [.2, .3, .1, .4, .5]
        self.path.update(self.g, 5, 1, 5)
        self.assertNotEqual(node_num, self.g.number_of_nodes())

    def test_find_get_cost(self):
        self.g.add_weighted_edges_from([(1, 3, 1), (3, 5, 2)])
        self.path.find_path(self.g, 1, 5)
        self.path.get_cost(self.g, 1, 5)
        self.assertEqual(self.path.cost, 3)

    def test_find_get_dcost(self):
        self.g.add_weighted_edges_from([(1, 3, 1), (3, 5, 2)])
        self.path.find_path(self.g, 1, 5)
        self.path.get_cost(self.g, 1, 5)
        self.assertEqual(self.path.dcost, 3)

    def test_find_get_bfcost(self):
        self.g.add_weighted_edges_from([(1, 3, 1), (3, 5, 2)])
        self.path.find_path(self.g, 1, 5)
        self.path.get_cost(self.g, 1, 5)
        self.assertEqual(self.path.bfcost, 3)