def test_replace_child(self):
     node = tree.StructuredTreeNode(('keyA', ), 'partial_hashA')
     child = node.set_child(('keyA', 'keyB'),
                            tree.StructuredTreeNode(('keyA', 'keyB'),
                                                    'partial_hashAB'))
     # Replace
     child_new = node.replace_child(
         tree.StructuredTreeNode(('keyA', 'keyB'), 'something_else'))
     self.assertIsNot(child, child_new)
     self.assertEqual('something_else', child_new.partial_hash)
 def test_set_child_existing(self):
     node = tree.StructuredTreeNode(('keyA', ), 'partial_hashA')
     child = node.set_child(('keyA', 'keyB'),
                            tree.StructuredTreeNode(('keyA', 'keyB'),
                                                    'partial_hashAB'))
     # Set again
     child_new = node.set_child(('keyA', 'keyB'),
                                tree.StructuredTreeNode(('keyA', 'keyB'),
                                                        'something_else'))
     self.assertIs(child, child_new)
     self.assertEqual('partial_hashAB', child_new.partial_hash)
 def test_getitem(self):
     children = tree.ChildrenList()
     children.add(tree.StructuredTreeNode(('keyA', 'keyB')))
     children.add(tree.StructuredTreeNode(('keyA', 'keyC')))
     # Not found
     raised = False
     try:
         children[('keyA', 'keyD')]
     except KeyError:
         raised = True
     self.assertTrue(raised)
     self.assertEqual(children[('keyA', 'keyB')],
                      tree.StructuredTreeNode(('keyA', 'keyB')))
    def test_compare(self):
        # Same nodes, same list
        children1 = tree.ChildrenList()
        children1.add(tree.StructuredTreeNode(('keyA', 'keyB')))
        children1.add(tree.StructuredTreeNode(('keyA', 'keyC')))

        children2 = tree.ChildrenList()
        children2.add(tree.StructuredTreeNode(('keyA', 'keyC')))
        children2.add(tree.StructuredTreeNode(('keyA', 'keyB')))

        self.assertEqual(children1, children2)
        self.assertEqual(str(children1), str(children2))

        children2.add(tree.StructuredTreeNode(('keyA', 'keyD')))
        self.assertNotEqual(children1, children2)
    def test_set_child(self):
        # Test with default
        node = tree.StructuredTreeNode(('keyA', ), 'partial_hashA')
        child = node.set_child(('keyA', 'keyB'))
        self.assertEqual(1, len(node.get_children()))
        self.assertTrue(
            isinstance(node.get_children()[0], tree.StructuredTreeNode))
        self.assertIs(child, node.get_children()[0])
        self.assertEqual(('keyA', 'keyB'), child.key)
        self.assertIsNone(child.partial_hash)

        # Test passing node
        child = node.set_child(('keyA', 'keyC'),
                               tree.StructuredTreeNode(('keyA', 'keyC'),
                                                       'partial_hashAC'))
        self.assertEqual(2, len(node.get_children()))
        self.assertEqual(('keyA', 'keyC'), child.key)
        self.assertEqual('partial_hashAC', child.partial_hash)
 def test_initialize(self):
     node = tree.StructuredTreeNode(('key', ),
                                    'partial_hash',
                                    metadata={'foo': True})
     self.assertEqual(('key', ), node.key)
     self.assertEqual('partial_hash', node.partial_hash)
     self.assertEqual('partial_hash', node.full_hash)
     self.assertTrue(isinstance(node._children, tree.ChildrenList))
     self.assertTrue(isinstance(node.get_children(), tuple))
     self.assertEqual({'foo': True}, node.metadata)
 def test_sorted_add(self):
     children = tree.ChildrenList()
     # Append some
     children.add(tree.StructuredTreeNode(('keyA', 'keyB')))
     self.assertEqual(0, children.index(('keyA', 'keyB')))
     children.add(tree.StructuredTreeNode(('keyA', 'keyC')))
     self.assertEqual(1, children.index(('keyA', 'keyC')))
     children.add(tree.StructuredTreeNode(('keyA', 'keyZ')))
     self.assertEqual(2, children.index(('keyA', 'keyZ')))
     # Insert in the middle
     children.add(tree.StructuredTreeNode(('keyA', 'keyD')))
     self.assertEqual(2, children.index(('keyA', 'keyD')))
     self.assertEqual(3, children.index(('keyA', 'keyZ')))
     # Insert in front
     children.add(tree.StructuredTreeNode(('keyA', 'key')))
     self.assertEqual(0, children.index(('keyA', 'key')))
     # Verify whole list
     self.assertEqual([
         tree.StructuredTreeNode(('keyA', 'key')),
         tree.StructuredTreeNode(('keyA', 'keyB')),
         tree.StructuredTreeNode(('keyA', 'keyC')),
         tree.StructuredTreeNode(('keyA', 'keyD')),
         tree.StructuredTreeNode(('keyA', 'keyZ'))
     ], children._stash)
 def test_remove_child(self):
     node = tree.StructuredTreeNode(('keyA', ), 'partial_hashA')
     # Nothing happens
     node.remove_child(('keyA', 'keyB'))
     # Add some children and then delete them
     node.replace_child(
         tree.StructuredTreeNode(('keyA', 'keyB'), 'partial_hashAB'))
     node.replace_child(
         tree.StructuredTreeNode(('keyA', 'keyC'), 'partial_hashAC'))
     node.replace_child(
         tree.StructuredTreeNode(('keyA', 'keyZ'), 'partial_hashAZ'))
     self.assertEqual(3, len(node._children))
     node.remove_child(('keyA', 'keyC'))
     # Verify the right one was removed
     self.assertEqual((tree.StructuredTreeNode(
         ('keyA', 'keyB')), tree.StructuredTreeNode(('keyA', 'keyZ'))),
                      node.get_children())
 def test_get_child(self):
     node = tree.StructuredTreeNode(('keyA', ), 'partial_hashA')
     node.replace_child(
         tree.StructuredTreeNode(('keyA', 'keyB'), 'partial_hashAB'))
     node.replace_child(
         tree.StructuredTreeNode(('keyA', 'keyC'), 'partial_hashAC'))
     node.replace_child(
         tree.StructuredTreeNode(('keyA', 'keyZ'), 'partial_hashAZ'))
     # Doesn't exist
     self.assertIsNone(node.get_child(('keyA', 'keyY')))
     # Returns Default on non existing
     self.assertEqual('nope',
                      node.get_child(('keyA', 'keyY'), default='nope'))
     # Found!
     self.assertEqual(tree.StructuredTreeNode(('keyA', 'keyC')),
                      node.get_child(('keyA', 'keyC')))
     # Adding Default doesn't change the result
     self.assertEqual(tree.StructuredTreeNode(('keyA', 'keyC')),
                      node.get_child(('keyA', 'keyC'), default='nope'))