#!/usr/bin/python
# -*- coding: utf-8 -*-
# Hive Appier Framework
# Copyright (c) 2008-2024 Hive Solutions Lda.
#
# This file is part of Hive Appier Framework.
#
# Hive Appier Framework is free software: you can redistribute it and/or modify
# it under the terms of the Apache License as published by the Apache
# Foundation, either version 2.0 of the License, or (at your option) any
# later version.
#
# Hive Appier Framework is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# Apache License for more details.
#
# You should have received a copy of the Apache License along with
# Hive Appier Framework. If not, see .
__author__ = "João Magalhães "
""" The author(s) of the module """
__copyright__ = "Copyright (c) 2008-2024 Hive Solutions Lda."
""" The copyright for the module """
__license__ = "Apache License, Version 2.0"
""" The license for the module """
import unittest
import appier
class GraphTest(unittest.TestCase):
def test__build_path(self):
prev = dict(B="A", C="A", D="B", E="D", F="D", G="E")
path = appier.Graph._build_path(prev, "A", "F")
self.assertEqual(path, ["A", "B", "D", "F"])
def test_create(self):
graph = appier.Graph()
self.assertEqual(len(graph.edges), 0)
def test_create_with_argument(self):
graph = appier.Graph([("A", "B"), ("B", "D", 20, True)])
self.assertEqual(len(graph.edges), 3)
def test_add_edges(self):
graph = appier.Graph()
edges = [
("A", "B"),
("B", "D", 20),
("B", "C", 10, True),
("D", "F"),
("F", "D"),
]
graph.add_edges(edges)
self.assertEqual(graph.edges["A"], [("B", 1)])
self.assertEqual(graph.edges["B"], [("D", 20), ("C", 10)])
self.assertEqual(graph.edges["D"], [("F", 1)])
self.assertEqual(graph.edges["F"], [("D", 1)])
def test_add_edges_handle_invalid(self):
graph = appier.Graph()
edges = [
("A", "B", "invalid", "invalid"),
("B", "D", 20),
("B", "C", 10, True),
("D", "F"),
("F", "D"),
(),
("A"),
]
graph.add_edges(edges)
self.assertEqual(graph.edges["A"], [("B", 1)])
self.assertEqual(graph.edges["B"], [("D", 20), ("C", 10)])
self.assertEqual(graph.edges["D"], [("F", 1)])
self.assertEqual(graph.edges["F"], [("D", 1)])
def test_add_edge(self):
graph = appier.Graph()
graph.add_edge("A", "B")
self.assertEqual(graph.edges["A"], [("B", 1)])
graph.add_edge("B", "D", cost=20)
graph.add_edge("B", "C", cost=10)
self.assertEqual(graph.edges["B"], [("D", 20), ("C", 10)])
graph.add_edge("D", "F", bidirectional=True)
self.assertEqual(graph.edges["D"], [("F", 1)])
self.assertEqual(graph.edges["F"], [("D", 1)])
def test_disjktra_no_path(self):
graph = appier.Graph([("A", "B"), ("B", "C"), ("F", "G")])
path, cost = graph.dijkstra("C", "A")
self.assertEqual(path, [])
self.assertEqual(cost, appier.defines.INFINITY)
path, cost = graph.dijkstra("C", "B")
self.assertEqual(path, [])
self.assertEqual(cost, appier.defines.INFINITY)
path, cost = graph.dijkstra("A", "F")
self.assertEqual(path, [])
self.assertEqual(cost, appier.defines.INFINITY)
def test_dijkstra_src_equal_dst(self):
graph = appier.Graph()
path, cost = graph.dijkstra("A", "A")
self.assertEqual(path, ["A"])
self.assertEqual(cost, 0)
def test_dijkstra_simple(self):
graph = appier.Graph([("A", "B"), ("B", "C")])
path, cost = graph.dijkstra("A", "C")
self.assertEqual(path, ["A", "B", "C"])
self.assertEqual(cost, 2)
def test_dijkstra_costs(self):
graph = appier.Graph([("A", "B"), ("B", "C", 10), ("B", "D", 4), ("D", "C", 5)])
path, cost = graph.dijkstra("A", "C")
self.assertEqual(path, ["A", "B", "D", "C"])
self.assertEqual(cost, 10)
def test_dijkstra_loop(self):
graph = appier.Graph([("A", "B"), ("B", "B"), ("B", "C")])
path, cost = graph.dijkstra("A", "C")
self.assertEqual(path, ["A", "B", "C"])
self.assertEqual(cost, 2)
def test_dijkstra_big(self):
graph = appier.Graph(
[
("A", "B", 2),
("A", "C", 6),
("B", "D", 5),
("C", "D", 8),
("D", "E", 10),
("D", "F", 15),
("E", "F", 6),
("E", "G", 2),
("F", "G", 6),
]
)
path, cost = graph.dijkstra("A", "A")
self.assertEqual(path, ["A"])
self.assertEqual(cost, 0)
path, cost = graph.dijkstra("A", "B")
self.assertEqual(path, ["A", "B"])
self.assertEqual(cost, 2)
path, cost = graph.dijkstra("A", "C")
self.assertEqual(path, ["A", "C"])
self.assertEqual(cost, 6)
path, cost = graph.dijkstra("A", "D")
self.assertEqual(path, ["A", "B", "D"])
self.assertEqual(cost, 7)
path, cost = graph.dijkstra("A", "E")
self.assertEqual(path, ["A", "B", "D", "E"])
self.assertEqual(cost, 17)
path, cost = graph.dijkstra("A", "F")
self.assertEqual(path, ["A", "B", "D", "F"])
self.assertEqual(cost, 22)
path, cost = graph.dijkstra("A", "G")
self.assertEqual(path, ["A", "B", "D", "E", "G"])
self.assertEqual(cost, 19)
path, cost = graph.dijkstra("C", "G")
self.assertEqual(path, ["C", "D", "E", "G"])
self.assertEqual(cost, 20)
path, cost = graph.dijkstra("C", "F")
self.assertEqual(path, ["C", "D", "F"])
self.assertEqual(cost, 23)