| #!/usr/bin/env python3 |
| # Copyright 2020 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """Unit tests for dependency_analysis.graph.""" |
| |
| import unittest |
| import graph |
| |
| |
| class TestNode(unittest.TestCase): |
| """Unit tests for dependency_analysis.graph.Node.""" |
| UNIQUE_KEY_1 = 'abc' |
| UNIQUE_KEY_2 = 'def' |
| |
| def test_initialization(self): |
| """Tests that the node was initialized correctly.""" |
| test_node = graph.Node(self.UNIQUE_KEY_1) |
| self.assertEqual(test_node.name, self.UNIQUE_KEY_1) |
| self.assertEqual(len(test_node.inbound), 0) |
| self.assertEqual(len(test_node.outbound), 0) |
| |
| def test_equality(self): |
| """Tests that two nodes with the same unique keys are equal.""" |
| test_node = graph.Node(self.UNIQUE_KEY_1) |
| equal_node = graph.Node(self.UNIQUE_KEY_1) |
| self.assertEqual(test_node, equal_node) |
| |
| def test_add_outbound(self): |
| """Tests adding a single outbound edge from the node.""" |
| begin_node = graph.Node(self.UNIQUE_KEY_1) |
| end_node = graph.Node(self.UNIQUE_KEY_2) |
| begin_node.add_outbound(end_node) |
| self.assertEqual(begin_node.outbound, {end_node}) |
| |
| def test_add_outbound_duplicate(self): |
| """Tests that adding the same outbound edge twice will not dupe.""" |
| begin_node = graph.Node(self.UNIQUE_KEY_1) |
| end_node = graph.Node(self.UNIQUE_KEY_2) |
| begin_node.add_outbound(end_node) |
| begin_node.add_outbound(end_node) |
| self.assertEqual(begin_node.outbound, {end_node}) |
| |
| def test_add_outbound_self(self): |
| """Tests adding an circular outbound edge to the node itself.""" |
| test_node = graph.Node(self.UNIQUE_KEY_1) |
| test_node.add_outbound(test_node) |
| self.assertEqual(test_node.outbound, {test_node}) |
| |
| def test_add_inbound(self): |
| """Tests adding a single inbound edge to the node.""" |
| begin_node = graph.Node(self.UNIQUE_KEY_1) |
| end_node = graph.Node(self.UNIQUE_KEY_2) |
| end_node.add_inbound(begin_node) |
| self.assertEqual(end_node.inbound, {begin_node}) |
| |
| def test_add_inbound_duplicate(self): |
| """Tests that adding the same inbound edge twice will not dupe.""" |
| begin_node = graph.Node(self.UNIQUE_KEY_1) |
| end_node = graph.Node(self.UNIQUE_KEY_2) |
| end_node.add_inbound(begin_node) |
| end_node.add_inbound(begin_node) |
| self.assertEqual(end_node.inbound, {begin_node}) |
| |
| def test_add_inbound_self(self): |
| """Tests adding an circular inbound edge from the node itself.""" |
| test_node = graph.Node(self.UNIQUE_KEY_1) |
| test_node.add_inbound(test_node) |
| self.assertEqual(test_node.inbound, {test_node}) |
| |
| |
| class TestGraph(unittest.TestCase): |
| """Unit tests for dependency_analysis.graph.Graph.""" |
| UNIQUE_KEY_1 = 'abc' |
| UNIQUE_KEY_2 = 'def' |
| |
| def setUp(self): |
| """Sets up a new graph object.""" |
| self.test_graph = graph.Graph() |
| |
| def test_initialization(self): |
| """Tests that the graph was initialized correctly.""" |
| self.assertEqual(self.test_graph.num_nodes, 0) |
| self.assertEqual(self.test_graph.num_edges, 0) |
| |
| def test_get_node_exists(self): |
| """Tests getting a node that we know exists in the graph.""" |
| self.test_graph.add_node_if_new(self.UNIQUE_KEY_1) |
| self.assertIsNotNone(self.test_graph.get_node_by_key( |
| self.UNIQUE_KEY_1)) |
| |
| def test_get_node_does_not_exist(self): |
| """Tests getting a node that we know does not exist in the graph.""" |
| self.assertIsNone(self.test_graph.get_node_by_key(self.UNIQUE_KEY_1)) |
| |
| def test_add_nodes(self): |
| """Tests adding two different nodes to the graph.""" |
| self.test_graph.add_node_if_new(self.UNIQUE_KEY_1) |
| self.test_graph.add_node_if_new(self.UNIQUE_KEY_2) |
| self.assertEqual(self.test_graph.num_nodes, 2) |
| |
| def test_add_nodes_duplicate(self): |
| """Tests adding the same node twice to the graph.""" |
| self.test_graph.add_node_if_new(self.UNIQUE_KEY_1) |
| self.test_graph.add_node_if_new(self.UNIQUE_KEY_1) |
| self.assertEqual(self.test_graph.num_nodes, 1) |
| |
| def test_add_edge(self): |
| """Tests adding a new edge to the graph.""" |
| self.test_graph.add_node_if_new(self.UNIQUE_KEY_1) |
| self.test_graph.add_node_if_new(self.UNIQUE_KEY_2) |
| self.test_graph.add_edge_if_new(self.UNIQUE_KEY_1, self.UNIQUE_KEY_2) |
| self.assertEqual(self.test_graph.num_edges, 1) |
| node1 = self.test_graph.get_node_by_key(self.UNIQUE_KEY_1) |
| node2 = self.test_graph.get_node_by_key(self.UNIQUE_KEY_2) |
| self.assertEqual(node2.inbound, {node1}) |
| self.assertEqual(node1.outbound, {node2}) |
| |
| def test_add_edge_double_sided(self): |
| """Tests adding a bidirectional edge to the graph.""" |
| self.test_graph.add_node_if_new(self.UNIQUE_KEY_1) |
| self.test_graph.add_node_if_new(self.UNIQUE_KEY_2) |
| self.test_graph.add_edge_if_new(self.UNIQUE_KEY_1, self.UNIQUE_KEY_2) |
| self.test_graph.add_edge_if_new(self.UNIQUE_KEY_2, self.UNIQUE_KEY_1) |
| self.assertEqual(self.test_graph.num_edges, 2) |
| node1 = self.test_graph.get_node_by_key(self.UNIQUE_KEY_1) |
| node2 = self.test_graph.get_node_by_key(self.UNIQUE_KEY_2) |
| self.assertEqual(node1.inbound, {node2}) |
| self.assertEqual(node1.outbound, {node2}) |
| self.assertEqual(node2.inbound, {node1}) |
| self.assertEqual(node2.outbound, {node1}) |
| |
| def test_add_edge_duplicate(self): |
| """Tests adding a duplicate edge to the graph.""" |
| self.test_graph.add_node_if_new(self.UNIQUE_KEY_1) |
| self.test_graph.add_node_if_new(self.UNIQUE_KEY_2) |
| self.test_graph.add_edge_if_new(self.UNIQUE_KEY_1, self.UNIQUE_KEY_2) |
| self.test_graph.add_edge_if_new(self.UNIQUE_KEY_1, self.UNIQUE_KEY_2) |
| self.assertEqual(self.test_graph.num_edges, 1) |
| |
| def test_add_edge_nodes_do_not_exist(self): |
| """Tests adding a new edge to a graph without the edge's nodes.""" |
| self.test_graph.add_edge_if_new(self.UNIQUE_KEY_1, self.UNIQUE_KEY_2) |
| self.assertEqual(self.test_graph.num_edges, 1) |
| self.assertIsNotNone(self.test_graph.get_node_by_key( |
| self.UNIQUE_KEY_1)) |
| self.assertIsNotNone(self.test_graph.get_node_by_key( |
| self.UNIQUE_KEY_2)) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |