rubytree 0.7.0 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data.tar.gz.sig +1 -0
- data/API-CHANGES +9 -0
- data/History.txt +37 -0
- data/README +2 -1
- data/Rakefile +26 -3
- data/TODO +12 -7
- data/lib/tree.rb +196 -114
- data/lib/tree/binarytree.rb +40 -21
- data/test/test_binarytree.rb +84 -55
- data/test/test_tree.rb +346 -190
- metadata +48 -11
- metadata.gz.sig +2 -0
    
        data/lib/tree/binarytree.rb
    CHANGED
    
    | @@ -73,8 +73,8 @@ module Tree | |
| 73 73 | 
             
                #
         | 
| 74 74 | 
             
                # @return [Tree::BinaryTreeNode] The left most (or first) child.
         | 
| 75 75 | 
             
                #
         | 
| 76 | 
            -
                # @see # | 
| 77 | 
            -
                def  | 
| 76 | 
            +
                # @see #right_child
         | 
| 77 | 
            +
                def left_child
         | 
| 78 78 | 
             
                  children.first
         | 
| 79 79 | 
             
                end
         | 
| 80 80 |  | 
| @@ -84,22 +84,39 @@ module Tree | |
| 84 84 | 
             
                #
         | 
| 85 85 | 
             
                # @return [Tree::BinaryTreeNode] The right child, or +nil+ if the right side child does not exist.
         | 
| 86 86 | 
             
                #
         | 
| 87 | 
            -
                # @see # | 
| 88 | 
            -
                def  | 
| 87 | 
            +
                # @see #left_child
         | 
| 88 | 
            +
                def right_child
         | 
| 89 89 | 
             
                  children[1]
         | 
| 90 90 | 
             
                end
         | 
| 91 91 |  | 
| 92 | 
            +
                # A protected method to allow insertion of child nodes at the specified location.
         | 
| 93 | 
            +
                # Note that this method allows insertion of +nil+ nodes.
         | 
| 94 | 
            +
                #
         | 
| 95 | 
            +
                # @param [Tree::BinaryTreeNode] child The child to add at the specified location.
         | 
| 96 | 
            +
                # @param [Integer] at_index The location to add the entry at (0 or 1).
         | 
| 97 | 
            +
                #
         | 
| 98 | 
            +
                # @return [Tree::BinaryTreeNode] The added child.
         | 
| 99 | 
            +
                #
         | 
| 100 | 
            +
                # @raise [ArgumentError] If the index is out of limits.
         | 
| 101 | 
            +
                def set_child_at(child, at_index)
         | 
| 102 | 
            +
                  raise ArgumentError "A binary tree cannot have more than two children." unless (0..1).include? at_index
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                  @children[at_index]        = child
         | 
| 105 | 
            +
                  @children_hash[child.name] = child if child # Assign the name mapping
         | 
| 106 | 
            +
                  child.parent               = self if child
         | 
| 107 | 
            +
                  child
         | 
| 108 | 
            +
                end
         | 
| 109 | 
            +
             | 
| 92 110 | 
             
                # Sets the left child of the receiver node. If a previous child existed, it is replaced.
         | 
| 93 111 | 
             
                #
         | 
| 94 112 | 
             
                # @param [Tree::BinaryTreeNode] child The child to add as the left-side node.
         | 
| 95 113 | 
             
                #
         | 
| 96 114 | 
             
                # @return [Tree::BinaryTreeNode] The assigned child node.
         | 
| 97 115 | 
             
                #
         | 
| 98 | 
            -
                # @see # | 
| 99 | 
            -
                # @see # | 
| 100 | 
            -
                def  | 
| 101 | 
            -
                   | 
| 102 | 
            -
                  @childrenHash[child.name] = child if child # Assign the name mapping
         | 
| 116 | 
            +
                # @see #left_child
         | 
| 117 | 
            +
                # @see #right_child=
         | 
| 118 | 
            +
                def left_child=(child)
         | 
| 119 | 
            +
                  set_child_at child, 0
         | 
| 103 120 | 
             
                end
         | 
| 104 121 |  | 
| 105 122 | 
             
                # Sets the right child of the receiver node. If a previous child existed, it is replaced.
         | 
| @@ -108,37 +125,39 @@ module Tree | |
| 108 125 | 
             
                #
         | 
| 109 126 | 
             
                # @return [Tree::BinaryTreeNode] The assigned child node.
         | 
| 110 127 | 
             
                #
         | 
| 111 | 
            -
                # @see # | 
| 112 | 
            -
                # @see # | 
| 113 | 
            -
                def  | 
| 114 | 
            -
                   | 
| 115 | 
            -
                  @childrenHash[child.name] = child if child # Assign the name mapping
         | 
| 128 | 
            +
                # @see #right_child
         | 
| 129 | 
            +
                # @see #left_child=
         | 
| 130 | 
            +
                def right_child=(child)
         | 
| 131 | 
            +
                  set_child_at child, 1
         | 
| 116 132 | 
             
                end
         | 
| 117 133 |  | 
| 118 134 | 
             
                # Returns +true+ if the receiver node is the left child of its parent.
         | 
| 119 135 | 
             
                # Always returns +false+ if it is a root node.
         | 
| 120 136 | 
             
                #
         | 
| 121 137 | 
             
                # @return [Boolean] +true+ if this is the left child of its parent.
         | 
| 122 | 
            -
                def  | 
| 123 | 
            -
                  return false if  | 
| 124 | 
            -
                  self == parent. | 
| 138 | 
            +
                def is_left_child?
         | 
| 139 | 
            +
                  return false if is_root?
         | 
| 140 | 
            +
                  self == parent.left_child
         | 
| 125 141 | 
             
                end
         | 
| 126 142 |  | 
| 127 143 | 
             
                # Returns +true+ if the receiver node is the right child of its parent.
         | 
| 128 144 | 
             
                # Always returns +false+ if it is a root node.
         | 
| 129 145 | 
             
                #
         | 
| 130 146 | 
             
                # @return [Boolean] +true+ if this is the right child of its parent.
         | 
| 131 | 
            -
                def  | 
| 132 | 
            -
                  return false if  | 
| 133 | 
            -
                  self == parent. | 
| 147 | 
            +
                def is_right_child?
         | 
| 148 | 
            +
                  return false if is_root?
         | 
| 149 | 
            +
                  self == parent.right_child
         | 
| 134 150 | 
             
                end
         | 
| 135 151 |  | 
| 136 152 | 
             
                # Swaps the left and right child nodes of the receiver node with each other.
         | 
| 137 153 | 
             
                #
         | 
| 138 154 | 
             
                # @todo Define the return value.
         | 
| 139 155 | 
             
                def swap_children
         | 
| 140 | 
            -
                  self. | 
| 156 | 
            +
                  self.left_child, self.right_child = self.right_child, self.left_child
         | 
| 141 157 | 
             
                end
         | 
| 158 | 
            +
             | 
| 159 | 
            +
                protected :set_child_at
         | 
| 160 | 
            +
             | 
| 142 161 | 
             
              end
         | 
| 143 162 |  | 
| 144 163 | 
             
            end
         | 
    
        data/test/test_binarytree.rb
    CHANGED
    
    | @@ -47,7 +47,6 @@ module TestTree | |
| 47 47 |  | 
| 48 48 | 
             
                  @left_child1  = Tree::BinaryTreeNode.new("A Child at Left", "Child Node @ left")
         | 
| 49 49 | 
             
                  @right_child1 = Tree::BinaryTreeNode.new("B Child at Right", "Child Node @ right")
         | 
| 50 | 
            -
             | 
| 51 50 | 
             
                end
         | 
| 52 51 |  | 
| 53 52 | 
             
                # Tear down the test data scaffolding.
         | 
| @@ -60,17 +59,24 @@ module TestTree | |
| 60 59 | 
             
                # Test initialization of the binary tree.
         | 
| 61 60 | 
             
                def test_initialize
         | 
| 62 61 | 
             
                  assert_not_nil(@root, "Binary tree's Root should have been created")
         | 
| 62 | 
            +
                  assert_nil(@root.left_child, "The initial left child of root should be nil")
         | 
| 63 | 
            +
                  assert_nil(@root.right_child, "The initial right child of root should be nil")
         | 
| 64 | 
            +
                  assert_equal(@root.children.size, 0, "Initially no children should be present")
         | 
| 63 65 | 
             
                end
         | 
| 64 66 |  | 
| 65 67 | 
             
                # Test the add method.
         | 
| 66 68 | 
             
                def test_add
         | 
| 67 | 
            -
                  @root.add | 
| 68 | 
            -
                   | 
| 69 | 
            -
             | 
| 69 | 
            +
                  @root.add @left_child1
         | 
| 70 | 
            +
                  assert(!@left_child1.is_root?, "Left child1 cannot be a root after addition to the ROOT node")
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                  assert_same(@left_child1, @root.left_child, "The left node should be left_child1")
         | 
| 73 | 
            +
                  assert_same(@left_child1, @root.first_child, "The first node should be left_child1")
         | 
| 70 74 |  | 
| 71 75 | 
             
                  @root.add @right_child1
         | 
| 72 | 
            -
                   | 
| 73 | 
            -
             | 
| 76 | 
            +
                  assert(!@right_child1.is_root?, "Right child1 cannot be a root after addition to the ROOT node")
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                  assert_same(@right_child1, @root.right_child, "The right node should be right_child1")
         | 
| 79 | 
            +
                  assert_same(@right_child1, @root.last_child, "The first node should be right_child1")
         | 
| 74 80 |  | 
| 75 81 | 
             
                  assert_raise ArgumentError do
         | 
| 76 82 | 
             
                    @root.add Tree::BinaryTreeNode.new("The third child!")
         | 
| @@ -81,84 +87,88 @@ module TestTree | |
| 81 87 | 
             
                  end
         | 
| 82 88 | 
             
                end
         | 
| 83 89 |  | 
| 84 | 
            -
                # Test the  | 
| 85 | 
            -
                def  | 
| 90 | 
            +
                # Test the left_child method.
         | 
| 91 | 
            +
                def test_left_child
         | 
| 86 92 | 
             
                  @root << @left_child1
         | 
| 87 93 | 
             
                  @root << @right_child1
         | 
