blob: 04b57d1a04ecc4d7e0dadcd7aa96c9bd0367a918 [file] [log] [blame]
#!/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()