123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- #!/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)
- self.assertEqual(self.test_graph.nodes, [])
- self.assertEqual(self.test_graph.edges, [])
- 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."""
- node1 = self.test_graph.add_node_if_new(self.UNIQUE_KEY_1)
- node2 = self.test_graph.add_node_if_new(self.UNIQUE_KEY_2)
- self.assertEqual(self.test_graph.num_nodes, 2)
- self.assertEqual(graph.sorted_nodes_by_name(self.test_graph.nodes),
- graph.sorted_nodes_by_name([node1, node2]))
- 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)
- node = self.test_graph.add_node_if_new(self.UNIQUE_KEY_1)
- self.assertEqual(self.test_graph.num_nodes, 1)
- self.assertEqual(self.test_graph.nodes, [node])
- def test_add_edge(self):
- """Tests adding a new edge to the graph."""
- node1 = self.test_graph.add_node_if_new(self.UNIQUE_KEY_1)
- node2 = 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)
- self.assertEqual(node2.inbound, {node1})
- self.assertEqual(node1.outbound, {node2})
- self.assertEqual(self.test_graph.edges, [(node1, node2)])
- def test_add_edge_double_sided(self):
- """Tests adding a bidirectional edge to the graph."""
- node1 = self.test_graph.add_node_if_new(self.UNIQUE_KEY_1)
- node2 = 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)
- self.assertEqual(node1.inbound, {node2})
- self.assertEqual(node1.outbound, {node2})
- self.assertEqual(node2.inbound, {node1})
- self.assertEqual(node2.outbound, {node1})
- self.assertEqual(
- graph.sorted_edges_by_name(self.test_graph.edges),
- graph.sorted_edges_by_name([(node1, node2), (node2, node1)]))
- def test_add_edge_duplicate(self):
- """Tests adding a duplicate edge to the graph."""
- node1 = self.test_graph.add_node_if_new(self.UNIQUE_KEY_1)
- node2 = self.test_graph.add_node_if_new(self.UNIQUE_KEY_2)
- edge_added_first = self.test_graph.add_edge_if_new(
- self.UNIQUE_KEY_1, self.UNIQUE_KEY_2)
- edge_added_second = self.test_graph.add_edge_if_new(
- self.UNIQUE_KEY_1, self.UNIQUE_KEY_2)
- self.assertEqual(self.test_graph.num_edges, 1)
- self.assertTrue(edge_added_first)
- self.assertFalse(edge_added_second)
- self.assertEqual(self.test_graph.edges, [(node1, node2)])
- 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()
|