def test_add_argument(self): # A few nodes. node1 = Node('f') node2 = Node('g') node3 = Node('h') # The functions have the following forms: g(f, f), h(f) node2.add_argument(node1) node2.add_argument(node1) node3.add_argument(node1) # Now node 2 should have an argument list with two elements, both being # node 1 and node 3 should have node 1 as its only argument. Node 1 # should have nodes 2 and 3 as its parents, but both only once. self.assertEqual(node1.arguments, []) self.assertEqual(node1.parents, {node2, node3}) self.assertEqual(node2.arguments, [node1, node1]) self.assertEqual(node2.parents, set()) self.assertEqual(node3.arguments, [node1]) self.assertEqual(node3.parents, set()) # Create a few nodes. node1 = Node('f') node2 = Node('x') node3 = Node('f') node4 = Node('f') node5 = Node('a') node1.add_argument(node2) node3.add_argument(node1) node4.add_argument(node5) self.assertEqual(node1.arguments, [node2]) self.assertEqual(node2.arguments, []) self.assertEqual(node3.arguments, [node1]) self.assertEqual(node4.arguments, [node5]) self.assertEqual(node5.arguments, []) self.assertEqual(node1.parents, {node3}) self.assertEqual(node2.parents, {node1}) self.assertEqual(node3.parents, set()) self.assertEqual(node4.parents, set()) self.assertEqual(node5.parents, {node4})
def test_union(self): # Create a few nodes. node1 = Node('f') node2 = Node('x') node3 = Node('f') node4 = Node('f') node5 = Node('a') node1.add_argument(node2) node3.add_argument(node1) node4.add_argument(node5) # Create the union of nodes 1 and 2, 3 and 1, 5 and 3, and 4 and 1. node1.union(node2) node3.union(node1) node5.union(node3) node4.union(node1) self.assertEqual(node1.parents, set()) self.assertEqual(node2.parents, {node1, node3, node4}) self.assertEqual(node3.parents, set()) self.assertEqual(node4.parents, set()) self.assertEqual(node5.parents, set()) self.assertEqual(node1.find, node2) self.assertEqual(node2.find, node2) self.assertEqual(node3.find, node2) self.assertEqual(node4.find, node2) self.assertEqual(node5.find, node2)
def test_merge(self): # Create a few nodes. node1 = Node('f') node2 = Node('x') node3 = Node('f') node4 = Node('f') node5 = Node('a') node1.add_argument(node2) node3.add_argument(node1) node4.add_argument(node5) # Merge nodes 1 and 2 and nodes 5 and 3. self.assertTrue(node1.merge(node2)) self.assertTrue(node5.merge(node3)) # Now node 2 should be the representative. self.assertEqual(node1.parents, set()) self.assertEqual(node1.find, node2) self.assertEqual(node2.parents, {node1, node3, node4}) self.assertEqual(node2.find, node2) self.assertEqual(node3.parents, set()) self.assertEqual(node3.find, node2) self.assertEqual(node4.parents, set()) self.assertEqual(node4.find, node2) self.assertEqual(node5.parents, set()) self.assertEqual(node5.find, node2) # Trying to merge nodes 1 and 2 should return false as they are already # congruent to each other. self.assertFalse(node1.merge(node2))
def test_equality(self): # Create a few nodes. node1 = Node('f') node2 = Node('f') node3 = Node('g') node4 = Node('f') node4.add_argument(node1) node4.add_argument(node3) node5 = Node('f') node5.add_argument(node1) node5.add_argument(node2) # Nodes 1 and 2 should be equal to each other. self.assertEqual(node1, node2) # Nodes 1 and 3 are not equal because their function names differ. self.assertNotEqual(node1, node3) # Nodes 1 and 4 are not equal because they do not have the same number # of arguments. self.assertNotEqual(node1, node4) # Nodes 4 and 5 are not equal because their arguments are not congruent. self.assertNotEqual(node4, node5)
node6 = Node('cons') node7 = Node('cdr') node8 = Node('car') node9 = Node('z') node10 = Node('cons') node11 = Node('cdr') node12 = Node('car') node13 = Node('car') node14 = Node('cdr') node15 = Node('car') node16 = Node('cdr') node17 = Node('car') node18 = Node('cdr') # Set the nodes' arguments. node2.add_argument(node3) node2.add_argument(node4) node3.add_argument(node4) node6.add_argument(node7) node6.add_argument(node8) node7.add_argument(node1) node8.add_argument(node1) node10.add_argument(node11) node10.add_argument(node12) node11.add_argument(node5) node12.add_argument(node5) node13.add_argument(node6) node14.add_argument(node6) node15.add_argument(node2) node16.add_argument(node2) node17.add_argument(node10)