def test_empty_tree(self): # test a tree with no values root = lca.Node(None) result = lca.LCA_total(root, root.left, root.right) expected = False self.assertEqual(expected, result)
def test_complicated_dag(self): # test complex directed acyclic graph G = nx.DiGraph() G.add_nodes_from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) G.add_edges_from([(1, 5), (1, 9), (2, 6), (2, 10), (3, 7), (4, 8), (4, 12)]) G.add_edges_from([(5, 13), (9, 14), (6, 13), (10, 14), (7, 13), (11, 14), (8, 13), (12, 14)]) result = lca.LCA_total(G, 5, 8) expected = None self.assertEqual(result, expected) result2 = lca.LCA_total(G, 13, 6) expected2 = 6 self.assertEqual(expected2, result2)
def test_for_multiple_nodes(self): # test search for more than 2 nodes (set to return error message) G = nx.DiGraph() G.add_nodes_from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) G.add_edges_from([(1, 5), (1, 9), (2, 6), (2, 10), (3, 7), (4, 8), (4, 12)]) G.add_edges_from([(5, 13), (9, 14), (6, 13), (10, 14), (7, 13), (11, 14), (8, 13), (12, 14)]) result = lca.LCA_total(G, 14, 12, 8) expected = "Cannot compute lca of more than two nodes." self.assertEqual(expected, result) result2 = lca.LCA_total(G, 13, 14, 11) expected2 = "Cannot compute lca of more than two nodes." self.assertEqual(expected2, result2)
def test_simple_graph(self): # test a simple directed acyclic graph with three nodes G = nx.DiGraph() G.add_nodes_from([1, 2, 3]) G.add_edges_from([(1, 2), (2, 3)]) result = lca.LCA_total(G, 2, 3) expected = 2 self.assertEqual(expected, result)
def test_graph_with_invalid_input(self): # test for finding a node that is not in the graph G = nx.DiGraph() G.add_nodes_from([2, 4, 6, 8, 10]) G.add_edges_from([(2, 4), (4, 6), (6, 8), (8, 10)]) result = lca.LCA_total(G, 5, 7) expected = "The node you are looking for is not in the graph." self.assertEqual(expected, result)
def test_larger_graph(self): # test a slightly longer directed acyclic graph G = nx.DiGraph() G.add_nodes_from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) G.add_edges_from([(1, 2), (2, 3), (3, 4), (4, 5), (6, 7), (7, 8), (8, 9), (9, 10)]) result = lca.LCA_total(G, 3, 3) expected = 3 self.assertEqual(expected, result)
def test_string_tree(self): # test tree with strings as node values root = lca.Node("pizza") root.left = lca.Node("Software Engineering") root.right = lca.Node("autumn") root.left.left = lca.Node("Alaska") root.left.right = lca.Node("salt") root.right.left = lca.Node("city") root.right.right = lca.Node("sidewalk") result = lca.LCA_total(root, root.right.left, root.left) expected = root self.assertEqual(expected, result) result2 = lca.LCA_total(root, root.left.right, root.left.left) expected2 = root.left self.assertEqual(expected2, result2)
def test_non_acyclic_graph(self): # test a non-acyclic graph (Node 5 connects back to Node 1) G = nx.DiGraph() G.add_nodes_from([1, 2, 3, 4, 5]) G.add_edges_from([(1, 2), (2, 3), (3, 4), (4, 5), (5, 1)]) result = lca.LCA_total(G, 5, 3) expected = False self.assertEqual(expected, result)
def test_tree_with_invalid_findlca_input(self): # test tree where n1 or n1 is not Node type root = lca.Node(1) root.left = lca.Node(2) root.right = lca.Node(3) root.left.left = lca.Node(4) root.left.right = lca.Node(5) root.right.left = lca.Node(6) root.right.right = lca.Node(7) result = lca.LCA_total(root, "string", root.left.left) expected = False self.assertEqual(expected, result)
def test_tree_with_random_empty_nodes(self): # test tree with random nodes with None value root = lca.Node(100) root.left = lca.Node(None) root.right = lca.Node(3) root.left.left = lca.Node(38) root.left.right = lca.Node(None) root.right.left = lca.Node(3.4) root.right.right = lca.Node(None) root.right.right.right = lca.Node(95) root.right.left.right = lca.Node(7) root.left.right.left = lca.Node(None) root.left.right.left.left = lca.Node(46) result = lca.LCA_total(root, root.left.right.left.left, root.left.left) expected = root.left self.assertEqual(expected, result) result2 = lca.LCA_total(root, root.right.left.right, root.right.right.right) expected2 = root.right self.assertEqual(result2, expected2)
def test_tree_with_repeated_Nodes(self): # test tree with two nodes that have the same value root = lca.Node(6) root.left = lca.Node(4) root.right = lca.Node(40) root.left.left = lca.Node(32) root.left.right = lca.Node(67) root.right.left = lca.Node(32) root.right.right = lca.Node(999) result = lca.LCA_total(root, root.left, root.right.right) expected = root self.assertEqual(expected, result) result2 = lca.LCA_total(root, root.right, root.right.right) expected2 = root.right self.assertEqual(expected2, result2) result2 = lca.LCA_total(root, root.left.left, root.right.left) expected2 = root self.assertEqual(expected2, result2)
def test_tree_with_one_none_input(self): # test tree where one node is None root = lca.Node(1) root.left = lca.Node(2) root.right = lca.Node(3) root.left.left = lca.Node(4) root.left.right = lca.Node(5) root.right.left = lca.Node(6) root.right.right = lca.Node(7) result = lca.LCA_total(root, root.right.right, None) expected = False self.assertEqual(expected, result)
def test_string_int_list_tree(self): # test tree with mixed string, int, lists as node values root = lca.Node(42) root.left = lca.Node("Software Engineering") root.right = lca.Node([1, "blacksmith", "July", 4]) root.left.left = lca.Node(78) root.left.right = lca.Node("salt") root.right.left = lca.Node(["North", 74, 98, 0, "00", "001Court"]) root.right.right = lca.Node(365) result = lca.LCA_total(root, root.right.right, root.left.right) expected = root self.assertEqual(expected, result)
def test_tree_with_list_nodes(self): # test tree with lists as node values root = lca.Node([12, 7, 8, 100]) root.left = lca.Node([1, "blacksmith", "July", 4]) root.right = lca.Node([]) root.left.left = lca.Node([13, ["purple"], 3456]) root.left.right = lca.Node(["15", 15, 88]) root.right.left = lca.Node(["North", 74, 98, 0, "00", "001Court"]) root.right.right = lca.Node(["last"]) result = lca.LCA_total(root, root.right.left, root.right.right) expected = root.right self.assertEqual(expected, result)
def test_only_right_tree(self): # test a tree with only right nodes root = lca.Node(2) root.right = lca.Node(3) root.right.right = lca.Node(7) root.right.right.right = lca.Node(18) root.right.right.right.right = lca.Node(24) root.right.right.right.right.right = lca.Node(900) result = lca.LCA_total(root, root.right.right.right, root.right.right.right.right) expected = root.right.right.right self.assertEqual(expected, result)
def test_lca_as_root(self): # test a tree where the LCA is the root node root = lca.Node(1) root.left = lca.Node(2) root.right = lca.Node(3) root.left.left = lca.Node(4) root.left.right = lca.Node(5) root.right.left = lca.Node(6) root.right.right = lca.Node(7) result = lca.LCA_total(root, root.right.left, root.left.left) expected = root self.assertEqual(expected, result)
def test_regular_tree(self): # test simple tree root = lca.Node(1) root.left = lca.Node(2) root.right = lca.Node(3) root.left.left = lca.Node(4) root.left.right = lca.Node(5) root.right.left = lca.Node(6) root.right.right = lca.Node(7) result = lca.LCA_total(root, root.right.left, root.right.right) expected = root.right # check for expected output self.assertEqual(expected, result)
def test_LCA_for_input_not_in_tree(self): # test for nodes that aren't in the tree root = lca.Node(1) root.left = lca.Node(2) root.right = lca.Node(3) root.left.left = lca.Node(4) root.left.right = lca.Node(5) root.right.left = lca.Node(6) root.right.right = lca.Node(7) result = lca.LCA_total(root, root.right.right.right, root.right.left.left) expected = False self.assertEqual(expected, result)
def test_search_for_all_None_inputs(self): # test tree where all input is None root = lca.Node(1) root.left = lca.Node(2) root.right = lca.Node(3) root.left.left = lca.Node(4) root.left.right = lca.Node(5) root.right.left = lca.Node(6) root.right.right = lca.Node(7) result = lca.LCA_total(None, None, None) expected = None result = lca.find_lca(root, root.left, root.left.right) expected = root.left self.assertEqual(expected, result)
def test_only_left_tree(self): # test a tree with only left nodes root = lca.Node(7) root.left = lca.Node(65) root.left.left = lca.Node(3) root.left.left.left = lca.Node(92) root.left.left.left.left = lca.Node(17) root.left.left.left.left.left = lca.Node(37) result = lca.LCA_total(root, root.left.left, root.left.left.left.left) expected = root.left.left self.assertEqual(expected, result) result2 = lca.find_lca(root, root.left.left, root.left.left.left) expected2 = root.left.left self.assertEqual(expected2, result2)
def test_lca_for_dag(self): # this is the tree test for DAGs # since I construct graphs differently, none of the tree test will work with graphs root = lca.Node("G") root.left = lca.Node("D") root.right = lca.Node("F") root.left.center = lca.Node("C") root.right.center = lca.Node("E") root.left.center.center = lca.Node("B") root.right.center.center = root.left.center.center root.left.center.center.center = lca.Node("A") result = lca.LCA_total(root, root.left.center.center, root.right.center) expected = root.right.center self.assertEqual(expected, result)