| 88 | 
            -
                  assert_same(@left_child1, @root. | 
| 89 | 
            -
                  assert_not_same(@right_child1, @root. | 
| 94 | 
            +
                  assert_same(@left_child1, @root.left_child, "The left child should be 'left_child1")
         | 
| 95 | 
            +
                  assert_not_same(@right_child1, @root.left_child, "The right_child1 is not the left child")
         | 
| 90 96 | 
             
                end
         | 
| 91 97 |  | 
| 92 | 
            -
                # Test the  | 
| 93 | 
            -
                def  | 
| 98 | 
            +
                # Test the right_child method.
         | 
| 99 | 
            +
                def test_right_child
         | 
| 94 100 | 
             
                  @root << @left_child1
         | 
| 95 101 | 
             
                  @root << @right_child1
         | 
| 96 | 
            -
                  assert_same(@right_child1, @root. | 
| 97 | 
            -
                  assert_not_same(@left_child1, @root. | 
| 102 | 
            +
                  assert_same(@right_child1, @root.right_child, "The right child should be 'right_child1")
         | 
| 103 | 
            +
                  assert_not_same(@left_child1, @root.right_child, "The left_child1 is not the left child")
         | 
| 98 104 | 
             
                end
         | 
| 99 105 |  | 
| 100 | 
            -
                # Test  | 
| 101 | 
            -
                def  | 
| 106 | 
            +
                # Test left_child= method.
         | 
| 107 | 
            +
                def test_left_child_equals
         | 
| 102 108 | 
             
                  @root << @left_child1
         | 
| 103 109 | 
             
                  @root << @right_child1
         | 
| 104 | 
            -
                  assert_same(@left_child1, @root. | 
| 110 | 
            +
                  assert_same(@left_child1, @root.left_child, "The left child should be 'left_child1")
         | 
| 111 | 
            +
                  assert(!@left_child1.is_root?, "The left child now cannot be a root.")
         | 
| 105 112 |  | 
| 106 | 
            -
                  @root. | 
| 107 | 
            -
                   | 
| 108 | 
            -
                  assert_equal(" | 
| 113 | 
            +
                  @root.left_child = Tree::BinaryTreeNode.new("New Left Child")
         | 
| 114 | 
            +
                  assert(!@root.left_child.is_root?, "The left child now cannot be a root.")
         | 
| 115 | 
            +
                  assert_equal("New Left Child", @root.left_child.name, "The left child should now be the new child")
         | 
| 116 | 
            +
                  assert_equal("B Child at Right", @root.last_child.name, "The last child should now be the right child")
         | 
| 109 117 |  | 
| 110 118 | 
             
                  # Now set the left child as nil, and retest
         | 
| 111 | 
            -
                  @root. | 
| 112 | 
            -
                  assert_nil(@root. | 
| 113 | 
            -
                  assert_nil(@root. | 
| 114 | 
            -
                  assert_equal("B Child at Right", @root. | 
| 119 | 
            +
                  @root.left_child = nil
         | 
| 120 | 
            +
                  assert_nil(@root.left_child, "The left child should now be nil")
         | 
| 121 | 
            +
                  assert_nil(@root.first_child, "The first child is now nil")
         | 
| 122 | 
            +
                  assert_equal("B Child at Right", @root.last_child.name, "The last child should now be the right child")
         | 
| 115 123 | 
             
                end
         | 
| 116 124 |  | 
| 117 | 
            -
                # Test  | 
| 118 | 
            -
                def  | 
| 125 | 
            +
                # Test right_child= method.
         | 
| 126 | 
            +
                def test_right_child_equals
         | 
| 119 127 | 
             
                  @root << @left_child1
         | 
| 120 128 | 
             
                  @root << @right_child1
         | 
| 121 | 
            -
                  assert_same(@right_child1, @root. | 
| 129 | 
            +
                  assert_same(@right_child1, @root.right_child, "The right child should be 'right_child1")
         | 
| 130 | 
            +
                  assert(!@right_child1.is_root?, "The right child now cannot be a root.")
         | 
| 122 131 |  | 
| 123 | 
            -
                  @root. | 
| 124 | 
            -
                   | 
| 125 | 
            -
                  assert_equal(" | 
| 126 | 
            -
                  assert_equal(" | 
| 132 | 
            +
                  @root.right_child = Tree::BinaryTreeNode.new("New Right Child")
         | 
| 133 | 
            +
                  assert(!@root.right_child.is_root?, "The right child now cannot be a root.")
         | 
| 134 | 
            +
                  assert_equal("New Right Child", @root.right_child.name, "The right child should now be the new child")
         | 
| 135 | 
            +
                  assert_equal("A Child at Left", @root.first_child.name, "The first child should now be the left child")
         | 
| 136 | 
            +
                  assert_equal("New Right Child", @root.last_child.name, "The last child should now be the right child")
         | 
| 127 137 |  | 
| 128 138 | 
             
                  # Now set the right child as nil, and retest
         | 
| 129 | 
            -
                  @root. | 
| 130 | 
            -
                  assert_nil(@root. | 
| 131 | 
            -
                  assert_equal("A Child at Left", @root. | 
| 132 | 
            -
                  assert_nil(@root. | 
| 139 | 
            +
                  @root.right_child = nil
         | 
| 140 | 
            +
                  assert_nil(@root.right_child, "The right child should now be nil")
         | 
| 141 | 
            +
                  assert_equal("A Child at Left", @root.first_child.name, "The first child should now be the left child")
         | 
| 142 | 
            +
                  assert_nil(@root.last_child, "The first child is now nil")
         | 
| 133 143 | 
             
                end
         | 
| 134 144 |  | 
| 135 | 
            -
                # Test  | 
| 136 | 
            -
                def  | 
| 145 | 
            +
                # Test isLeft_child? method.
         | 
| 146 | 
            +
                def test_is_left_child_eh
         | 
| 137 147 | 
             
                  @root << @left_child1
         | 
| 138 148 | 
             
                  @root << @right_child1
         | 
| 139 149 |  | 
| 140 | 
            -
                  assert(@left_child1. | 
| 141 | 
            -
                  assert(!@right_child1. | 
| 150 | 
            +
                  assert(@left_child1.is_left_child?, "left_child1 should be the left child")
         | 
| 151 | 
            +
                  assert(!@right_child1.is_left_child?, "left_child1 should be the left child")
         | 
| 142 152 |  | 
| 143 153 | 
             
                  # Now set the right child as nil, and retest
         | 
| 144 | 
            -
                  @root. | 
| 145 | 
            -
                  assert(@left_child1. | 
| 154 | 
            +
                  @root.right_child = nil
         | 
| 155 | 
            +
                  assert(@left_child1.is_left_child?, "left_child1 should be the left child")
         | 
| 146 156 |  | 
| 147 | 
            -
                  assert(!@root. | 
| 157 | 
            +
                  assert(!@root.is_left_child?, "Root is neither left child nor right")
         | 
| 148 158 | 
             
                end
         | 
| 149 159 |  | 
| 150 | 
            -
                # Test  | 
| 151 | 
            -
                def  | 
| 160 | 
            +
                # Test is_right_child? method.
         | 
| 161 | 
            +
                def test_is_right_child_eh
         | 
| 152 162 | 
             
                  @root << @left_child1
         | 
| 153 163 | 
             
                  @root << @right_child1
         | 
| 154 164 |  | 
| 155 | 
            -
                  assert(@right_child1. | 
| 156 | 
            -
                  assert(!@left_child1. | 
| 165 | 
            +
                  assert(@right_child1.is_right_child?, "right_child1 should be the right child")
         | 
| 166 | 
            +
                  assert(!@left_child1.is_right_child?, "right_child1 should be the right child")
         | 
| 157 167 |  | 
| 158 168 | 
             
                  # Now set the left child as nil, and retest
         | 
| 159 | 
            -
                  @root. | 
| 160 | 
            -
                  assert(@right_child1. | 
| 161 | 
            -
                  assert(!@root. | 
| 169 | 
            +
                  @root.left_child = nil
         | 
| 170 | 
            +
                  assert(@right_child1.is_right_child?, "right_child1 should be the right child")
         | 
| 171 | 
            +
                  assert(!@root.is_right_child?, "Root is neither left child nor right")
         | 
| 162 172 | 
             
                end
         | 
| 163 173 |  | 
| 164 174 | 
             
                # Test swap_children method.
         | 
| @@ -166,17 +176,36 @@ module TestTree | |
| 166 176 | 
             
                  @root << @left_child1
         | 
| 167 177 | 
             
                  @root << @right_child1
         | 
| 168 178 |  | 
| 169 | 
            -
                  assert(@right_child1. | 
| 170 | 
            -
                  assert(!@left_child1. | 
| 179 | 
            +
                  assert(@right_child1.is_right_child?, "right_child1 should be the right child")
         | 
| 180 | 
            +
                  assert(!@left_child1.is_right_child?, "right_child1 should be the right child")
         | 
| 171 181 |  | 
| 172 182 | 
             
                  @root.swap_children
         | 
| 173 183 |  | 
| 174 | 
            -
                  assert(@right_child1. | 
| 175 | 
            -
                  assert(@left_child1. | 
| 176 | 
            -
                  assert_equal(@right_child1, @root. | 
| 177 | 
            -
                  assert_equal(@left_child1, @root. | 
| 184 | 
            +
                  assert(@right_child1.is_left_child?, "right_child1 should now be the left child")
         | 
| 185 | 
            +
                  assert(@left_child1.is_right_child?, "left_child1 should now be the right child")
         | 
| 186 | 
            +
                  assert_equal(@right_child1, @root.first_child, "right_child1 should now be the first child")
         | 
| 187 | 
            +
                  assert_equal(@left_child1, @root.last_child, "left_child1 should now be the last child")
         | 
| 178 188 | 
             
                  assert_equal(@right_child1, @root[0], "right_child1 should now be the first child")
         | 
| 179 189 | 
             
                  assert_equal(@left_child1, @root[1], "left_child1 should now be the last child")
         | 
| 180 190 | 
             
                end
         | 
| 191 | 
            +
             | 
| 192 | 
            +
                # Test the old CamelCase method names
         | 
| 193 | 
            +
                def test_old_camelCase_method_names
         | 
| 194 | 
            +
                  @left_child2  = Tree::BinaryTreeNode.new("A Child at Left", "Child Node @ left")
         | 
| 195 | 
            +
                  @right_child2 = Tree::BinaryTreeNode.new("B Child at Right", "Child Node @ right")
         | 
| 196 | 
            +
             | 
| 197 | 
            +
                  require 'structured_warnings'
         | 
| 198 | 
            +
             | 
| 199 | 
            +
                  meth_names_for_test = %w{leftChild isLeftChild? rightChild isRightChild?}
         | 
| 200 | 
            +
             | 
| 201 | 
            +
                  meth_names_for_test.each do |meth_name|
         | 
| 202 | 
            +
                    assert_warn(DeprecatedMethodWarning) {@root.send(meth_name)}
         | 
| 203 | 
            +
                  end
         | 
| 204 | 
            +
             | 
| 205 | 
            +
                  assert_warn(DeprecatedMethodWarning) {@root.leftChild = @left_child2}
         | 
| 206 | 
            +
                  assert_warn(DeprecatedMethodWarning) {@root.rightChild = @right_child2}
         | 
| 207 | 
            +
             | 
| 208 | 
            +
                end
         | 
| 209 | 
            +
             | 
| 181 210 | 
             
              end
         | 
| 182 211 | 
             
            end
         | 
    
        data/test/test_tree.rb
    CHANGED
    
    | @@ -71,7 +71,8 @@ module TestTree | |
| 71 71 | 
             
                  @child1 = Tree::TreeNode.new("Child1", "Child Node 1")
         | 
| 72 72 | 
             
                  @child2 = Tree::TreeNode.new("Child2", "Child Node 2")
         | 
| 73 73 | 
             
                  @child3 = Tree::TreeNode.new("Child3", "Child Node 3")
         | 
| 74 | 
            -
                  @child4 = Tree::TreeNode.new(" | 
| 74 | 
            +
                  @child4 = Tree::TreeNode.new("Child4", "Grand Child 1")
         | 
| 75 | 
            +
                  @child5 = Tree::TreeNode.new("Child5", "Child Node 4")
         | 
| 75 76 |  | 
| 76 77 | 
             
                end
         | 
| 77 78 |  | 
| @@ -89,18 +90,18 @@ module TestTree | |
| 89 90 |  | 
| 90 91 | 
             
                # This test is for the root alone - without any children being linked
         | 
| 91 92 | 
             
                def test_root_setup
         | 
| 92 | 
            -
                  assert_not_nil(@root | 
| 93 | 
            -
                  assert_nil(@root.parent | 
| 94 | 
            -
                  assert_not_nil(@root.name | 
| 95 | 
            -
                  assert_equal("ROOT" | 
| 96 | 
            -
                  assert_equal("Root Node" | 
| 97 | 
            -
                  assert(@root. | 
| 98 | 
            -
                  assert(!@root. | 
| 99 | 
            -
                  assert(@root. | 
| 100 | 
            -
                  assert_equal(1 | 
| 101 | 
            -
                  assert_nil(@root.siblings | 
| 93 | 
            +
                  assert_not_nil(@root        , "Root cannot be nil")
         | 
| 94 | 
            +
                  assert_nil(@root.parent     , "Parent of root node should be nil")
         | 
| 95 | 
            +
                  assert_not_nil(@root.name   , "Name should not be nil")
         | 
| 96 | 
            +
                  assert_equal("ROOT"         , @root.name, "Name should be 'ROOT'")
         | 
| 97 | 
            +
                  assert_equal("Root Node"    , @root.content, "Content should be 'Root Node'")
         | 
| 98 | 
            +
                  assert(@root.is_root?       , "Should identify as root")
         | 
| 99 | 
            +
                  assert(!@root.has_children? , "Cannot have any children")
         | 
| 100 | 
            +
                  assert(@root.has_content?   , "This root should have content")
         | 
| 101 | 
            +
                  assert_equal(1              , @root.size, "Number of nodes should be one")
         | 
| 102 | 
            +
                  assert_nil(@root.siblings   , "This root does not have any children")
         | 
| 102 103 | 
             
                  assert_equal(0, @root.in_degree, "Root should have an in-degree of 0")
         | 
| 103 | 
            -
                  assert_equal(0, @root. | 
| 104 | 
            +
                  assert_equal(0, @root.node_height, "Root's height before adding any children is 0")
         | 
| 104 105 | 
             
                  assert_raise(ArgumentError) { Tree::TreeNode.new(nil) }
         | 
| 105 106 | 
             
                end
         | 
| 106 107 |  | 
| @@ -114,18 +115,18 @@ module TestTree | |
| 114 115 | 
             
                  assert_same(@root , @root.root, "Root's root is self")
         | 
| 115 116 | 
             
                  assert_same(@root , @child1.root, "Root should be ROOT")
         | 
| 116 117 | 
             
                  assert_same(@root , @child4.root, "Root should be ROOT")
         | 
| 117 | 
            -
                  assert_equal(2    , @root. | 
| 118 | 
            +
                  assert_equal(2    , @root.node_height, "Root's height after adding the children should be 2")
         | 
| 118 119 | 
             
                end
         | 
| 119 120 |  | 
| 120 121 | 
             
                # Test the presence of content in the nodes.
         | 
| 121 | 
            -
                def  | 
| 122 | 
            -
                   | 
| 123 | 
            -
                  assert_nil( | 
| 124 | 
            -
                  assert(! | 
| 125 | 
            -
             | 
| 126 | 
            -
                   | 
| 127 | 
            -
                  assert_not_nil( | 
| 128 | 
            -
                  assert( | 
| 122 | 
            +
                def test_has_content_eh
         | 
| 123 | 
            +
                  a_node = Tree::TreeNode.new("A Node")
         | 
| 124 | 
            +
                  assert_nil(a_node.content  , "The node should not have content")
         | 
| 125 | 
            +
                  assert(!a_node.has_content? , "The node should not have content")
         | 
| 126 | 
            +
             | 
| 127 | 
            +
                  a_node.content = "Something"
         | 
| 128 | 
            +
                  assert_not_nil(a_node.content, "The node should now have content")
         | 
| 129 | 
            +
                  assert(a_node.has_content?, "The node should now have content")
         | 
| 129 130 | 
             
                end
         | 
| 130 131 |  | 
| 131 132 | 
             
                # Test the equivalence of size and length methods.
         | 
| @@ -136,80 +137,81 @@ module TestTree | |
| 136 137 |  | 
| 137 138 | 
             
                # Test the <=> operator.
         | 
| 138 139 | 
             
                def test_spaceship
         | 
| 139 | 
            -
                   | 
| 140 | 
            -
                   | 
| 140 | 
            +
                  first_node  = Tree::TreeNode.new(1)
         | 
| 141 | 
            +
                  second_node = Tree::TreeNode.new(2)
         | 
| 142 | 
            +
             | 
| 141 143 |  | 
| 142 | 
            -
                  assert_equal( | 
| 143 | 
            -
                  assert_equal( | 
| 144 | 
            +
                  assert_equal(first_node <=> nil, +1)
         | 
| 145 | 
            +
                  assert_equal(first_node <=> second_node, -1)
         | 
| 144 146 |  | 
| 145 | 
            -
                   | 
| 146 | 
            -
                  assert_equal( | 
| 147 | 
            +
                  second_node = Tree::TreeNode.new(1)
         | 
| 148 | 
            +
                  assert_equal(first_node <=> second_node, 0)
         | 
| 147 149 |  | 
| 148 | 
            -
                   | 
| 149 | 
            -
                   | 
| 150 | 
            +
                  first_node  = Tree::TreeNode.new("ABC")
         | 
| 151 | 
            +
                  second_node = Tree::TreeNode.new("XYZ")
         | 
| 150 152 |  | 
| 151 | 
            -
                  assert_equal( | 
| 152 | 
            -
                  assert_equal( | 
| 153 | 
            +
                  assert_equal(first_node <=> nil, +1)
         | 
| 154 | 
            +
                  assert_equal(first_node <=> second_node, -1)
         | 
| 153 155 |  | 
| 154 | 
            -
                   | 
| 155 | 
            -
                  assert_equal( | 
| 156 | 
            +
                  second_node = Tree::TreeNode.new("ABC")
         | 
| 157 | 
            +
                  assert_equal(first_node <=> second_node, 0)
         | 
| 156 158 | 
             
                end
         | 
| 157 159 |  | 
| 158 160 | 
             
                # Test the to_s method.  This is probably a little fragile right now.
         | 
| 159 161 | 
             
                def test_to_s
         | 
| 160 | 
            -
                   | 
| 162 | 
            +
                  a_node = Tree::TreeNode.new("A Node", "Some Content")
         | 
| 161 163 |  | 
| 162 | 
            -
                   | 
| 164 | 
            +
                  expected_string = "Node Name: A Node Content: Some Content Parent: <None> Children: 0 Total Nodes: 1"
         | 
| 163 165 |  | 
| 164 | 
            -
                  assert_equal( | 
| 166 | 
            +
                  assert_equal(expected_string, a_node.to_s, "The string representation should be same")
         | 
| 165 167 | 
             
                end
         | 
| 166 168 |  | 
| 167 | 
            -
                # Test the  | 
| 168 | 
            -
                def  | 
| 169 | 
            +
                # Test the first_sibling method.
         | 
| 170 | 
            +
                def test_first_sibling
         | 
| 169 171 | 
             
                  setup_test_tree
         | 
| 170 172 |  | 
| 171 | 
            -
                  # TODO: Need to fix the  | 
| 172 | 
            -
                  assert_same(@root, @root. | 
| 173 | 
            -
                  assert_same(@child1, @child1. | 
| 174 | 
            -
                  assert_same(@child1, @child2. | 
| 175 | 
            -
                  assert_same(@child1, @child3. | 
| 176 | 
            -
                  assert_not_same(@child1, @child4. | 
| 173 | 
            +
                  # TODO: Need to fix the first_sibling method to return nil for nodes with no siblings.
         | 
| 174 | 
            +
                  assert_same(@root, @root.first_sibling, "Root's first sibling is itself")
         | 
| 175 | 
            +
                  assert_same(@child1, @child1.first_sibling, "Child1's first sibling is itself")
         | 
| 176 | 
            +
                  assert_same(@child1, @child2.first_sibling, "Child2's first sibling should be child1")
         | 
| 177 | 
            +
                  assert_same(@child1, @child3.first_sibling, "Child3's first sibling should be child1")
         | 
| 178 | 
            +
                  assert_not_same(@child1, @child4.first_sibling, "Child4's first sibling is itself")
         | 
| 177 179 | 
             
                end
         | 
| 178 180 |  | 
| 179 | 
            -
                # Test the  | 
| 180 | 
            -
                def  | 
| 181 | 
            +
                # Test the is_first_sibling? method.
         | 
| 182 | 
            +
                def test_is_first_sibling_eh
         | 
| 181 183 | 
             
                  setup_test_tree
         | 
| 182 184 |  | 
| 183 | 
            -
                  # TODO: Need to fix the  | 
| 184 | 
            -
                  assert(@root. | 
| 185 | 
            -
                  assert( @child1. | 
| 186 | 
            -
                  assert(!@child2. | 
| 187 | 
            -
                  assert(!@child3. | 
| 188 | 
            -
                  assert( @child4. | 
| 185 | 
            +
                  # TODO: Need to fix the first_sibling method to return nil for nodes with no siblings.
         | 
| 186 | 
            +
                  assert(@root.is_first_sibling?, "Root's first sibling is itself")
         | 
| 187 | 
            +
                  assert( @child1.is_first_sibling?, "Child1's first sibling is itself")
         | 
| 188 | 
            +
                  assert(!@child2.is_first_sibling?, "Child2 is not the first sibling")
         | 
| 189 | 
            +
                  assert(!@child3.is_first_sibling?, "Child3 is not the first sibling")
         | 
| 190 | 
            +
                  assert( @child4.is_first_sibling?, "Child4's first sibling is itself")
         | 
| 189 191 | 
             
                end
         | 
| 190 192 |  | 
| 191 | 
            -
                # Test the  | 
| 192 | 
            -
                def  | 
| 193 | 
            +
                # Test the is_last_sibling? method.
         | 
| 194 | 
            +
                def test_is_last_sibling_eh
         | 
| 193 195 | 
             
                  setup_test_tree
         | 
| 194 196 |  | 
| 195 | 
            -
                  # TODO: Need to fix the  | 
| 196 | 
            -
                  assert(@root. | 
| 197 | 
            -
                  assert(!@child1. | 
| 198 | 
            -
                  assert(!@child2. | 
| 199 | 
            -
                  assert( @child3. | 
| 200 | 
            -
                  assert( @child4. | 
| 197 | 
            +
                  # TODO: Need to fix the last_sibling method to return nil for nodes with no siblings.
         | 
| 198 | 
            +
                  assert(@root.is_last_sibling?, "Root's last sibling is itself")
         | 
| 199 | 
            +
                  assert(!@child1.is_last_sibling?, "Child1 is not the last sibling")
         | 
| 200 | 
            +
                  assert(!@child2.is_last_sibling?, "Child2 is not the last sibling")
         | 
| 201 | 
            +
                  assert( @child3.is_last_sibling?, "Child3's last sibling is itself")
         | 
| 202 | 
            +
                  assert( @child4.is_last_sibling?, "Child4's last sibling is itself")
         | 
| 201 203 | 
             
                end
         | 
| 202 204 |  | 
| 203 | 
            -
                # Test the  | 
| 204 | 
            -
                def  | 
| 205 | 
            +
                # Test the last_sibling method.
         | 
| 206 | 
            +
                def test_last_sibling
         | 
| 205 207 | 
             
                  setup_test_tree
         | 
| 206 208 |  | 
| 207 | 
            -
                  # TODO: Need to fix the  | 
| 208 | 
            -
                  assert_same(@root, @root. | 
| 209 | 
            -
                  assert_same(@child3, @child1. | 
| 210 | 
            -
                  assert_same(@child3, @child2. | 
| 211 | 
            -
                  assert_same(@child3, @child3. | 
| 212 | 
            -
                  assert_not_same(@child3, @child4. | 
| 209 | 
            +
                  # TODO: Need to fix the last_sibling method to return nil for nodes with no siblings.
         | 
| 210 | 
            +
                  assert_same(@root, @root.last_sibling, "Root's last sibling is itself")
         | 
| 211 | 
            +
                  assert_same(@child3, @child1.last_sibling, "Child1's last sibling should be child3")
         | 
| 212 | 
            +
                  assert_same(@child3, @child2.last_sibling, "Child2's last sibling should be child3")
         | 
| 213 | 
            +
                  assert_same(@child3, @child3.last_sibling, "Child3's last sibling should be itself")
         | 
| 214 | 
            +
                  assert_not_same(@child3, @child4.last_sibling, "Child4's last sibling is itself")
         | 
| 213 215 | 
             
                end
         | 
| 214 216 |  | 
| 215 217 | 
             
                # Test the siblings method, which is essentially an iterator.
         | 
| @@ -237,49 +239,49 @@ module TestTree | |
| 237 239 | 
             
                  assert_nil(siblings, "Root should not have any siblings")
         | 
| 238 240 | 
             
                end
         | 
| 239 241 |  | 
| 240 | 
            -
                # Test the  | 
| 241 | 
            -
                def  | 
| 242 | 
            +
                # Test the is_only_child? method.
         | 
| 243 | 
            +
                def test_is_only_child_eh
         | 
| 242 244 | 
             
                  setup_test_tree
         | 
| 243 245 |  | 
| 244 | 
            -
                  assert( @root. | 
| 245 | 
            -
                  assert(!@child1. | 
| 246 | 
            -
                  assert(!@child2. | 
| 247 | 
            -
                  assert(!@child3. | 
| 248 | 
            -
                  assert( @child4. | 
| 246 | 
            +
                  assert( @root.is_only_child?  , "Root is an only child")
         | 
| 247 | 
            +
                  assert(!@child1.is_only_child?, "Child1 is not the only child")
         | 
| 248 | 
            +
                  assert(!@child2.is_only_child?, "Child2 is not the only child")
         | 
| 249 | 
            +
                  assert(!@child3.is_only_child?, "Child3 is not the only child")
         | 
| 250 | 
            +
                  assert( @child4.is_only_child?, "Child4 is an only child")
         | 
| 249 251 | 
             
                end
         | 
| 250 252 |  | 
| 251 | 
            -
                # Test the  | 
| 252 | 
            -
                def  | 
| 253 | 
            +
                # Test the next_sibling method.
         | 
| 254 | 
            +
                def test_next_sibling
         | 
| 253 255 | 
             
                  setup_test_tree
         | 
| 254 256 |  | 
| 255 | 
            -
                  assert_nil(@root. | 
| 256 | 
            -
                  assert_equal(@child2, @child1. | 
| 257 | 
            -
                  assert_equal(@child3, @child2. | 
| 258 | 
            -
                  assert_nil(@child3. | 
| 259 | 
            -
                  assert_nil(@child4. | 
| 257 | 
            +
                  assert_nil(@root.next_sibling, "Root does not have any next sibling")
         | 
| 258 | 
            +
                  assert_equal(@child2, @child1.next_sibling, "Child1's next sibling is Child2")
         | 
| 259 | 
            +
                  assert_equal(@child3, @child2.next_sibling, "Child2's next sibling is Child3")
         | 
| 260 | 
            +
                  assert_nil(@child3.next_sibling, "Child3 does not have a next sibling")
         | 
| 261 | 
            +
                  assert_nil(@child4.next_sibling, "Child4 does not have a next sibling")
         | 
| 260 262 | 
             
                end
         | 
| 261 263 |  | 
| 262 | 
            -
                # Test the  | 
| 263 | 
            -
                def  | 
| 264 | 
            +
                # Test the previous_sibling method.
         | 
| 265 | 
            +
                def test_previous_sibling
         | 
| 264 266 | 
             
                  setup_test_tree
         | 
| 265 267 |  | 
| 266 | 
            -
                  assert_nil(@root. | 
| 267 | 
            -
                  assert_nil(@child1. | 
| 268 | 
            -
                  assert_equal(@child1, @child2. | 
| 269 | 
            -
                  assert_equal(@child2, @child3. | 
| 270 | 
            -
                  assert_nil(@child4. | 
| 268 | 
            +
                  assert_nil(@root.previous_sibling, "Root does not have any previous sibling")
         | 
| 269 | 
            +
                  assert_nil(@child1.previous_sibling, "Child1 does not have previous sibling")
         | 
| 270 | 
            +
                  assert_equal(@child1, @child2.previous_sibling, "Child2's previous sibling is Child1")
         | 
| 271 | 
            +
                  assert_equal(@child2, @child3.previous_sibling, "Child3's previous sibling is Child2")
         | 
| 272 | 
            +
                  assert_nil(@child4.previous_sibling, "Child4 does not have a previous sibling")
         | 
| 271 273 | 
             
                end
         | 
| 272 274 |  | 
| 273 275 | 
             
                # Test the add method.
         | 
| 274 276 | 
             
                def test_add
         | 
| 275 | 
            -
                  assert(!@root. | 
| 277 | 
            +
                  assert(!@root.has_children?, "Should not have any children")
         | 
| 276 278 |  | 
| 277 279 | 
             
                  assert_equal(1, @root.size, "Should have 1 node (the root)")
         | 
| 278 280 | 
             
                  @root.add(@child1)
         | 
| 279 281 |  | 
| 280 282 | 
             
                  @root << @child2
         | 
| 281 283 |  | 
| 282 | 
            -
                  assert(@root. | 
| 284 | 
            +
                  assert(@root.has_children?, "Should have children")
         | 
| 283 285 | 
             
                  assert_equal(3, @root.size, "Should have three nodes")
         | 
| 284 286 |  | 
| 285 287 | 
             
                  @root << @child3 << @child4
         | 
| @@ -294,64 +296,128 @@ module TestTree | |
| 294 296 | 
             
                  assert_raise(ArgumentError) { @root.add(nil) }
         | 
| 295 297 | 
             
                end
         | 
| 296 298 |  | 
| 297 | 
            -
                # Test  | 
| 299 | 
            +
                # Test Addition at a specific position
         | 
| 300 | 
            +
                def test_add_at_specific_position
         | 
| 301 | 
            +
                  assert(!@root.has_children?, "Should not have any children")
         | 
| 302 | 
            +
             | 
| 303 | 
            +
                  assert_equal(1, @root.size, "Should have 1 node (the root)")
         | 
| 304 | 
            +
                  @root.add(@child1)        # First Child added at position 0
         | 
| 305 | 
            +
                  # Validate that children = [@child1]
         | 
| 306 | 
            +
                  assert_equal(@child1, @root[0])
         | 
| 307 | 
            +
             | 
| 308 | 
            +
                  @root << @child2          # Second child appended at position 1.
         | 
| 309 | 
            +
                  # Validate that children = [@child1, @child2]
         | 
| 310 | 
            +
                  assert_equal(@child1, @root[0])
         | 
| 311 | 
            +
                  assert_equal(@child2, @root[1])
         | 
| 312 | 
            +
                  assert_equal(2, @root.children.size, "Should have two child nodes")
         | 
| 313 | 
            +
             | 
| 314 | 
            +
                  @root.add(@child3, 1)     # Third child inserted at position 1 (before @child2)
         | 
| 315 | 
            +
                  # Validate that children = [@child1, @child3, @child2]
         | 
| 316 | 
            +
                  assert_equal(@child1, @root[0])
         | 
| 317 | 
            +
                  assert_equal(@child3, @root[1])
         | 
| 318 | 
            +
                  assert_equal(@child2, @root[2])
         | 
| 319 | 
            +
                  assert_equal(3, @root.children.size, "Should have three child nodes")
         | 
| 320 | 
            +
             | 
| 321 | 
            +
                  @root.add(@child4, @root.children.size)     # Fourth child inserted at the end (equivalent to plain #add(child4)
         | 
| 322 | 
            +
                  # Validate that children = [@child1, @child3, @child2, @child4]
         | 
| 323 | 
            +
                  assert_equal(@child1, @root[0])
         | 
| 324 | 
            +
                  assert_equal(@child3, @root[1])
         | 
| 325 | 
            +
                  assert_equal(@child2, @root[2])
         | 
| 326 | 
            +
                  assert_equal(@child4, @root[3])
         | 
| 327 | 
            +
                  assert_equal(4, @root.children.size, "Should have four child nodes")
         | 
| 328 | 
            +
             | 
| 329 | 
            +
                  # Now, a negative test.  We are preventing addition to a position that does not exist.
         | 
| 330 | 
            +
                  assert_raise(RuntimeError) {
         | 
| 331 | 
            +
                    @root.add(@child5, @root.children.size + 1)     # Fifth child inserted beyond the last position that is valid (at 5th pos).
         | 
| 332 | 
            +
                  }
         | 
| 333 | 
            +
                  # Validate that we still have children = [@child1, @child3, @child2, @child4]
         | 
| 334 | 
            +
                  assert_equal(@child1, @root[0])
         | 
| 335 | 
            +
                  assert_equal(@child3, @root[1])
         | 
| 336 | 
            +
                  assert_equal(@child2, @root[2])
         | 
| 337 | 
            +
                  assert_equal(@child4, @root[3])
         | 
| 338 | 
            +
                  assert_nil(@root[4])
         | 
| 339 | 
            +
                  assert_equal(4, @root.children.size, "Should have four child nodes")
         | 
| 340 | 
            +
             | 
| 341 | 
            +
                  # Another negative test.  Lets attempt to add from the end at a position that is not available
         | 
| 342 | 
            +
                  assert_raise(RuntimeError) {
         | 
| 343 | 
            +
                    @root.add(@child5, -(@root.children.size+2))     # Fifth child inserted beyond the first position that is valid; i.e. at -6
         | 
| 344 | 
            +
                  }
         | 
| 345 | 
            +
                  assert_nil(@root[-5])
         | 
| 346 | 
            +
                  assert_equal(@child1, @root[-4])
         | 
| 347 | 
            +
                  assert_equal(@child3, @root[-3])
         | 
| 348 | 
            +
                  assert_equal(@child2, @root[-2])
         | 
| 349 | 
            +
                  assert_equal(@child4, @root[-1])
         | 
| 350 | 
            +
                  assert_equal(4, @root.children.size, "Should have four child nodes")
         | 
| 351 | 
            +
             | 
| 352 | 
            +
                  # Lets correctly add the fifth child from the end to effectively prepend the node.
         | 
| 353 | 
            +
                  @root.add(@child5, -(@root.children.size+1))     # Fifth child inserted beyond the first position; i.e. at -5
         | 
| 354 | 
            +
                  assert_nil(@root[-6])
         | 
| 355 | 
            +
                  assert_equal(@child5, @root[-5])
         | 
| 356 | 
            +
                  assert_equal(@child1, @root[-4])
         | 
| 357 | 
            +
                  assert_equal(@child3, @root[-3])
         | 
| 358 | 
            +
                  assert_equal(@child2, @root[-2])
         | 
| 359 | 
            +
                  assert_equal(@child4, @root[-1])
         | 
| 360 | 
            +
                  assert_equal(5, @root.children.size, "Should have five child nodes")
         | 
| 361 | 
            +
                end
         | 
| 362 | 
            +
             | 
| 363 | 
            +
                # Test the remove! and remove_all! methods.
         | 
| 298 364 | 
             
                def test_remove_bang
         | 
| 299 365 | 
             
                  @root << @child1
         | 
| 300 366 | 
             
                  @root << @child2
         | 
| 301 367 |  | 
| 302 | 
            -
                  assert(@root. | 
| 368 | 
            +
                  assert(@root.has_children?, "Should have children")
         | 
| 303 369 | 
             
                  assert_equal(3, @root.size, "Should have three nodes")
         | 
| 304 370 |  | 
| 305 371 | 
             
                  @root.remove!(@child1)
         | 
| 306 372 | 
             
                  assert_equal(2, @root.size, "Should have two nodes")
         | 
| 307 373 | 
             
                  @root.remove!(@child2)
         | 
| 308 374 |  | 
| 309 | 
            -
                  assert(!@root. | 
| 375 | 
            +
                  assert(!@root.has_children?, "Should have no children")
         | 
| 310 376 | 
             
                  assert_equal(1, @root.size, "Should have one node")
         | 
| 311 377 |  | 
| 312 378 | 
             
                  @root << @child1
         | 
| 313 379 | 
             
                  @root << @child2
         | 
| 314 380 |  | 
| 315 | 
            -
                  assert(@root. | 
| 381 | 
            +
                  assert(@root.has_children?, "Should have children")
         | 
| 316 382 | 
             
                  assert_equal(3, @root.size, "Should have three nodes")
         | 
| 317 383 |  | 
| 318 | 
            -
                  @root. | 
| 384 | 
            +
                  @root.remove_all!
         | 
| 319 385 |  | 
| 320 | 
            -
                  assert(!@root. | 
| 386 | 
            +
                  assert(!@root.has_children?, "Should have no children")
         | 
| 321 387 | 
             
                  assert_equal(1, @root.size, "Should have one node")
         | 
| 322 388 |  | 
| 323 389 | 
             
                  # Some negative testing
         | 
| 324 390 | 
             
                  @root.remove!(nil)
         | 
| 325 | 
            -
                  assert(!@root. | 
| 391 | 
            +
                  assert(!@root.has_children?, "Should have no children")
         | 
| 326 392 | 
             
                  assert_equal(1, @root.size, "Should have one node")
         | 
| 327 393 | 
             
                end
         | 
| 328 394 |  | 
| 329 | 
            -
                # Test the  | 
| 330 | 
            -
                def  | 
| 395 | 
            +
                # Test the remove_all! method.
         | 
| 396 | 
            +
                def test_remove_all_bang
         | 
| 331 397 | 
             
                  setup_test_tree
         | 
| 398 | 
            +
                  assert(@root.has_children?, "Should have children")
         | 
| 399 | 
            +
                  @root.remove_all!
         | 
| 332 400 |  | 
| 333 | 
            -
                  assert( | 
| 334 | 
            -
                  @root.removeAll!
         | 
| 335 | 
            -
             | 
| 336 | 
            -
                  assert(!@root.hasChildren?, "Should have no children")
         | 
| 401 | 
            +
                  assert(!@root.has_children?, "Should have no children")
         | 
| 337 402 | 
             
                  assert_equal(1, @root.size, "Should have one node")
         | 
| 338 403 | 
             
                end
         | 
| 339 404 |  | 
| 340 | 
            -
                # Test the  | 
| 341 | 
            -
                def  | 
| 405 | 
            +
                # Test the remove_from_parent! method.
         | 
| 406 | 
            +
                def test_remove_from_parent_bang
         | 
| 342 407 | 
             
                  setup_test_tree
         | 
| 343 | 
            -
             | 
| 344 | 
            -
                  assert( | 
| 408 | 
            +
             | 
| 409 | 
            +
                  assert(@root.has_children?, "Should have children")
         | 
| 410 | 
            +
                  assert(!@root.is_leaf?, "Root is not a leaf here")
         | 
| 345 411 |  | 
| 346 412 | 
             
                  child1 = @root[0]
         | 
| 347 413 | 
             
                  assert_not_nil(child1, "Child 1 should exist")
         | 
| 348 414 | 
             
                  assert_same(@root, child1.root, "Child 1's root should be ROOT")
         | 
| 349 415 | 
             
                  assert(@root.include?(child1), "root should have child1")
         | 
| 350 | 
            -
                  child1. | 
| 416 | 
            +
                  child1.remove_from_parent!
         | 
| 351 417 | 
             
                  assert_same(child1, child1.root, "Child 1's root should be self")
         | 
| 352 418 | 
             
                  assert(!@root.include?(child1), "root should not have child1")
         | 
| 353 419 |  | 
| 354 | 
            -
                  child1. | 
| 420 | 
            +
                  child1.remove_from_parent!
         | 
| 355 421 | 
             
                  assert_same(child1, child1.root, "Child 1's root should still be self")
         | 
| 356 422 | 
             
                end
         | 
| 357 423 |  | 
| @@ -359,14 +425,14 @@ module TestTree | |
| 359 425 | 
             
                def test_children
         | 
| 360 426 | 
             
                  setup_test_tree
         | 
| 361 427 |  | 
| 362 | 
            -
                  assert(@root. | 
| 428 | 
            +
                  assert(@root.has_children?, "Should have children")
         | 
| 363 429 | 
             
                  assert_equal(5, @root.size, "Should have five nodes")
         | 
| 364 | 
            -
                  assert(@child3. | 
| 365 | 
            -
                  assert(!@child3. | 
| 430 | 
            +
                  assert(@child3.has_children?, "Should have children")
         | 
| 431 | 
            +
                  assert(!@child3.is_leaf?, "Should not be a leaf")
         | 
| 366 432 |  | 
| 367 | 
            -
                  assert_equal(1, @child3. | 
| 433 | 
            +
                  assert_equal(1, @child3.node_height, "The subtree at Child 3 should have a height of 1")
         | 
| 368 434 | 
             
                  for child in [@child1, @child2, @child4]
         | 
| 369 | 
            -
                    assert_equal(0, child. | 
| 435 | 
            +
                    assert_equal(0, child.node_height, "The subtree at #{child.name} should have a height of 0")
         | 
| 370 436 | 
             
                  end
         | 
| 371 437 |  | 
| 372 438 | 
             
                  children = []
         | 
| @@ -384,42 +450,39 @@ module TestTree | |
| 384 450 | 
             
                  children.clear
         | 
| 385 451 | 
             
                  children = @root.children
         | 
| 386 452 | 
             
                  assert_equal(3, children.length, "Should have three children")
         | 
| 387 | 
            -
             | 
| 388 453 | 
             
                end
         | 
| 389 454 |  | 
| 390 | 
            -
                # Test the  | 
| 391 | 
            -
                def  | 
| 455 | 
            +
                # Test the first_child method.
         | 
| 456 | 
            +
                def test_first_child
         | 
| 392 457 | 
             
                  setup_test_tree
         | 
| 393 458 |  | 
| 394 | 
            -
                  assert_equal(@child1, @root. | 
| 395 | 
            -
                  assert_nil(@child1. | 
| 396 | 
            -
                  assert_equal(@child4, @child3. | 
| 397 | 
            -
             | 
| 459 | 
            +
                  assert_equal(@child1, @root.first_child, "Root's first child is Child1")
         | 
| 460 | 
            +
                  assert_nil(@child1.first_child, "Child1 does not have any children")
         | 
| 461 | 
            +
                  assert_equal(@child4, @child3.first_child, "Child3's first child is Child4")
         | 
| 398 462 | 
             
                end
         | 
| 399 463 |  | 
| 400 | 
            -
                # Test the  | 
| 401 | 
            -
                def  | 
| 464 | 
            +
                # Test the last_child method.
         | 
| 465 | 
            +
                def test_last_child
         | 
| 402 466 | 
             
                  setup_test_tree
         | 
| 403 467 |  | 
| 404 | 
            -
                  assert_equal(@child3, @root. | 
| 405 | 
            -
                  assert_nil(@child1. | 
| 406 | 
            -
                  assert_equal(@child4, @child3. | 
| 407 | 
            -
             | 
| 468 | 
            +
                  assert_equal(@child3, @root.last_child, "Root's last child is Child3")
         | 
| 469 | 
            +
                  assert_nil(@child1.last_child, "Child1 does not have any children")
         | 
| 470 | 
            +
                  assert_equal(@child4, @child3.last_child, "Child3's last child is Child4")
         | 
| 408 471 | 
             
                end
         | 
| 409 472 |  | 
| 410 473 | 
             
                # Test the find method.
         | 
| 411 474 | 
             
                def test_find
         | 
| 412 475 | 
             
                  setup_test_tree
         | 
| 413 | 
            -
                   | 
| 414 | 
            -
                  assert_same(@child2,  | 
| 476 | 
            +
                  found_node = @root.find { |node| node == @child2}
         | 
| 477 | 
            +
                  assert_same(@child2, found_node, "The node should be Child 2")
         | 
| 415 478 |  | 
| 416 | 
            -
                   | 
| 417 | 
            -
                  assert_same(@child4,  | 
| 479 | 
            +
                  found_node = @root.find { |node| node == @child4}
         | 
| 480 | 
            +
                  assert_same(@child4, found_node, "The node should be Child 4")
         | 
| 418 481 |  | 
| 419 | 
            -
                   | 
| 420 | 
            -
                  assert_same(@child4,  | 
| 421 | 
            -
                   | 
| 422 | 
            -
                  assert_nil( | 
| 482 | 
            +
                  found_node = @root.find { |node| node.name == "Child4" }
         | 
| 483 | 
            +
                  assert_same(@child4, found_node, "The node should be Child 4")
         | 
| 484 | 
            +
                  found_node = @root.find { |node| node.name == "NOT PRESENT" }
         | 
| 485 | 
            +
                  assert_nil(found_node, "The node should not be found")
         | 
| 423 486 | 
             
                end
         | 
| 424 487 |  | 
| 425 488 | 
             
                # Test the parentage method.
         | 
| @@ -434,9 +497,10 @@ module TestTree | |
| 434 497 | 
             
                # Test the each method.
         | 
| 435 498 | 
             
                def test_each
         | 
| 436 499 | 
             
                  setup_test_tree
         | 
| 437 | 
            -
             | 
| 500 | 
            +
             | 
| 501 | 
            +
                  assert(@root.has_children?, "Should have children")
         | 
| 438 502 | 
             
                  assert_equal(5, @root.size, "Should have five nodes")
         | 
| 439 | 
            -
                  assert(@child3. | 
| 503 | 
            +
                  assert(@child3.has_children?, "Should have children")
         | 
| 440 504 |  | 
| 441 505 | 
             
                  nodes = []
         | 
| 442 506 | 
             
                  @root.each { |node| nodes << node }
         | 
| @@ -467,6 +531,7 @@ module TestTree | |
| 467 531 | 
             
                # Test the parent method.
         | 
| 468 532 | 
             
                def test_parent
         | 
| 469 533 | 
             
                  setup_test_tree
         | 
| 534 | 
            +
             | 
| 470 535 | 
             
                  assert_nil(@root.parent, "Root's parent should be nil")
         | 
| 471 536 | 
             
                  assert_equal(@root, @child1.parent, "Parent should be root")
         | 
| 472 537 | 
             
                  assert_equal(@root, @child3.parent, "Parent should be root")
         | 
| @@ -477,6 +542,7 @@ module TestTree | |
| 477 542 | 
             
                # Test the [] method.
         | 
| 478 543 | 
             
                def test_indexed_access
         | 
| 479 544 | 
             
                  setup_test_tree
         | 
| 545 | 
            +
             | 
| 480 546 | 
             
                  assert_equal(@child1, @root[0], "Should be the first child")
         | 
| 481 547 | 
             
                  assert_equal(@child4, @root[2][0], "Should be the grandchild")
         | 
| 482 548 | 
             
                  assert_nil(@root["TEST"], "Should be nil")
         | 
| @@ -484,11 +550,11 @@ module TestTree | |
| 484 550 | 
             
                  assert_raise(ArgumentError) { @root[nil] }
         | 
| 485 551 | 
             
                end
         | 
| 486 552 |  | 
| 487 | 
            -
                # Test the  | 
| 488 | 
            -
                def  | 
| 553 | 
            +
                # Test the print_tree method.
         | 
| 554 | 
            +
                def test_print_tree
         | 
| 489 555 | 
             
                  setup_test_tree
         | 
| 490 556 | 
             
                  #puts
         | 
| 491 | 
            -
                  #@root. | 
| 557 | 
            +
                  #@root.print_tree
         | 
| 492 558 | 
             
                end
         | 
| 493 559 |  | 
| 494 560 | 
             
                # Tests the binary dumping mechanism with an Object content node
         | 
| @@ -508,14 +574,14 @@ module TestTree | |
| 508 574 | 
             
                  # Test the root node
         | 
| 509 575 | 
             
                  assert_equal(test_root.name, new_root.name, "Must identify as ROOT")
         | 
| 510 576 | 
             
                  assert_equal(test_root.content, new_root.content, "Must have root's content")
         | 
| 511 | 
            -
                  assert(new_root. | 
| 512 | 
            -
                  assert(new_root. | 
| 577 | 
            +
                  assert(new_root.is_root?, "Must be the ROOT node")
         | 
| 578 | 
            +
                  assert(new_root.has_children?, "Must have a child node")
         | 
| 513 579 |  | 
| 514 580 | 
             
                  # Test the child node
         | 
| 515 581 | 
             
                  new_child = new_root[test_child.name]
         | 
| 516 582 | 
             
                  assert_equal(test_child.name, new_child.name, "Must have child 1")
         | 
| 517 | 
            -
                  assert(new_child. | 
| 518 | 
            -
                  assert(new_child. | 
| 583 | 
            +
                  assert(new_child.has_content?, "Child must have content")
         | 
| 584 | 
            +
                  assert(new_child.is_only_child?, "Child must be the only child")
         | 
| 519 585 |  | 
| 520 586 | 
             
                  new_child_content = new_child.content
         | 
| 521 587 | 
             
                  assert_equal(Hash, new_child_content.class, "Class of child's content should be a hash")
         | 
| @@ -524,8 +590,8 @@ module TestTree | |
| 524 590 | 
             
                  # Test the grand-child node
         | 
| 525 591 | 
             
                  new_grand_child = new_child[test_grand_child.name]
         | 
| 526 592 | 
             
                  assert_equal(test_grand_child.name, new_grand_child.name, "Must have grand child")
         | 
| 527 | 
            -
                  assert(new_grand_child. | 
| 528 | 
            -
                  assert(new_grand_child. | 
| 593 | 
            +
                  assert(new_grand_child.has_content?, "Grand-child must have content")
         | 
| 594 | 
            +
                  assert(new_grand_child.is_only_child?, "Grand-child must be the only child")
         | 
| 529 595 |  | 
| 530 596 | 
             
                  new_grand_child_content = new_grand_child.content
         | 
| 531 597 | 
             
                  assert_equal(Array, new_grand_child_content.class, "Class of grand-child's content should be an Array")
         | 
| @@ -539,19 +605,20 @@ module TestTree | |
| 539 605 | 
             
                # Test the collect method from the mixed-in Enumerable functionality.
         | 
| 540 606 | 
             
                def test_collect
         | 
| 541 607 | 
             
                  setup_test_tree
         | 
| 542 | 
            -
                   | 
| 608 | 
            +
                  collect_array = @root.collect do |node|
         | 
| 543 609 | 
             
                    node.content = "abc"
         | 
| 544 610 | 
             
                    node
         | 
| 545 611 | 
             
                  end
         | 
| 546 | 
            -
                   | 
| 612 | 
            +
                  collect_array.each {|node| assert_equal("abc", node.content, "Should be 'abc'")}
         | 
| 547 613 | 
             
                end
         | 
| 548 614 |  | 
| 549 615 | 
             
                # Test freezing the tree
         | 
| 550 | 
            -
                def  | 
| 616 | 
            +
                def test_freeze_tree_bang
         | 
| 551 617 | 
             
                  setup_test_tree
         | 
| 618 | 
            +
             | 
| 552 619 | 
             
                  @root.content = "ABC"
         | 
| 553 620 | 
             
                  assert_equal("ABC", @root.content, "Content should be 'ABC'")
         | 
| 554 | 
            -
                  @root. | 
| 621 | 
            +
                  @root.freeze_tree!
         | 
| 555 622 | 
             
                  # Note: The error raised here depends on the Ruby version.
         | 
| 556 623 | 
             
                  # For Ruby > 1.9, RuntimeError is raised
         | 
| 557 624 | 
             
                  # For Ruby ~ 1.8, TypeError is raised
         | 
| @@ -597,52 +664,53 @@ module TestTree | |
| 597 664 | 
             
                end
         | 
| 598 665 |  | 
| 599 666 | 
             
                # Test the height computation algorithm
         | 
| 600 | 
            -
                def  | 
| 601 | 
            -
                  assert_equal(0, @root. | 
| 667 | 
            +
                def test_node_height
         | 
| 668 | 
            +
                  assert_equal(0, @root.node_height, "A single node's height is 0")
         | 
| 602 669 |  | 
| 603 670 | 
             
                  @root << @child1
         | 
| 604 | 
            -
                  assert_equal(1, @root. | 
| 605 | 
            -
                  assert_equal(0, @child1. | 
| 671 | 
            +
                  assert_equal(1, @root.node_height, "This should be of height 1")
         | 
| 672 | 
            +
                  assert_equal(0, @child1.node_height, "This should be of height 0")
         | 
| 606 673 |  | 
| 607 674 | 
             
                  @root << @child2
         | 
| 608 | 
            -
                  assert_equal(1, @root. | 
| 609 | 
            -
                  assert_equal(0, @child2. | 
| 675 | 
            +
                  assert_equal(1, @root.node_height, "This should be of height 1")
         | 
| 676 | 
            +
                  assert_equal(0, @child2.node_height, "This should be of height 0")
         | 
| 610 677 |  | 
| 611 678 | 
             
                  @child2 << @child3
         | 
| 612 | 
            -
                  assert_equal(2, @root. | 
| 613 | 
            -
                  assert_equal(1, @child2. | 
| 614 | 
            -
                  assert_equal(0, @child3. | 
| 679 | 
            +
                  assert_equal(2, @root.node_height, "This should be of height 2")
         | 
| 680 | 
            +
                  assert_equal(1, @child2.node_height, "This should be of height 1")
         | 
| 681 | 
            +
                  assert_equal(0, @child3.node_height, "This should be of height 0")
         | 
| 615 682 |  | 
| 616 683 | 
             
                  @child3 << @child4
         | 
| 617 | 
            -
                  assert_equal(3, @root. | 
| 618 | 
            -
                  assert_equal(2, @child2. | 
| 619 | 
            -
                  assert_equal(1, @child3. | 
| 620 | 
            -
                  assert_equal(0, @child4. | 
| 684 | 
            +
                  assert_equal(3, @root.node_height, "This should be of height 3")
         | 
| 685 | 
            +
                  assert_equal(2, @child2.node_height, "This should be of height 2")
         | 
| 686 | 
            +
                  assert_equal(1, @child3.node_height, "This should be of height 1")
         | 
| 687 | 
            +
                  assert_equal(0, @child4.node_height, "This should be of height 0")
         | 
| 621 688 | 
             
                end
         | 
| 622 689 |  | 
| 623 690 | 
             
                # Test the depth computation algorithm.  Note that this is the correct depth computation.  The original
         | 
| 624 691 | 
             
                # Tree::TreeNode#depth was incorrectly computing the height of the node - instead of its depth.
         | 
| 625 | 
            -
                def  | 
| 626 | 
            -
                  assert_equal(0, @root. | 
| 692 | 
            +
                def test_node_depth
         | 
| 693 | 
            +
                  assert_equal(0, @root.node_depth, "A root node's depth is 0")
         | 
| 627 694 |  | 
| 628 695 | 
             
                  setup_test_tree
         | 
| 696 | 
            +
             | 
| 629 697 | 
             
                  for child in [@child1, @child2, @child3]
         | 
| 630 | 
            -
                    assert_equal(1, child. | 
| 698 | 
            +
                    assert_equal(1, child.node_depth, "Node #{child.name} should have depth 1")
         | 
| 631 699 | 
             
                  end
         | 
| 632 700 |  | 
| 633 | 
            -
                  assert_equal(2, @child4. | 
| 701 | 
            +
                  assert_equal(2, @child4.node_depth, "Child 4 should have depth 2")
         | 
| 634 702 | 
             
                end
         | 
| 635 703 |  | 
| 636 | 
            -
                # Test the level method.  Since this is an alias of  | 
| 704 | 
            +
                # Test the level method.  Since this is an alias of node_depth, we just test for equivalence
         | 
| 637 705 | 
             
                def test_level
         | 
| 638 706 | 
             
                  assert_equal(0, @root.level, "A root node's level is 0")
         | 
| 639 707 |  | 
| 640 | 
            -
                  assert_equal(@root. | 
| 708 | 
            +
                  assert_equal(@root.node_depth, @root.level, "Level and depth should be the same")
         | 
| 641 709 |  | 
| 642 710 | 
             
                  setup_test_tree
         | 
| 643 711 | 
             
                  for child in [@child1, @child2, @child3]
         | 
| 644 712 | 
             
                    assert_equal(1, child.level, "Node #{child.name} should have level 1")
         | 
| 645 | 
            -
                    assert_equal(@root. | 
| 713 | 
            +
                    assert_equal(@root.node_depth, @root.level, "Level and depth should be the same")
         | 
| 646 714 | 
             
                  end
         | 
| 647 715 |  | 
| 648 716 | 
             
                  assert_equal(2, @child4.level, "Child 4 should have level 2")
         | 
| @@ -742,36 +810,70 @@ module TestTree | |
| 742 810 | 
             
                def test_detached_copy
         | 
| 743 811 | 
             
                  setup_test_tree
         | 
| 744 812 |  | 
| 745 | 
            -
                  assert(@root. | 
| 813 | 
            +
                  assert(@root.has_children?, "The root should have children")
         | 
| 746 814 | 
             
                  copy_of_root = @root.detached_copy
         | 
| 747 | 
            -
                  assert(!copy_of_root. | 
| 815 | 
            +
                  assert(!copy_of_root.has_children?, "The copy should not have children")
         | 
| 748 816 | 
             
                  assert_equal(@root.name, copy_of_root.name, "The names should be equal")
         | 
| 749 817 |  | 
| 750 818 | 
             
                  # Try the same test with a child node
         | 
| 751 | 
            -
                  assert(!@child3. | 
| 752 | 
            -
                  assert(@child3. | 
| 819 | 
            +
                  assert(!@child3.is_root?, "Child 3 is not a root")
         | 
| 820 | 
            +
                  assert(@child3.has_children?, "Child 3 has children")
         | 
| 753 821 | 
             
                  copy_of_child3 = @child3.detached_copy
         | 
| 754 | 
            -
                  assert(copy_of_child3. | 
| 755 | 
            -
                  assert(!copy_of_child3. | 
| 822 | 
            +
                  assert(copy_of_child3.is_root?, "Child 3's copy is a root")
         | 
| 823 | 
            +
                  assert(!copy_of_child3.has_children?, "Child 3's copy does not have children")
         | 
| 756 824 | 
             
                end
         | 
| 757 825 |  | 
| 758 | 
            -
                # Test the  | 
| 759 | 
            -
                def  | 
| 826 | 
            +
                # Test the detached_subtree_copy method.
         | 
| 827 | 
            +
                def test_detached_subtree_copy
         | 
| 760 828 | 
             
                  setup_test_tree
         | 
| 761 | 
            -
             | 
| 829 | 
            +
             | 
| 830 | 
            +
                  assert(@root.has_children?, "The root should have children.")
         | 
| 831 | 
            +
                  tree_copy = @root.detached_subtree_copy
         | 
| 832 | 
            +
             | 
| 833 | 
            +
                  assert_equal(@root.name, tree_copy.name, "The names should be equal.")
         | 
| 834 | 
            +
                  assert_not_equal(@root.object_id, tree_copy.object_id, "Object_ids should differ.")
         | 
| 835 | 
            +
                  assert(tree_copy.is_root?, "Copied root should be a root node.")
         | 
| 836 | 
            +
                  assert(tree_copy.has_children?, "Copied tree should have children.")
         | 
| 837 | 
            +
                  assert_equal(tree_copy.children.count, @root.children.count, "Copied tree and the original tree should have same number of children.")
         | 
| 838 | 
            +
             | 
| 839 | 
            +
                  assert_equal(tree_copy[0].name, @child1.name, "The names of Child1 (original and copy) should be same.")
         | 
| 840 | 
            +
                  assert_not_equal(tree_copy[0].object_id, @child1.object_id, "Child1 Object_ids (original and copy) should differ.")
         | 
| 841 | 
            +
                  assert(!tree_copy[0].is_root?, "Child1 copied should not be root.")
         | 
| 842 | 
            +
                  assert(!tree_copy[0].has_children?, "Child1 copied should not have children.")
         | 
| 843 | 
            +
             | 
| 844 | 
            +
                  assert_equal(tree_copy[1].name, @child2.name, "The names of Child2 (original and copy) should be same.")
         | 
| 845 | 
            +
                  assert_not_equal(tree_copy[1].object_id, @child2.object_id, "Child2 Object_ids (original and copy) should differ.")
         | 
| 846 | 
            +
                  assert(!tree_copy[1].is_root?, "Child2 copied should not be root.")
         | 
| 847 | 
            +
                  assert(!tree_copy[1].has_children?, "Child2 copied should not have children.")
         | 
| 848 | 
            +
             | 
| 849 | 
            +
                  assert_equal(tree_copy[2].name, @child3.name, "The names of Child3 (original and copy) should be same.")
         | 
| 850 | 
            +
                  assert_not_equal(tree_copy[2].object_id, @child3.object_id, "Child3 Object_ids (original and copy) should differ.")
         | 
| 851 | 
            +
                  assert(!tree_copy[2].is_root?, "Child3 copied should not be root.")
         | 
| 852 | 
            +
                  assert(tree_copy[2].has_children?, "Child3 copied should have children.")
         | 
| 853 | 
            +
             | 
| 854 | 
            +
                  assert_equal(tree_copy[2][0].name, @child4.name, "The names of Child4 (original and copy) should be same.")
         | 
| 855 | 
            +
                  assert_not_equal(tree_copy[2][0].object_id, @child4.object_id, "Child4 Object_ids (original and copy) should differ.")
         | 
| 856 | 
            +
                  assert(!tree_copy[2][0].is_root?, "Child4 copied should not be root.")
         | 
| 857 | 
            +
                  assert(!tree_copy[2][0].has_children?, "Child4 copied should not have children.")
         | 
| 762 858 | 
             
                end
         | 
| 763 859 |  | 
| 764 | 
            -
                #  | 
| 765 | 
            -
                def  | 
| 860 | 
            +
                # Test the has_children? method.
         | 
| 861 | 
            +
                def test_has_children_eh
         | 
| 766 862 | 
             
                  setup_test_tree
         | 
| 767 | 
            -
                  assert( | 
| 768 | 
            -
                  assert(@child4.isLeaf?, "Child 4 is a leaf node")
         | 
| 863 | 
            +
                  assert(@root.has_children?, "The Root node MUST have children")
         | 
| 769 864 | 
             
                end
         | 
| 770 865 |  | 
| 771 | 
            -
                #  | 
| 772 | 
            -
                def  | 
| 866 | 
            +
                # test the is_leaf? method.
         | 
| 867 | 
            +
                def test_is_leaf_eh
         | 
| 773 868 | 
             
                  setup_test_tree
         | 
| 774 | 
            -
                  assert( | 
| 869 | 
            +
                  assert(!@child3.is_leaf?, "Child 3 is not a leaf node")
         | 
| 870 | 
            +
                  assert(@child4.is_leaf?, "Child 4 is a leaf node")
         | 
| 871 | 
            +
                end
         | 
| 872 | 
            +
             | 
| 873 | 
            +
                # Test the is_root? method.
         | 
| 874 | 
            +
                def test_is_root_eh
         | 
| 875 | 
            +
                  setup_test_tree
         | 
| 876 | 
            +
                  assert(@root.is_root?, "The ROOT node must respond as the root node")
         | 
| 775 877 | 
             
                end
         | 
| 776 878 |  | 
| 777 879 | 
             
                # Test the content= method.
         | 
| @@ -786,6 +888,7 @@ module TestTree | |
| 786 888 | 
             
                def test_size
         | 
| 787 889 | 
             
                  assert_equal(1, @root.size, "Root's size should be 1")
         | 
| 788 890 | 
             
                  setup_test_tree
         | 
| 891 | 
            +
             | 
| 789 892 | 
             
                  assert_equal(5, @root.size, "Root's size should be 5")
         | 
| 790 893 | 
             
                  assert_equal(2, @child3.size, "Child 3's size should be 2")
         | 
| 791 894 | 
             
                end
         | 
| @@ -798,7 +901,7 @@ module TestTree | |
| 798 901 | 
             
                  assert_not_nil(@root['Child1'], "Child 1 should have been added to Root")
         | 
| 799 902 | 
             
                  assert_not_nil(@root['Child2'], "Child 2 should have been added to Root")
         | 
| 800 903 | 
             
                  assert_not_nil(@root['Child3'], "Child 3 should have been added to Root")
         | 
| 801 | 
            -
                  assert_not_nil(@child3[' | 
| 904 | 
            +
                  assert_not_nil(@child3['Child4'], "Child 4 should have been added to Child3")
         | 
| 802 905 | 
             
                end
         | 
| 803 906 |  | 
| 804 907 | 
             
                # Test the [] method.
         | 
| @@ -809,11 +912,17 @@ module TestTree | |
| 809 912 | 
             
                  @root << @child2
         | 
| 810 913 | 
             
                  assert_equal(@child1.name, @root['Child1'].name, "Child 1 should be returned")
         | 
| 811 914 | 
             
                  assert_equal(@child1.name, @root[0].name, "Child 1 should be returned")
         | 
| 915 | 
            +
                  assert_equal(@child1.name, @root[-2].name, "Child 1 should be returned") # Negative access also works
         | 
| 916 | 
            +
                  assert_equal(@child1.name, @root[-(@root.children.size)].name, "Child 1 should be returned") # Negative access also works
         | 
| 917 | 
            +
             | 
| 812 918 | 
             
                  assert_equal(@child2.name, @root['Child2'].name, "Child 2 should be returned")
         | 
| 813 919 | 
             
                  assert_equal(@child2.name, @root[1].name, "Child 2 should be returned")
         | 
| 920 | 
            +
                  assert_equal(@child2.name, @root[-1].name, "Child 2 should be returned") # Negative access also works
         | 
| 814 921 |  | 
| 815 922 | 
             
                  assert_nil(@root['Some Random Name'], "Should return nil")
         | 
| 816 923 | 
             
                  assert_nil(@root[99], "Should return nil")
         | 
| 924 | 
            +
                  assert_nil(@root[-(@root.children.size+1)], "Should return nil")
         | 
| 925 | 
            +
                  assert_nil(@root[-3], "Should return nil")
         | 
| 817 926 | 
             
                end
         | 
| 818 927 |  | 
| 819 928 | 
             
                # Test the in_degree method.
         | 
| @@ -854,7 +963,7 @@ module TestTree | |
| 854 963 | 
             
                        "content"      => "Child Node 3",
         | 
| 855 964 | 
             
                        JSON.create_id => "Tree::TreeNode",
         | 
| 856 965 | 
             
                        "children" => [
         | 
| 857 | 
            -
                          {"name" => " | 
| 966 | 
            +
                          {"name" => "Child4", "content" => "Grand Child 1", JSON.create_id => "Tree::TreeNode"}
         | 
| 858 967 | 
             
                        ]
         | 
| 859 968 | 
             
                      }
         | 
| 860 969 | 
             
                    ]
         | 
| @@ -876,7 +985,7 @@ module TestTree | |
| 876 985 | 
             
                        "content"      => "Child Node 3",
         | 
| 877 986 | 
             
                        JSON.create_id => "Tree::TreeNode",
         | 
| 878 987 | 
             
                        "children" => [
         | 
| 879 | 
            -
                          {"name" => " | 
| 988 | 
            +
                          {"name" => "Child4", "content" => "Grand Child 1", JSON.create_id => "Tree::TreeNode"}
         | 
| 880 989 | 
             
                        ]
         | 
| 881 990 | 
             
                      }
         | 
| 882 991 | 
             
                    ]
         | 
| @@ -890,6 +999,53 @@ module TestTree | |
| 890 999 | 
             
                  assert_equal(@child3.name, tree[2].name, "Child 3 should be returned")
         | 
| 891 1000 | 
             
                  assert_equal(@child4.name, tree[2][0].name, "Grand Child 1 should be returned")
         | 
| 892 1001 | 
             
                end
         | 
| 1002 | 
            +
             | 
| 1003 | 
            +
                def test_json_roundtrip
         | 
| 1004 | 
            +
                  root_node = Tree::TreeNode.new("RTROOT", "Root Content")
         | 
| 1005 | 
            +
                  root_node << Tree::TreeNode.new("RTCHILD1", "Child1 Content") << Tree::TreeNode.new("RTGRANDCHILD1", "GrandChild1 Content")
         | 
| 1006 | 
            +
                  root_node << Tree::TreeNode.new("RTCHILD2", "Child2 Content")
         | 
| 1007 | 
            +
             | 
| 1008 | 
            +
                  j = root_node.to_json
         | 
| 1009 | 
            +
             | 
| 1010 | 
            +
                  k = JSON.parse(j)
         | 
| 1011 | 
            +
             | 
| 1012 | 
            +
                  assert_equal(k.name, root_node.name, "Root should be returned")
         | 
| 1013 | 
            +
                  assert_equal(k[0].name, root_node[0].name, "Child 1 should be returned")
         | 
| 1014 | 
            +
                  assert_equal(k[0][0].name, root_node[0][0].name, "Grand Child 1 should be returned")
         | 
| 1015 | 
            +
                  assert_equal(k[1].name, root_node[1].name, "Child 2 should be returned")
         | 
| 1016 | 
            +
                end
         | 
| 1017 | 
            +
             | 
| 1018 | 
            +
                # Test the old CamelCase method names
         | 
| 1019 | 
            +
                def test_old_camelCase_method_names
         | 
| 1020 | 
            +
                  setup_test_tree
         | 
| 1021 | 
            +
             | 
| 1022 | 
            +
                  meth_names_to_test = %w{isRoot? isLeaf? hasContent?
         | 
| 1023 | 
            +
                                          hasChildren? setAsRoot! firstChild lastChild
         | 
| 1024 | 
            +
                                          firstSibling isFirstSibling? lastSibling isLastSibling?
         | 
| 1025 | 
            +
                                          isOnlyChild? nextSibling previousSibling nodeHeight nodeDepth
         | 
| 1026 | 
            +
                                          createDumpRep removeFromParent! removeAll! freezeTree! }
         | 
| 1027 | 
            +
             | 
| 1028 | 
            +
                  require 'structured_warnings'
         | 
| 1029 | 
            +
             | 
| 1030 | 
            +
                  DeprecatedMethodWarning.disable do
         | 
| 1031 | 
            +
                    assert(@root.isRoot?)   # Test if the original method is really called
         | 
| 1032 | 
            +
                  end
         | 
| 1033 | 
            +
             | 
| 1034 | 
            +
                  meth_names_to_test.each do |meth_name|
         | 
| 1035 | 
            +
                    assert_warn(DeprecatedMethodWarning) {@root.send(meth_name)}
         | 
| 1036 | 
            +
                  end
         | 
| 1037 | 
            +
             | 
| 1038 | 
            +
                    # Special Case for printTree to avoid putting stuff on the STDOUT during the unit test.
         | 
| 1039 | 
            +
                  begin
         | 
| 1040 | 
            +
                    require 'stringio'
         | 
| 1041 | 
            +
                    $stdout = StringIO.new
         | 
| 1042 | 
            +
                    assert_warn(DeprecatedMethodWarning) { @root.send('printTree') }
         | 
| 1043 | 
            +
                  ensure
         | 
| 1044 | 
            +
                    $stdout = STDOUT
         | 
| 1045 | 
            +
                  end
         | 
| 1046 | 
            +
             | 
| 1047 | 
            +
                end
         | 
| 1048 | 
            +
             | 
| 893 1049 | 
             
              end
         | 
| 894 1050 | 
             
            end
         | 
| 895 1051 |  |