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
|
|