rubytree 0.9.7 → 1.0.0
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.
- checksums.yaml +4 -4
- data/Gemfile +4 -4
- data/Gemfile.lock +37 -52
- data/README.md +5 -5
- data/Rakefile +19 -19
- data/examples/example_basic.rb +5 -5
- data/lib/rubytree.rb +1 -1
- data/lib/tree.rb +55 -50
- data/lib/tree/binarytree.rb +10 -7
- data/lib/tree/tree_deps.rb +8 -8
- data/lib/tree/utils/camel_case_method_handler.rb +10 -9
- data/lib/tree/utils/hash_converter.rb +6 -4
- data/lib/tree/utils/json_converter.rb +13 -9
- data/lib/tree/utils/metrics_methods.rb +8 -6
- data/lib/tree/utils/path_methods.rb +7 -5
- data/lib/tree/utils/tree_merge_handler.rb +5 -4
- data/lib/tree/utils/utils.rb +3 -0
- data/lib/tree/version.rb +2 -2
- data/spec/spec_helper.rb +1 -1
- data/spec/tree_spec.rb +17 -17
- data/test/run_test.rb +6 -6
- data/test/test_binarytree.rb +84 -82
- data/test/test_rubytree_require.rb +2 -2
- data/test/test_subclassed_node.rb +13 -12
- data/test/test_thread_and_fiber.rb +3 -3
- data/test/test_tree.rb +479 -484
- metadata +19 -23
- data/TAGS +0 -248
- data/gem_graph.png +0 -0
- data/rubytree.gemspec +0 -90
- data/setup.rb +0 -1585
data/test/test_tree.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
# test_tree.rb - This file is part of the RubyTree package.
|
4
4
|
#
|
5
|
-
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Anupam Sengupta
|
5
|
+
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2017 Anupam Sengupta
|
6
6
|
#
|
7
7
|
# All rights reserved.
|
8
8
|
#
|
@@ -33,11 +33,13 @@
|
|
33
33
|
#
|
34
34
|
|
35
35
|
require 'test/unit'
|
36
|
+
require 'structured_warnings'
|
36
37
|
require 'json'
|
37
|
-
|
38
|
+
require_relative '../lib/tree/tree_deps'
|
38
39
|
|
39
40
|
module TestTree
|
40
41
|
# Test class for the Tree node.
|
42
|
+
# noinspection RubyTooManyInstanceVariablesInspection
|
41
43
|
class TestTreeNode < Test::Unit::TestCase
|
42
44
|
|
43
45
|
Person = Struct::new(:First, :last) # A simple structure to use as the content for the nodes.
|
@@ -63,13 +65,13 @@ module TestTree
|
|
63
65
|
#
|
64
66
|
# Some basic setup to create the nodes for the test tree.
|
65
67
|
def setup
|
66
|
-
@root = Tree::TreeNode.new(
|
68
|
+
@root = Tree::TreeNode.new('ROOT', 'Root Node')
|
67
69
|
|
68
|
-
@child1 = Tree::TreeNode.new(
|
69
|
-
@child2 = Tree::TreeNode.new(
|
70
|
-
@child3 = Tree::TreeNode.new(
|
71
|
-
@child4 = Tree::TreeNode.new(
|
72
|
-
@child5 = Tree::TreeNode.new(
|
70
|
+
@child1 = Tree::TreeNode.new('Child1', 'Child Node 1')
|
71
|
+
@child2 = Tree::TreeNode.new('Child2', 'Child Node 2')
|
72
|
+
@child3 = Tree::TreeNode.new('Child3', 'Child Node 3')
|
73
|
+
@child4 = Tree::TreeNode.new('Child4', 'Grand Child 1')
|
74
|
+
@child5 = Tree::TreeNode.new('Child5', 'Child Node 4')
|
73
75
|
|
74
76
|
end
|
75
77
|
|
@@ -92,17 +94,17 @@ module TestTree
|
|
92
94
|
|
93
95
|
# This test is for the root alone - without any children being linked
|
94
96
|
def test_root_setup
|
95
|
-
assert_not_nil(@root ,
|
96
|
-
assert_nil(@root.parent ,
|
97
|
-
assert_not_nil(@root.name ,
|
98
|
-
assert_equal(
|
99
|
-
assert_equal(
|
100
|
-
assert(@root.is_root? ,
|
101
|
-
assert(!@root.has_children? ,
|
102
|
-
assert(@root.has_content? ,
|
103
|
-
assert_equal(1 , @root.size,
|
104
|
-
assert_equal(0, @root.siblings.length,
|
105
|
-
assert_equal(0, @root.in_degree,
|
97
|
+
assert_not_nil(@root , 'Root cannot be nil')
|
98
|
+
assert_nil(@root.parent , 'Parent of root node should be nil')
|
99
|
+
assert_not_nil(@root.name , 'Name should not be nil')
|
100
|
+
assert_equal('ROOT', @root.name, "Name should be 'ROOT'")
|
101
|
+
assert_equal('Root Node', @root.content, "Content should be 'Root Node'")
|
102
|
+
assert(@root.is_root? , 'Should identify as root')
|
103
|
+
assert(!@root.has_children? , 'Cannot have any children')
|
104
|
+
assert(@root.has_content? , 'This root should have content')
|
105
|
+
assert_equal(1 , @root.size, 'Number of nodes should be one')
|
106
|
+
assert_equal(0, @root.siblings.length, 'This root does not have any children')
|
107
|
+
assert_equal(0, @root.in_degree, 'Root should have an in-degree of 0')
|
106
108
|
assert_equal(0, @root.node_height, "Root's height before adding any children is 0")
|
107
109
|
assert_raise(ArgumentError) { Tree::TreeNode.new(nil) }
|
108
110
|
end
|
@@ -115,8 +117,8 @@ module TestTree
|
|
115
117
|
# return nil so that the possibility of a recursive error does not exist
|
116
118
|
# at all.
|
117
119
|
assert_same(@root , @root.root, "Root's root is self")
|
118
|
-
assert_same(@root , @child1.root,
|
119
|
-
assert_same(@root , @child4.root,
|
120
|
+
assert_same(@root , @child1.root, 'Root should be ROOT')
|
121
|
+
assert_same(@root , @child4.root, 'Root should be ROOT')
|
120
122
|
assert_equal(2 , @root.node_height, "Root's height after adding the children should be 2")
|
121
123
|
end
|
122
124
|
|
@@ -129,18 +131,18 @@ module TestTree
|
|
129
131
|
# / \
|
130
132
|
# H I
|
131
133
|
|
132
|
-
hash = {[:A,
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
134
|
+
hash = {[:A, 'Root content'] => {
|
135
|
+
B: {
|
136
|
+
E: {},
|
137
|
+
F: {
|
138
|
+
H: {},
|
139
|
+
[:I, 'Leaf content'] => {}
|
140
|
+
}
|
141
|
+
},
|
142
|
+
C: {},
|
143
|
+
D: {
|
144
|
+
G: {}
|
145
|
+
}
|
144
146
|
}
|
145
147
|
}
|
146
148
|
|
@@ -151,11 +153,11 @@ module TestTree
|
|
151
153
|
assert_equal(true, tree.is_root?)
|
152
154
|
assert_equal(false, tree.is_leaf?)
|
153
155
|
assert_equal(9, tree.size)
|
154
|
-
assert_equal(
|
156
|
+
assert_equal('Root content', tree.content)
|
155
157
|
assert_equal(3, tree.children.count) # B, C, D
|
156
158
|
|
157
159
|
leaf_with_content = tree[:B][:F][:I]
|
158
|
-
assert_equal(
|
160
|
+
assert_equal('Leaf content', leaf_with_content.content)
|
159
161
|
assert_equal(true, leaf_with_content.is_leaf?)
|
160
162
|
|
161
163
|
leaf_without_content = tree[:C]
|
@@ -168,7 +170,7 @@ module TestTree
|
|
168
170
|
# Can't make a node without a name
|
169
171
|
assert_raise (ArgumentError) { Tree::TreeNode.from_hash({}) }
|
170
172
|
# Can't have multiple roots
|
171
|
-
assert_raise (ArgumentError) { Tree::TreeNode.from_hash({:
|
173
|
+
assert_raise (ArgumentError) { Tree::TreeNode.from_hash({A: {}, B: {}}) }
|
172
174
|
|
173
175
|
end
|
174
176
|
|
@@ -181,18 +183,18 @@ module TestTree
|
|
181
183
|
# / \
|
182
184
|
# H I
|
183
185
|
|
184
|
-
hash = {[:A,
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
186
|
+
hash = {[:A, 'Root content'] => {
|
187
|
+
B: {
|
188
|
+
E: nil,
|
189
|
+
F: {
|
190
|
+
H: nil,
|
191
|
+
[:I, 'Leaf content'] => nil
|
192
|
+
}
|
193
|
+
},
|
194
|
+
C: nil,
|
195
|
+
D: {
|
196
|
+
G: nil
|
197
|
+
}
|
196
198
|
}
|
197
199
|
}
|
198
200
|
|
@@ -203,11 +205,11 @@ module TestTree
|
|
203
205
|
assert_equal(true, tree.is_root?)
|
204
206
|
assert_equal(false, tree.is_leaf?)
|
205
207
|
assert_equal(9, tree.size)
|
206
|
-
assert_equal(
|
208
|
+
assert_equal('Root content', tree.content)
|
207
209
|
assert_equal(3, tree.children.count) # B, C, D
|
208
210
|
|
209
211
|
leaf_with_content = tree[:B][:F][:I]
|
210
|
-
assert_equal(
|
212
|
+
assert_equal('Leaf content', leaf_with_content.content)
|
211
213
|
assert_equal(true, leaf_with_content.is_leaf?)
|
212
214
|
|
213
215
|
leaf_without_content = tree[:C]
|
@@ -226,7 +228,7 @@ module TestTree
|
|
226
228
|
assert_equal([], tree.add_from_hash(hash))
|
227
229
|
|
228
230
|
# Okay, now try a real hash
|
229
|
-
hash = {:
|
231
|
+
hash = {B: {C: {D: nil}, E: {}, F: {}}, [:G, 'G content'] => {}}
|
230
232
|
# A
|
231
233
|
# / \
|
232
234
|
# B G
|
@@ -239,14 +241,14 @@ module TestTree
|
|
239
241
|
assert_equal(Array, added_children.class)
|
240
242
|
assert_equal(2, added_children.count)
|
241
243
|
assert_equal(7, tree.size)
|
242
|
-
assert_equal(
|
244
|
+
assert_equal('G content', tree[:G].content)
|
243
245
|
assert_equal(true, tree[:G].is_leaf?)
|
244
246
|
assert_equal(5, tree[:B].size)
|
245
247
|
assert_equal(3, tree[:B].children.count)
|
246
248
|
|
247
249
|
assert_raise (ArgumentError) { tree.add_from_hash([]) }
|
248
|
-
assert_raise (ArgumentError) { tree.add_from_hash(
|
249
|
-
assert_raise (ArgumentError) { tree.add_from_hash({:
|
250
|
+
assert_raise (ArgumentError) { tree.add_from_hash('not a hash') }
|
251
|
+
assert_raise (ArgumentError) { tree.add_from_hash({X: 'Not a hash or nil'}) }
|
250
252
|
end
|
251
253
|
|
252
254
|
# Test exporting to ruby Hash
|
@@ -254,7 +256,7 @@ module TestTree
|
|
254
256
|
a = Tree::TreeNode.new(:A)
|
255
257
|
b = Tree::TreeNode.new(:B)
|
256
258
|
c = Tree::TreeNode.new(:C)
|
257
|
-
d = Tree::TreeNode.new(:D)
|
259
|
+
# d = Tree::TreeNode.new(:D)
|
258
260
|
e = Tree::TreeNode.new(:E)
|
259
261
|
f = Tree::TreeNode.new(:F)
|
260
262
|
g = Tree::TreeNode.new(:G)
|
@@ -271,7 +273,7 @@ module TestTree
|
|
271
273
|
b << e
|
272
274
|
|
273
275
|
exported = a.to_h
|
274
|
-
expected = {:
|
276
|
+
expected = {A: {B: {E: {}}, C: {F: {}, G: {}}}}
|
275
277
|
assert_equal(expected, exported)
|
276
278
|
end
|
277
279
|
|
@@ -285,7 +287,7 @@ module TestTree
|
|
285
287
|
# |\ |
|
286
288
|
# I J K
|
287
289
|
|
288
|
-
input = {:
|
290
|
+
input = {A: {B: {E: {I: {}, J: {}}, F: {}, G: {}}, C: {H: {K: {}}}}}
|
289
291
|
|
290
292
|
node = Tree::TreeNode.from_hash(input)
|
291
293
|
assert_equal(input, node.to_h)
|
@@ -293,25 +295,25 @@ module TestTree
|
|
293
295
|
|
294
296
|
# Test the presence of content in the nodes.
|
295
297
|
def test_has_content_eh
|
296
|
-
a_node = Tree::TreeNode.new(
|
297
|
-
assert_nil(a_node.content ,
|
298
|
-
assert(!a_node.has_content? ,
|
298
|
+
a_node = Tree::TreeNode.new('A Node')
|
299
|
+
assert_nil(a_node.content , 'The node should not have content')
|
300
|
+
assert(!a_node.has_content? , 'The node should not have content')
|
299
301
|
|
300
|
-
a_node.content =
|
301
|
-
assert_not_nil(a_node.content,
|
302
|
-
assert(a_node.has_content?,
|
302
|
+
a_node.content = 'Something'
|
303
|
+
assert_not_nil(a_node.content, 'The node should now have content')
|
304
|
+
assert(a_node.has_content?, 'The node should now have content')
|
303
305
|
end
|
304
306
|
|
305
307
|
# Test the equivalence of size and length methods.
|
306
308
|
def test_length_is_size
|
307
309
|
setup_test_tree
|
308
|
-
assert_equal(@root.size, @root.length,
|
310
|
+
assert_equal(@root.size, @root.length, 'Length and size methods should return the same result')
|
309
311
|
end
|
310
312
|
|
311
313
|
# Test the <=> operator.
|
312
314
|
def test_spaceship
|
313
315
|
require 'structured_warnings'
|
314
|
-
StandardWarning.disable # Disable the warnings for using integers as node names
|
316
|
+
StructuredWarnings::StandardWarning.disable # Disable the warnings for using integers as node names
|
315
317
|
|
316
318
|
first_node = Tree::TreeNode.new(1)
|
317
319
|
second_node = Tree::TreeNode.new(2)
|
@@ -322,66 +324,66 @@ module TestTree
|
|
322
324
|
second_node = Tree::TreeNode.new(1)
|
323
325
|
assert_equal(0, first_node <=> second_node)
|
324
326
|
|
325
|
-
first_node = Tree::TreeNode.new(
|
326
|
-
second_node = Tree::TreeNode.new(
|
327
|
+
first_node = Tree::TreeNode.new('ABC')
|
328
|
+
second_node = Tree::TreeNode.new('XYZ')
|
327
329
|
|
328
330
|
assert_nil(first_node <=> nil)
|
329
331
|
assert_equal(-1, first_node <=> second_node)
|
330
332
|
|
331
|
-
second_node = Tree::TreeNode.new(
|
333
|
+
second_node = Tree::TreeNode.new('ABC')
|
332
334
|
assert_equal(0, first_node <=> second_node)
|
333
335
|
|
334
|
-
StandardWarning.enable
|
336
|
+
StructuredWarnings::StandardWarning.enable
|
335
337
|
end
|
336
338
|
|
337
339
|
# Test the inclusion of Comparable
|
338
340
|
def test_is_comparable
|
339
|
-
|
340
|
-
|
341
|
-
|
341
|
+
node_a = Tree::TreeNode.new('NodeA', 'Some Content')
|
342
|
+
node_b = Tree::TreeNode.new('NodeB', 'Some Content')
|
343
|
+
node_c = Tree::TreeNode.new('NodeC', 'Some Content')
|
342
344
|
|
343
345
|
# Check if the nodes compare correctly
|
344
|
-
assert(
|
345
|
-
assert(
|
346
|
-
assert(
|
347
|
-
assert(
|
346
|
+
assert(node_a < node_b, "Node A is lexically 'less than' node B")
|
347
|
+
assert(node_a <= node_b, "Node A is lexically 'less than' node B")
|
348
|
+
assert(node_b > node_a, "Node B is lexically 'greater than' node A")
|
349
|
+
assert(node_b >= node_a, "Node B is lexically 'greater than' node A")
|
348
350
|
|
349
|
-
assert(!(
|
350
|
-
assert(
|
351
|
+
assert(!(node_a == node_b), 'Node A and Node B are not equal')
|
352
|
+
assert(node_b.between?(node_a, node_c), 'Node B is lexically between node A and node C')
|
351
353
|
|
352
354
|
|
353
355
|
end
|
354
356
|
|
355
357
|
# Test the to_s method. This is probably a little fragile right now.
|
356
358
|
def test_to_s
|
357
|
-
a_node = Tree::TreeNode.new(
|
359
|
+
a_node = Tree::TreeNode.new('A Node', 'Some Content')
|
358
360
|
|
359
|
-
expected_string =
|
361
|
+
expected_string = 'Node Name: A Node Content: Some Content Parent: <None> Children: 0 Total Nodes: 1'
|
360
362
|
|
361
|
-
assert_equal(expected_string, a_node.to_s,
|
363
|
+
assert_equal(expected_string, a_node.to_s, 'The string representation should be same')
|
362
364
|
|
363
365
|
# Now test with a symbol as a key.
|
364
|
-
a_node = Tree::TreeNode.new(:Node_Name,
|
365
|
-
expected_string =
|
366
|
-
assert_equal(expected_string, a_node.to_s,
|
366
|
+
a_node = Tree::TreeNode.new(:Node_Name, 'Some Content')
|
367
|
+
expected_string = 'Node Name: Node_Name Content: Some Content Parent: <None> Children: 0 Total Nodes: 1'
|
368
|
+
assert_equal(expected_string, a_node.to_s, 'The string representation should be same')
|
367
369
|
|
368
370
|
# Now test with a symbol as a key and another symbol as the content.
|
369
371
|
a_node = Tree::TreeNode.new(:Node_Name, :Content)
|
370
|
-
expected_string =
|
371
|
-
assert_equal(expected_string, a_node.to_s,
|
372
|
+
expected_string = 'Node Name: Node_Name Content: Content Parent: <None> Children: 0 Total Nodes: 1'
|
373
|
+
assert_equal(expected_string, a_node.to_s, 'The string representation should be same')
|
372
374
|
|
373
375
|
# Now test with a symbol as a key, and a hash as the content.
|
374
|
-
a_hash = {:
|
376
|
+
a_hash = {a_key: 'Some Value'}
|
375
377
|
a_node = Tree::TreeNode.new(:Node_Name, a_hash)
|
376
378
|
expected_string = "Node Name: Node_Name Content: #{a_hash} Parent: <None> Children: 0 Total Nodes: 1"
|
377
|
-
assert_equal(expected_string, a_node.to_s,
|
379
|
+
assert_equal(expected_string, a_node.to_s, 'The string representation should be same')
|
378
380
|
|
379
381
|
# Lets now add a child to the previous node, and test the to_s for the child
|
380
|
-
child_node = Tree::TreeNode.new(:Child_node,
|
382
|
+
child_node = Tree::TreeNode.new(:Child_node, 'Child Node')
|
381
383
|
a_node << child_node
|
382
384
|
|
383
|
-
expected_string =
|
384
|
-
assert_equal(expected_string, child_node.to_s,
|
385
|
+
expected_string = 'Node Name: Child_node Content: Child Node Parent: Node_Name Children: 0 Total Nodes: 1'
|
386
|
+
assert_equal(expected_string, child_node.to_s, 'The string representation should be same')
|
385
387
|
|
386
388
|
end
|
387
389
|
|
@@ -404,8 +406,8 @@ module TestTree
|
|
404
406
|
|
405
407
|
assert(@root.is_first_sibling?, "Root's first sibling is itself")
|
406
408
|
assert( @child1.is_first_sibling?, "Child1's first sibling is itself")
|
407
|
-
assert(!@child2.is_first_sibling?,
|
408
|
-
assert(!@child3.is_first_sibling?,
|
409
|
+
assert(!@child2.is_first_sibling?, 'Child2 is not the first sibling')
|
410
|
+
assert(!@child3.is_first_sibling?, 'Child3 is not the first sibling')
|
409
411
|
assert( @child4.is_first_sibling?, "Child4's first sibling is itself")
|
410
412
|
end
|
411
413
|
|
@@ -414,8 +416,8 @@ module TestTree
|
|
414
416
|
setup_test_tree
|
415
417
|
|
416
418
|
assert(@root.is_last_sibling?, "Root's last sibling is itself")
|
417
|
-
assert(!@child1.is_last_sibling?,
|
418
|
-
assert(!@child2.is_last_sibling?,
|
419
|
+
assert(!@child1.is_last_sibling?, 'Child1 is not the last sibling')
|
420
|
+
assert(!@child2.is_last_sibling?, 'Child2 is not the last sibling')
|
419
421
|
assert( @child3.is_last_sibling?, "Child3's last sibling is itself")
|
420
422
|
assert( @child4.is_last_sibling?, "Child4's last sibling is itself")
|
421
423
|
end
|
@@ -441,22 +443,22 @@ module TestTree
|
|
441
443
|
result = @child1.siblings { |sibling| siblings << sibling}
|
442
444
|
|
443
445
|
assert_equal(@child1, result)
|
444
|
-
assert_equal(2, siblings.length,
|
445
|
-
assert(siblings.include?(@child2),
|
446
|
-
assert(siblings.include?(@child3),
|
446
|
+
assert_equal(2, siblings.length, 'Should have two siblings')
|
447
|
+
assert(siblings.include?(@child2), 'Should have 2nd child as sibling')
|
448
|
+
assert(siblings.include?(@child3), 'Should have 3rd child as sibling')
|
447
449
|
|
448
450
|
siblings.clear
|
449
451
|
siblings = @child1.siblings
|
450
452
|
assert_equal(Array, siblings.class)
|
451
|
-
assert_equal(2, siblings.length,
|
453
|
+
assert_equal(2, siblings.length, 'Should have two siblings')
|
452
454
|
|
453
455
|
siblings.clear
|
454
456
|
@child4.siblings {|sibling| siblings << sibling}
|
455
|
-
assert(siblings.empty?,
|
457
|
+
assert(siblings.empty?, 'Should not have any siblings')
|
456
458
|
|
457
459
|
siblings.clear
|
458
460
|
siblings = @root.siblings
|
459
|
-
assert_equal(0, siblings.length,
|
461
|
+
assert_equal(0, siblings.length, 'Root should not have any siblings')
|
460
462
|
|
461
463
|
end
|
462
464
|
|
@@ -464,51 +466,51 @@ module TestTree
|
|
464
466
|
def test_is_only_child_eh
|
465
467
|
setup_test_tree
|
466
468
|
|
467
|
-
assert(
|
468
|
-
assert(!@child1.is_only_child?,
|
469
|
-
assert(!@child2.is_only_child?,
|
470
|
-
assert(!@child3.is_only_child?,
|
471
|
-
assert(
|
469
|
+
assert(@root.is_only_child? , 'Root is an only child')
|
470
|
+
assert(!@child1.is_only_child?, 'Child1 is not the only child')
|
471
|
+
assert(!@child2.is_only_child?, 'Child2 is not the only child')
|
472
|
+
assert(!@child3.is_only_child?, 'Child3 is not the only child')
|
473
|
+
assert(@child4.is_only_child?, 'Child4 is an only child')
|
472
474
|
end
|
473
475
|
|
474
476
|
# Test the next_sibling method.
|
475
477
|
def test_next_sibling
|
476
478
|
setup_test_tree
|
477
479
|
|
478
|
-
assert_nil(@root.next_sibling,
|
480
|
+
assert_nil(@root.next_sibling, 'Root does not have any next sibling')
|
479
481
|
assert_equal(@child2, @child1.next_sibling, "Child1's next sibling is Child2")
|
480
482
|
assert_equal(@child3, @child2.next_sibling, "Child2's next sibling is Child3")
|
481
|
-
assert_nil(@child3.next_sibling,
|
482
|
-
assert_nil(@child4.next_sibling,
|
483
|
+
assert_nil(@child3.next_sibling, 'Child3 does not have a next sibling')
|
484
|
+
assert_nil(@child4.next_sibling, 'Child4 does not have a next sibling')
|
483
485
|
end
|
484
486
|
|
485
487
|
# Test the previous_sibling method.
|
486
488
|
def test_previous_sibling
|
487
489
|
setup_test_tree
|
488
490
|
|
489
|
-
assert_nil(@root.previous_sibling,
|
490
|
-
assert_nil(@child1.previous_sibling,
|
491
|
+
assert_nil(@root.previous_sibling, 'Root does not have any previous sibling')
|
492
|
+
assert_nil(@child1.previous_sibling, 'Child1 does not have previous sibling')
|
491
493
|
assert_equal(@child1, @child2.previous_sibling, "Child2's previous sibling is Child1")
|
492
494
|
assert_equal(@child2, @child3.previous_sibling, "Child3's previous sibling is Child2")
|
493
|
-
assert_nil(@child4.previous_sibling,
|
495
|
+
assert_nil(@child4.previous_sibling, 'Child4 does not have a previous sibling')
|
494
496
|
end
|
495
497
|
|
496
498
|
# Test the add method.
|
497
499
|
def test_add
|
498
|
-
assert(!@root.has_children?,
|
500
|
+
assert(!@root.has_children?, 'Should not have any children')
|
499
501
|
|
500
|
-
assert_equal(1, @root.size,
|
502
|
+
assert_equal(1, @root.size, 'Should have 1 node (the root)')
|
501
503
|
@root.add(@child1)
|
502
504
|
|
503
505
|
@root << @child2
|
504
506
|
|
505
|
-
assert(@root.has_children?,
|
506
|
-
assert_equal(3, @root.size,
|
507
|
+
assert(@root.has_children?, 'Should have children')
|
508
|
+
assert_equal(3, @root.size, 'Should have three nodes')
|
507
509
|
|
508
510
|
@root << @child3 << @child4
|
509
511
|
|
510
|
-
assert_equal(5, @root.size,
|
511
|
-
assert_equal(2, @child3.size,
|
512
|
+
assert_equal(5, @root.size, 'Should have five nodes')
|
513
|
+
assert_equal(2, @child3.size, 'Should have two nodes')
|
512
514
|
|
513
515
|
# Test the addition of a nil node.
|
514
516
|
assert_raise(ArgumentError) { @root.add(nil) }
|
@@ -528,11 +530,11 @@ module TestTree
|
|
528
530
|
#
|
529
531
|
# In this case, the two 'deep' nodes should not be considered duplicates
|
530
532
|
|
531
|
-
root = Tree::TreeNode.new(
|
532
|
-
one = Tree::TreeNode.new(
|
533
|
-
two = Tree::TreeNode.new(
|
534
|
-
three= Tree::TreeNode.new(
|
535
|
-
deep = Tree::TreeNode.new(
|
533
|
+
root = Tree::TreeNode.new('root')
|
534
|
+
one = Tree::TreeNode.new('one')
|
535
|
+
two = Tree::TreeNode.new('two')
|
536
|
+
three= Tree::TreeNode.new('three')
|
537
|
+
deep = Tree::TreeNode.new('deep')
|
536
538
|
|
537
539
|
root << one << deep
|
538
540
|
# The same child cannot be added under any circumstance
|
@@ -542,25 +544,25 @@ module TestTree
|
|
542
544
|
begin
|
543
545
|
root << two << deep
|
544
546
|
rescue RuntimeError => e
|
545
|
-
fail("Error! The RuntimeError should not have been thrown. The same node can be added to different branches.")
|
547
|
+
fail("Error! The RuntimeError #{e} should not have been thrown. The same node can be added to different branches.")
|
546
548
|
end
|
547
549
|
|
548
550
|
assert_raise(ArgumentError) {root << three << three }
|
549
551
|
|
550
|
-
root.remove_all! # Because the first child 'three'
|
552
|
+
root.remove_all! # Because the first child 'three' would have been added.
|
551
553
|
begin
|
552
|
-
three_dup = Tree::TreeNode.new(
|
554
|
+
three_dup = Tree::TreeNode.new('three')
|
553
555
|
root << three << three_dup
|
554
556
|
rescue RuntimeError => e
|
555
|
-
fail("Error! The RuntimeError should not have been thrown. The same node name can be used in the branch.")
|
557
|
+
fail("Error! The RuntimeError #{e} should not have been thrown. The same node name can be used in the branch.")
|
556
558
|
end
|
557
559
|
end
|
558
560
|
|
559
561
|
# Test Addition at a specific position
|
560
562
|
def test_add_at_specific_position
|
561
|
-
assert(!@root.has_children?,
|
563
|
+
assert(!@root.has_children?, 'Should not have any children')
|
562
564
|
|
563
|
-
assert_equal(1, @root.size,
|
565
|
+
assert_equal(1, @root.size, 'Should have 1 node (the root)')
|
564
566
|
@root.add(@child1) # First Child added at position 0
|
565
567
|
# Validate that children = [@child1]
|
566
568
|
assert_equal(@child1, @root[0])
|
@@ -569,14 +571,14 @@ module TestTree
|
|
569
571
|
# Validate that children = [@child1, @child2]
|
570
572
|
assert_equal(@child1, @root[0])
|
571
573
|
assert_equal(@child2, @root[1])
|
572
|
-
assert_equal(2, @root.children.size,
|
574
|
+
assert_equal(2, @root.children.size, 'Should have two child nodes')
|
573
575
|
|
574
576
|
@root.add(@child3, 1) # Third child inserted at position 1 (before @child2)
|
575
577
|
# Validate that children = [@child1, @child3, @child2]
|
576
578
|
assert_equal(@child1, @root[0])
|
577
579
|
assert_equal(@child3, @root[1])
|
578
580
|
assert_equal(@child2, @root[2])
|
579
|
-
assert_equal(3, @root.children.size,
|
581
|
+
assert_equal(3, @root.children.size, 'Should have three child nodes')
|
580
582
|
|
581
583
|
@root.add(@child4, @root.children.size) # Fourth child inserted at the end (equivalent to plain #add(child4)
|
582
584
|
# Validate that children = [@child1, @child3, @child2, @child4]
|
@@ -584,7 +586,7 @@ module TestTree
|
|
584
586
|
assert_equal(@child3, @root[1])
|
585
587
|
assert_equal(@child2, @root[2])
|
586
588
|
assert_equal(@child4, @root[3])
|
587
|
-
assert_equal(4, @root.children.size,
|
589
|
+
assert_equal(4, @root.children.size, 'Should have four child nodes')
|
588
590
|
|
589
591
|
# Now, a negative test. We are preventing addition to a position that does not exist.
|
590
592
|
assert_raise(RuntimeError) {
|
@@ -596,7 +598,7 @@ module TestTree
|
|
596
598
|
assert_equal(@child2, @root[2])
|
597
599
|
assert_equal(@child4, @root[3])
|
598
600
|
assert_nil(@root[4])
|
599
|
-
assert_equal(4, @root.children.size,
|
601
|
+
assert_equal(4, @root.children.size, 'Should have four child nodes')
|
600
602
|
|
601
603
|
# Another negative test. Lets attempt to add from the end at a position that is not available
|
602
604
|
assert_raise(RuntimeError) {
|
@@ -607,7 +609,7 @@ module TestTree
|
|
607
609
|
assert_equal(@child3, @root[-3])
|
608
610
|
assert_equal(@child2, @root[-2])
|
609
611
|
assert_equal(@child4, @root[-1])
|
610
|
-
assert_equal(4, @root.children.size,
|
612
|
+
assert_equal(4, @root.children.size, 'Should have four child nodes')
|
611
613
|
|
612
614
|
# Lets correctly add the fifth child from the end to effectively prepend the node.
|
613
615
|
@root.add(@child5, -(@root.children.size+1)) # Fifth child inserted beyond the first position; i.e. at -5
|
@@ -617,7 +619,7 @@ module TestTree
|
|
617
619
|
assert_equal(@child3, @root[-3])
|
618
620
|
assert_equal(@child2, @root[-2])
|
619
621
|
assert_equal(@child4, @root[-1])
|
620
|
-
assert_equal(5, @root.children.size,
|
622
|
+
assert_equal(5, @root.children.size, 'Should have five child nodes')
|
621
623
|
end
|
622
624
|
|
623
625
|
# Test the replace! and replace_with! methods
|
@@ -626,40 +628,40 @@ module TestTree
|
|
626
628
|
@root << @child2
|
627
629
|
@root << @child3
|
628
630
|
|
629
|
-
assert_equal(4, @root.size,
|
630
|
-
assert(@root.children.include?(@child1),
|
631
|
-
assert(@root.children.include?(@child2),
|
632
|
-
assert(@root.children.include?(@child3),
|
633
|
-
assert(!@root.children.include?(@child4),
|
631
|
+
assert_equal(4, @root.size, 'Should have four nodes')
|
632
|
+
assert(@root.children.include?(@child1), 'Should parent child1')
|
633
|
+
assert(@root.children.include?(@child2), 'Should parent child2')
|
634
|
+
assert(@root.children.include?(@child3), 'Should parent child3')
|
635
|
+
assert(!@root.children.include?(@child4), 'Should not parent child4')
|
634
636
|
|
635
637
|
@root.replace!(@child2, @child4)
|
636
638
|
|
637
639
|
# Also test replacing with a node of the same name
|
638
640
|
@root.replace! @child4, @child4.detached_copy
|
639
641
|
|
640
|
-
assert_equal(4, @root.size,
|
641
|
-
assert(@root.children.include?(@child1),
|
642
|
-
assert(!@root.children.include?(@child2),
|
643
|
-
assert(@root.children.include?(@child3),
|
644
|
-
assert(@root.children.include?(@child4),
|
645
|
-
assert_equal(1, @root.children.find_index(@child4),
|
642
|
+
assert_equal(4, @root.size, 'Should have three nodes')
|
643
|
+
assert(@root.children.include?(@child1), 'Should parent child1')
|
644
|
+
assert(!@root.children.include?(@child2), 'Should not parent child2')
|
645
|
+
assert(@root.children.include?(@child3), 'Should parent child3')
|
646
|
+
assert(@root.children.include?(@child4), 'Should parent child4')
|
647
|
+
assert_equal(1, @root.children.find_index(@child4), 'Should add child4 to index 1')
|
646
648
|
end
|
647
649
|
|
648
650
|
def test_replace_with
|
649
651
|
@root << @child1
|
650
652
|
@root << @child2
|
651
653
|
|
652
|
-
assert_equal(3, @root.size,
|
653
|
-
assert(@root.children.include?(@child1),
|
654
|
-
assert(@root.children.include?(@child2),
|
655
|
-
assert(!@root.children.include?(@child3),
|
654
|
+
assert_equal(3, @root.size, 'Should have three nodes')
|
655
|
+
assert(@root.children.include?(@child1), 'Should parent child1')
|
656
|
+
assert(@root.children.include?(@child2), 'Should parent child2')
|
657
|
+
assert(!@root.children.include?(@child3), 'Should not parent child3')
|
656
658
|
|
657
659
|
@child2.replace_with @child3
|
658
660
|
|
659
|
-
assert_equal(3, @root.size,
|
660
|
-
assert(@root.children.include?(@child1),
|
661
|
-
assert(!@root.children.include?(@child2),
|
662
|
-
assert(@root.children.include?(@child3),
|
661
|
+
assert_equal(3, @root.size, 'Should have three nodes')
|
662
|
+
assert(@root.children.include?(@child1), 'Should parent child1')
|
663
|
+
assert(!@root.children.include?(@child2), 'Should not parent child2')
|
664
|
+
assert(@root.children.include?(@child3), 'Should parent child3')
|
663
665
|
end
|
664
666
|
|
665
667
|
# Test the remove! and remove_all! methods.
|
@@ -667,57 +669,57 @@ module TestTree
|
|
667
669
|
@root << @child1
|
668
670
|
@root << @child2
|
669
671
|
|
670
|
-
assert(@root.has_children?,
|
671
|
-
assert_equal(3, @root.size,
|
672
|
+
assert(@root.has_children?, 'Should have children')
|
673
|
+
assert_equal(3, @root.size, 'Should have three nodes')
|
672
674
|
|
673
675
|
@root.remove!(@child1)
|
674
|
-
assert_equal(2, @root.size,
|
676
|
+
assert_equal(2, @root.size, 'Should have two nodes')
|
675
677
|
@root.remove!(@child2)
|
676
678
|
|
677
|
-
assert(!@root.has_children?,
|
678
|
-
assert_equal(1, @root.size,
|
679
|
+
assert(!@root.has_children?, 'Should have no children')
|
680
|
+
assert_equal(1, @root.size, 'Should have one node')
|
679
681
|
|
680
682
|
@root << @child1
|
681
683
|
@root << @child2
|
682
684
|
|
683
|
-
assert(@root.has_children?,
|
684
|
-
assert_equal(3, @root.size,
|
685
|
+
assert(@root.has_children?, 'Should have children')
|
686
|
+
assert_equal(3, @root.size, 'Should have three nodes')
|
685
687
|
|
686
688
|
@root.remove_all!
|
687
689
|
|
688
|
-
assert(!@root.has_children?,
|
689
|
-
assert_equal(1, @root.size,
|
690
|
+
assert(!@root.has_children?, 'Should have no children')
|
691
|
+
assert_equal(1, @root.size, 'Should have one node')
|
690
692
|
|
691
693
|
# Some negative testing
|
692
694
|
@root.remove!(nil)
|
693
|
-
assert(!@root.has_children?,
|
694
|
-
assert_equal(1, @root.size,
|
695
|
+
assert(!@root.has_children?, 'Should have no children')
|
696
|
+
assert_equal(1, @root.size, 'Should have one node')
|
695
697
|
end
|
696
698
|
|
697
699
|
# Test the remove_all! method.
|
698
700
|
def test_remove_all_bang
|
699
701
|
setup_test_tree
|
700
|
-
assert(@root.has_children?,
|
702
|
+
assert(@root.has_children?, 'Should have children')
|
701
703
|
@root.remove_all!
|
702
704
|
|
703
|
-
assert(!@root.has_children?,
|
704
|
-
assert_equal(1, @root.size,
|
705
|
+
assert(!@root.has_children?, 'Should have no children')
|
706
|
+
assert_equal(1, @root.size, 'Should have one node')
|
705
707
|
end
|
706
708
|
|
707
709
|
# Test the remove_from_parent! method.
|
708
710
|
def test_remove_from_parent_bang
|
709
711
|
setup_test_tree
|
710
712
|
|
711
|
-
assert(@root.has_children?,
|
712
|
-
assert(!@root.is_leaf?,
|
713
|
+
assert(@root.has_children?, 'Should have children')
|
714
|
+
assert(!@root.is_leaf?, 'Root is not a leaf here')
|
713
715
|
|
714
716
|
child1 = @root[0]
|
715
|
-
assert_not_nil(child1,
|
717
|
+
assert_not_nil(child1, 'Child 1 should exist')
|
716
718
|
assert_same(@root, child1.root, "Child 1's root should be ROOT")
|
717
|
-
assert(@root.include?(child1),
|
719
|
+
assert(@root.include?(child1), 'root should have child1')
|
718
720
|
child1.remove_from_parent!
|
719
721
|
assert_same(child1, child1.root, "Child 1's root should be self")
|
720
|
-
assert(!@root.include?(child1),
|
722
|
+
assert(!@root.include?(child1), 'root should not have child1')
|
721
723
|
|
722
724
|
child1.remove_from_parent!
|
723
725
|
assert_same(child1, child1.root, "Child 1's root should still be self")
|
@@ -727,35 +729,35 @@ module TestTree
|
|
727
729
|
def test_children
|
728
730
|
setup_test_tree
|
729
731
|
|
730
|
-
assert(@root.has_children?,
|
731
|
-
assert_equal(5, @root.size,
|
732
|
-
assert(@child3.has_children?,
|
733
|
-
assert(!@child3.is_leaf?,
|
732
|
+
assert(@root.has_children?, 'Should have children')
|
733
|
+
assert_equal(5, @root.size, 'Should have five nodes')
|
734
|
+
assert(@child3.has_children?, 'Should have children')
|
735
|
+
assert(!@child3.is_leaf?, 'Should not be a leaf')
|
734
736
|
|
735
|
-
assert_equal(1, @child3.node_height,
|
736
|
-
|
737
|
+
assert_equal(1, @child3.node_height, 'The subtree at Child 3 should have a height of 1')
|
738
|
+
[@child1, @child2, @child4].each { |child|
|
737
739
|
assert_equal(0, child.node_height, "The subtree at #{child.name} should have a height of 0")
|
738
|
-
|
740
|
+
}
|
739
741
|
|
740
742
|
result_array = @root.children
|
741
743
|
|
742
|
-
assert_equal(3, result_array.length,
|
743
|
-
assert(!result_array.include?(@root),
|
744
|
-
assert_equal(result_array[0], @child1,
|
745
|
-
assert_equal(result_array[1], @child2,
|
746
|
-
assert_equal(result_array[2], @child3,
|
747
|
-
assert(!result_array.include?(@child4),
|
744
|
+
assert_equal(3, result_array.length, 'Should have three direct children')
|
745
|
+
assert(!result_array.include?(@root), 'Should not have root')
|
746
|
+
assert_equal(result_array[0], @child1, 'Should have child 1')
|
747
|
+
assert_equal(result_array[1], @child2, 'Should have child 2')
|
748
|
+
assert_equal(result_array[2], @child3, 'Should have child 3')
|
749
|
+
assert(!result_array.include?(@child4), 'Should not have child 4')
|
748
750
|
|
749
751
|
# Lets try the block version of the method.
|
750
752
|
result_array.clear
|
751
753
|
result = @root.children {|child| result_array << child}
|
752
754
|
assert_equal(@root, result)
|
753
755
|
result_array.length
|
754
|
-
assert_equal(3, result_array.length,
|
755
|
-
assert_equal(result_array[0], @child1,
|
756
|
-
assert_equal(result_array[1], @child2,
|
757
|
-
assert_equal(result_array[2], @child3,
|
758
|
-
assert(!result_array.include?(@child4),
|
756
|
+
assert_equal(3, result_array.length, 'Should have three children')
|
757
|
+
assert_equal(result_array[0], @child1, 'Should have child 1')
|
758
|
+
assert_equal(result_array[1], @child2, 'Should have child 2')
|
759
|
+
assert_equal(result_array[2], @child3, 'Should have child 3')
|
760
|
+
assert(!result_array.include?(@child4), 'Should not have child 4')
|
759
761
|
|
760
762
|
end
|
761
763
|
|
@@ -764,7 +766,7 @@ module TestTree
|
|
764
766
|
setup_test_tree
|
765
767
|
|
766
768
|
assert_equal(@child1, @root.first_child, "Root's first child is Child1")
|
767
|
-
assert_nil(@child1.first_child,
|
769
|
+
assert_nil(@child1.first_child, 'Child1 does not have any children')
|
768
770
|
assert_equal(@child4, @child3.first_child, "Child3's first child is Child4")
|
769
771
|
end
|
770
772
|
|
@@ -773,7 +775,7 @@ module TestTree
|
|
773
775
|
setup_test_tree
|
774
776
|
|
775
777
|
assert_equal(@child3, @root.last_child, "Root's last child is Child3")
|
776
|
-
assert_nil(@child1.last_child,
|
778
|
+
assert_nil(@child1.last_child, 'Child1 does not have any children')
|
777
779
|
assert_equal(@child4, @child3.last_child, "Child3's last child is Child4")
|
778
780
|
end
|
779
781
|
|
@@ -781,43 +783,43 @@ module TestTree
|
|
781
783
|
def test_find
|
782
784
|
setup_test_tree
|
783
785
|
found_node = @root.find { |node| node == @child2}
|
784
|
-
assert_same(@child2, found_node,
|
786
|
+
assert_same(@child2, found_node, 'The node should be Child 2')
|
785
787
|
|
786
788
|
found_node = @root.find { |node| node == @child4}
|
787
|
-
assert_same(@child4, found_node,
|
789
|
+
assert_same(@child4, found_node, 'The node should be Child 4')
|
788
790
|
|
789
|
-
found_node = @root.find { |node| node.name ==
|
790
|
-
assert_same(@child4, found_node,
|
791
|
-
found_node = @root.find { |node| node.name ==
|
792
|
-
assert_nil(found_node,
|
791
|
+
found_node = @root.find { |node| node.name == 'Child4' }
|
792
|
+
assert_same(@child4, found_node, 'The node should be Child 4')
|
793
|
+
found_node = @root.find { |node| node.name == 'NOT PRESENT' }
|
794
|
+
assert_nil(found_node, 'The node should not be found')
|
793
795
|
end
|
794
796
|
|
795
797
|
# Test the parentage method.
|
796
798
|
def test_parentage
|
797
799
|
setup_test_tree
|
798
800
|
|
799
|
-
assert_nil(@root.parentage,
|
800
|
-
assert_equal([@root], @child1.parentage,
|
801
|
-
assert_equal([@child3, @root], @child4.parentage,
|
801
|
+
assert_nil(@root.parentage, 'Root does not have any parentage')
|
802
|
+
assert_equal([@root], @child1.parentage, 'Child1 has Root as its parent')
|
803
|
+
assert_equal([@child3, @root], @child4.parentage, 'Child4 has Child3 and Root as ancestors')
|
802
804
|
end
|
803
805
|
|
804
806
|
# Test the each method.
|
805
807
|
def test_each
|
806
808
|
setup_test_tree
|
807
809
|
|
808
|
-
assert(@root.has_children?,
|
809
|
-
assert_equal(5, @root.size,
|
810
|
-
assert(@child3.has_children?,
|
810
|
+
assert(@root.has_children?, 'Should have children')
|
811
|
+
assert_equal(5, @root.size, 'Should have five nodes')
|
812
|
+
assert(@child3.has_children?, 'Should have children')
|
811
813
|
|
812
814
|
nodes = []
|
813
815
|
@root.each { |node| nodes << node }
|
814
816
|
|
815
|
-
assert_equal(5, nodes.length,
|
816
|
-
assert(nodes.include?(@root),
|
817
|
-
assert(nodes.include?(@child1),
|
818
|
-
assert(nodes.include?(@child2),
|
819
|
-
assert(nodes.include?(@child3),
|
820
|
-
assert(nodes.include?(@child4),
|
817
|
+
assert_equal(5, nodes.length, 'Should have FIVE NODES')
|
818
|
+
assert(nodes.include?(@root), 'Should have root')
|
819
|
+
assert(nodes.include?(@child1), 'Should have child 1')
|
820
|
+
assert(nodes.include?(@child2), 'Should have child 2')
|
821
|
+
assert(nodes.include?(@child3), 'Should have child 3')
|
822
|
+
assert(nodes.include?(@child4), 'Should have child 4')
|
821
823
|
end
|
822
824
|
|
823
825
|
# Test the each_leaf method.
|
@@ -827,23 +829,23 @@ module TestTree
|
|
827
829
|
result_array = []
|
828
830
|
result = @root.each_leaf { |node| result_array << node }
|
829
831
|
assert_equal(@root, result)
|
830
|
-
assert_equal(3, result_array.length,
|
831
|
-
assert(!result_array.include?(@root),
|
832
|
-
assert(result_array.include?(@child1),
|
833
|
-
assert(result_array.include?(@child2),
|
834
|
-
assert(!result_array.include?(@child3),
|
835
|
-
assert(result_array.include?(@child4),
|
832
|
+
assert_equal(3, result_array.length, 'Should have THREE LEAF NODES')
|
833
|
+
assert(!result_array.include?(@root), 'Should not have root')
|
834
|
+
assert(result_array.include?(@child1), 'Should have child 1')
|
835
|
+
assert(result_array.include?(@child2), 'Should have child 2')
|
836
|
+
assert(!result_array.include?(@child3), 'Should not have child 3')
|
837
|
+
assert(result_array.include?(@child4), 'Should have child 4')
|
836
838
|
|
837
839
|
# Now lets try without the block
|
838
840
|
result_array.clear
|
839
841
|
result_array = @root.each_leaf
|
840
842
|
assert_equal(Array, result_array.class)
|
841
|
-
assert_equal(3, result_array.length,
|
842
|
-
assert(!result_array.include?(@root),
|
843
|
-
assert(result_array.include?(@child1),
|
844
|
-
assert(result_array.include?(@child2),
|
845
|
-
assert(!result_array.include?(@child3),
|
846
|
-
assert(result_array.include?(@child4),
|
843
|
+
assert_equal(3, result_array.length, 'Should have THREE LEAF NODES')
|
844
|
+
assert(!result_array.include?(@root), 'Should not have root')
|
845
|
+
assert(result_array.include?(@child1), 'Should have child 1')
|
846
|
+
assert(result_array.include?(@child2), 'Should have child 2')
|
847
|
+
assert(!result_array.include?(@child3), 'Should not have child 3')
|
848
|
+
assert(result_array.include?(@child4), 'Should have child 4')
|
847
849
|
|
848
850
|
end
|
849
851
|
|
@@ -852,20 +854,20 @@ module TestTree
|
|
852
854
|
setup_test_tree
|
853
855
|
|
854
856
|
assert_nil(@root.parent, "Root's parent should be nil")
|
855
|
-
assert_equal(@root, @child1.parent,
|
856
|
-
assert_equal(@root, @child3.parent,
|
857
|
-
assert_equal(@child3, @child4.parent,
|
858
|
-
assert_equal(@root, @child4.parent.parent,
|
857
|
+
assert_equal(@root, @child1.parent, 'Parent should be root')
|
858
|
+
assert_equal(@root, @child3.parent, 'Parent should be root')
|
859
|
+
assert_equal(@child3, @child4.parent, 'Parent should be child3')
|
860
|
+
assert_equal(@root, @child4.parent.parent, 'Parent should be root')
|
859
861
|
end
|
860
862
|
|
861
863
|
# Test the [] method.
|
862
864
|
def test_indexed_access
|
863
865
|
setup_test_tree
|
864
866
|
|
865
|
-
assert_equal(@child1, @root[0],
|
866
|
-
assert_equal(@child4, @root[2][0],
|
867
|
-
assert_nil(@root[
|
868
|
-
assert_nil(@root[99],
|
867
|
+
assert_equal(@child1, @root[0], 'Should be the first child')
|
868
|
+
assert_equal(@child4, @root[2][0], 'Should be the grandchild')
|
869
|
+
assert_nil(@root['TEST'], 'Should be nil')
|
870
|
+
assert_nil(@root[99], 'Should be nil')
|
869
871
|
assert_raise(ArgumentError) { @root[nil] }
|
870
872
|
end
|
871
873
|
|
@@ -879,11 +881,11 @@ module TestTree
|
|
879
881
|
# Tests the binary dumping mechanism with an Object content node
|
880
882
|
def test_marshal_dump
|
881
883
|
# Setup Test Data
|
882
|
-
test_root = Tree::TreeNode.new(
|
883
|
-
test_content = {
|
884
|
-
test_child = Tree::TreeNode.new(
|
885
|
-
test_content2 =
|
886
|
-
test_grand_child = Tree::TreeNode.new(
|
884
|
+
test_root = Tree::TreeNode.new('ROOT', 'Root Node')
|
885
|
+
test_content = {'KEY1' => 'Value1', 'KEY2' => 'Value2'}
|
886
|
+
test_child = Tree::TreeNode.new('Child', test_content)
|
887
|
+
test_content2 = %w(AValue1 AValue2 AValue3)
|
888
|
+
test_grand_child = Tree::TreeNode.new('Grand Child 1', test_content2)
|
887
889
|
test_root << test_child << test_grand_child
|
888
890
|
|
889
891
|
# Perform the test operation
|
@@ -891,30 +893,30 @@ module TestTree
|
|
891
893
|
new_root = Marshal.load(data) # And unmarshal
|
892
894
|
|
893
895
|
# Test the root node
|
894
|
-
assert_equal(test_root.name, new_root.name,
|
896
|
+
assert_equal(test_root.name, new_root.name, 'Must identify as ROOT')
|
895
897
|
assert_equal(test_root.content, new_root.content, "Must have root's content")
|
896
|
-
assert(new_root.is_root?,
|
897
|
-
assert(new_root.has_children?,
|
898
|
+
assert(new_root.is_root?, 'Must be the ROOT node')
|
899
|
+
assert(new_root.has_children?, 'Must have a child node')
|
898
900
|
|
899
901
|
# Test the child node
|
900
902
|
new_child = new_root[test_child.name]
|
901
|
-
assert_equal(test_child.name, new_child.name,
|
902
|
-
assert(new_child.has_content?,
|
903
|
-
assert(new_child.is_only_child?,
|
903
|
+
assert_equal(test_child.name, new_child.name, 'Must have child 1')
|
904
|
+
assert(new_child.has_content?, 'Child must have content')
|
905
|
+
assert(new_child.is_only_child?, 'Child must be the only child')
|
904
906
|
|
905
907
|
new_child_content = new_child.content
|
906
908
|
assert_equal(Hash, new_child_content.class, "Class of child's content should be a hash")
|
907
|
-
assert_equal(test_child.content.size, new_child_content.size,
|
909
|
+
assert_equal(test_child.content.size, new_child_content.size, 'The content should have same size')
|
908
910
|
|
909
911
|
# Test the grand-child node
|
910
912
|
new_grand_child = new_child[test_grand_child.name]
|
911
|
-
assert_equal(test_grand_child.name, new_grand_child.name,
|
912
|
-
assert(new_grand_child.has_content?,
|
913
|
-
assert(new_grand_child.is_only_child?,
|
913
|
+
assert_equal(test_grand_child.name, new_grand_child.name, 'Must have grand child')
|
914
|
+
assert(new_grand_child.has_content?, 'Grand-child must have content')
|
915
|
+
assert(new_grand_child.is_only_child?, 'Grand-child must be the only child')
|
914
916
|
|
915
917
|
new_grand_child_content = new_grand_child.content
|
916
918
|
assert_equal(Array, new_grand_child_content.class, "Class of grand-child's content should be an Array")
|
917
|
-
assert_equal(test_grand_child.content.size, new_grand_child_content.size,
|
919
|
+
assert_equal(test_grand_child.content.size, new_grand_child_content.size, 'The content should have same size')
|
918
920
|
end
|
919
921
|
|
920
922
|
# marshal_load and marshal_dump are symmetric methods
|
@@ -925,31 +927,33 @@ module TestTree
|
|
925
927
|
def test_collect
|
926
928
|
setup_test_tree
|
927
929
|
collect_array = @root.collect do |node|
|
928
|
-
node.content =
|
930
|
+
node.content = 'abc'
|
929
931
|
node
|
930
932
|
end
|
931
|
-
collect_array.each {|node| assert_equal(
|
933
|
+
collect_array.each {|node| assert_equal('abc', node.content, "Should be 'abc'")}
|
932
934
|
end
|
933
935
|
|
934
936
|
# Test freezing the tree
|
935
937
|
def test_freeze_tree_bang
|
936
938
|
setup_test_tree
|
937
939
|
|
938
|
-
@root.content =
|
939
|
-
assert_equal(
|
940
|
+
@root.content = 'ABC'
|
941
|
+
assert_equal('ABC', @root.content, "Content should be 'ABC'")
|
940
942
|
@root.freeze_tree!
|
941
943
|
# Note: The error raised here depends on the Ruby version.
|
942
944
|
# For Ruby > 1.9, RuntimeError is raised
|
943
945
|
# For Ruby ~ 1.8, TypeError is raised
|
944
|
-
assert_raise(RuntimeError, TypeError) {@root.content =
|
945
|
-
|
946
|
+
assert_raise(RuntimeError, TypeError) {@root.content = '123'
|
947
|
+
}
|
948
|
+
assert_raise(RuntimeError, TypeError) {@root[0].content = '123'
|
949
|
+
}
|
946
950
|
end
|
947
951
|
|
948
|
-
# Test whether the content is
|
952
|
+
# Test whether the content is accessible
|
949
953
|
def test_content
|
950
|
-
|
951
|
-
@root.content =
|
952
|
-
assert_same(
|
954
|
+
person = Person::new('John', 'Doe')
|
955
|
+
@root.content = person
|
956
|
+
assert_same(person, @root.content, 'Content should be the same')
|
953
957
|
end
|
954
958
|
|
955
959
|
# Test the depth computation algorithm. Note that this is an incorrect computation and actually returns height+1
|
@@ -957,9 +961,9 @@ module TestTree
|
|
957
961
|
def test_depth
|
958
962
|
begin
|
959
963
|
require 'structured_warnings'
|
960
|
-
assert_warn(DeprecatedMethodWarning) { do_deprecated_depth }
|
964
|
+
assert_warn(StructuredWarnings::DeprecatedMethodWarning) { do_deprecated_depth }
|
961
965
|
rescue LoadError
|
962
|
-
# Since the
|
966
|
+
# Since the structured_warnings package is not present, we revert to good old Kernel#warn behavior.
|
963
967
|
do_deprecated_depth
|
964
968
|
end
|
965
969
|
end
|
@@ -969,17 +973,17 @@ module TestTree
|
|
969
973
|
assert_equal(1, @root.depth, "A single node's depth is 1")
|
970
974
|
|
971
975
|
@root << @child1
|
972
|
-
assert_equal(2, @root.depth,
|
976
|
+
assert_equal(2, @root.depth, 'This should be of depth 2')
|
973
977
|
|
974
978
|
@root << @child2
|
975
|
-
assert_equal(2, @root.depth,
|
979
|
+
assert_equal(2, @root.depth, 'This should be of depth 2')
|
976
980
|
|
977
981
|
@child2 << @child3
|
978
|
-
assert_equal(3, @root.depth,
|
979
|
-
assert_equal(2, @child2.depth,
|
982
|
+
assert_equal(3, @root.depth, 'This should be of depth 3')
|
983
|
+
assert_equal(2, @child2.depth, 'This should be of depth 2')
|
980
984
|
|
981
985
|
@child3 << @child4
|
982
|
-
assert_equal(4, @root.depth,
|
986
|
+
assert_equal(4, @root.depth, 'This should be of depth 4')
|
983
987
|
end
|
984
988
|
|
985
989
|
# Test the height computation algorithm
|
@@ -987,23 +991,23 @@ module TestTree
|
|
987
991
|
assert_equal(0, @root.node_height, "A single node's height is 0")
|
988
992
|
|
989
993
|
@root << @child1
|
990
|
-
assert_equal(1, @root.node_height,
|
991
|
-
assert_equal(0, @child1.node_height,
|
994
|
+
assert_equal(1, @root.node_height, 'This should be of height 1')
|
995
|
+
assert_equal(0, @child1.node_height, 'This should be of height 0')
|
992
996
|
|
993
997
|
@root << @child2
|
994
|
-
assert_equal(1, @root.node_height,
|
995
|
-
assert_equal(0, @child2.node_height,
|
998
|
+
assert_equal(1, @root.node_height, 'This should be of height 1')
|
999
|
+
assert_equal(0, @child2.node_height, 'This should be of height 0')
|
996
1000
|
|
997
1001
|
@child2 << @child3
|
998
|
-
assert_equal(2, @root.node_height,
|
999
|
-
assert_equal(1, @child2.node_height,
|
1000
|
-
assert_equal(0, @child3.node_height,
|
1002
|
+
assert_equal(2, @root.node_height, 'This should be of height 2')
|
1003
|
+
assert_equal(1, @child2.node_height, 'This should be of height 1')
|
1004
|
+
assert_equal(0, @child3.node_height, 'This should be of height 0')
|
1001
1005
|
|
1002
1006
|
@child3 << @child4
|
1003
|
-
assert_equal(3, @root.node_height,
|
1004
|
-
assert_equal(2, @child2.node_height,
|
1005
|
-
assert_equal(1, @child3.node_height,
|
1006
|
-
assert_equal(0, @child4.node_height,
|
1007
|
+
assert_equal(3, @root.node_height, 'This should be of height 3')
|
1008
|
+
assert_equal(2, @child2.node_height, 'This should be of height 2')
|
1009
|
+
assert_equal(1, @child3.node_height, 'This should be of height 1')
|
1010
|
+
assert_equal(0, @child4.node_height, 'This should be of height 0')
|
1007
1011
|
end
|
1008
1012
|
|
1009
1013
|
# Test the depth computation algorithm. Note that this is the correct depth computation. The original
|
@@ -1013,29 +1017,29 @@ module TestTree
|
|
1013
1017
|
|
1014
1018
|
setup_test_tree
|
1015
1019
|
|
1016
|
-
|
1020
|
+
[@child1, @child2, @child3].each { |child|
|
1017
1021
|
assert_equal(1, child.node_depth, "Node #{child.name} should have depth 1")
|
1018
|
-
|
1022
|
+
}
|
1019
1023
|
|
1020
|
-
assert_equal(2, @child4.node_depth,
|
1024
|
+
assert_equal(2, @child4.node_depth, 'Child 4 should have depth 2')
|
1021
1025
|
|
1022
1026
|
@root << @child5 << @child3
|
1023
|
-
assert_equal(3, @child4.node_depth,
|
1027
|
+
assert_equal(3, @child4.node_depth, 'Child 4 should have depth 3 after Child 5 inserted above')
|
1024
1028
|
end
|
1025
1029
|
|
1026
1030
|
# Test the level method. Since this is an alias of node_depth, we just test for equivalence
|
1027
1031
|
def test_level
|
1028
1032
|
assert_equal(0, @root.level, "A root node's level is 0")
|
1029
1033
|
|
1030
|
-
assert_equal(@root.node_depth, @root.level,
|
1034
|
+
assert_equal(@root.node_depth, @root.level, 'Level and depth should be the same')
|
1031
1035
|
|
1032
1036
|
setup_test_tree
|
1033
|
-
|
1037
|
+
[@child1, @child2, @child3].each { |child|
|
1034
1038
|
assert_equal(1, child.level, "Node #{child.name} should have level 1")
|
1035
|
-
assert_equal(@root.node_depth, @root.level,
|
1036
|
-
|
1039
|
+
assert_equal(@root.node_depth, @root.level, 'Level and depth should be the same')
|
1040
|
+
}
|
1037
1041
|
|
1038
|
-
assert_equal(2, @child4.level,
|
1042
|
+
assert_equal(2, @child4.level, 'Child 4 should have level 2')
|
1039
1043
|
end
|
1040
1044
|
|
1041
1045
|
# Test the breadth computation algorithm
|
@@ -1043,29 +1047,29 @@ module TestTree
|
|
1043
1047
|
assert_equal(1, @root.breadth, "A single node's breadth is 1")
|
1044
1048
|
|
1045
1049
|
@root << @child1
|
1046
|
-
assert_equal(1, @root.breadth,
|
1050
|
+
assert_equal(1, @root.breadth, 'This should be of breadth 1')
|
1047
1051
|
|
1048
1052
|
@root << @child2
|
1049
|
-
assert_equal(2, @child1.breadth,
|
1050
|
-
assert_equal(2, @child2.breadth,
|
1053
|
+
assert_equal(2, @child1.breadth, 'This should be of breadth 2')
|
1054
|
+
assert_equal(2, @child2.breadth, 'This should be of breadth 2')
|
1051
1055
|
|
1052
1056
|
@root << @child3
|
1053
|
-
assert_equal(3, @child1.breadth,
|
1054
|
-
assert_equal(3, @child2.breadth,
|
1057
|
+
assert_equal(3, @child1.breadth, 'This should be of breadth 3')
|
1058
|
+
assert_equal(3, @child2.breadth, 'This should be of breadth 3')
|
1055
1059
|
|
1056
1060
|
@child3 << @child4
|
1057
|
-
assert_equal(1, @child4.breadth,
|
1061
|
+
assert_equal(1, @child4.breadth, 'This should be of breadth 1')
|
1058
1062
|
end
|
1059
1063
|
|
1060
1064
|
# Test the breadth for each
|
1061
1065
|
def test_breadth_each
|
1062
|
-
j = Tree::TreeNode.new(
|
1063
|
-
f = Tree::TreeNode.new(
|
1064
|
-
k = Tree::TreeNode.new(
|
1065
|
-
a = Tree::TreeNode.new(
|
1066
|
-
d = Tree::TreeNode.new(
|
1067
|
-
h = Tree::TreeNode.new(
|
1068
|
-
z = Tree::TreeNode.new(
|
1066
|
+
j = Tree::TreeNode.new('j')
|
1067
|
+
f = Tree::TreeNode.new('f')
|
1068
|
+
k = Tree::TreeNode.new('k')
|
1069
|
+
a = Tree::TreeNode.new('a')
|
1070
|
+
d = Tree::TreeNode.new('d')
|
1071
|
+
h = Tree::TreeNode.new('h')
|
1072
|
+
z = Tree::TreeNode.new('z')
|
1069
1073
|
|
1070
1074
|
# The expected order of response
|
1071
1075
|
expected_array = [j,
|
@@ -1108,13 +1112,13 @@ module TestTree
|
|
1108
1112
|
|
1109
1113
|
# Test the preordered_each method.
|
1110
1114
|
def test_preordered_each
|
1111
|
-
j = Tree::TreeNode.new(
|
1112
|
-
f = Tree::TreeNode.new(
|
1113
|
-
k = Tree::TreeNode.new(
|
1114
|
-
a = Tree::TreeNode.new(
|
1115
|
-
d = Tree::TreeNode.new(
|
1116
|
-
h = Tree::TreeNode.new(
|
1117
|
-
z = Tree::TreeNode.new(
|
1115
|
+
j = Tree::TreeNode.new('j')
|
1116
|
+
f = Tree::TreeNode.new('f')
|
1117
|
+
k = Tree::TreeNode.new('k')
|
1118
|
+
a = Tree::TreeNode.new('a')
|
1119
|
+
d = Tree::TreeNode.new('d')
|
1120
|
+
h = Tree::TreeNode.new('h')
|
1121
|
+
z = Tree::TreeNode.new('z')
|
1118
1122
|
|
1119
1123
|
# The expected order of response
|
1120
1124
|
expected_array = [j, f, a, d, h, k, z]
|
@@ -1147,13 +1151,13 @@ module TestTree
|
|
1147
1151
|
|
1148
1152
|
# Test the postordered_each method.
|
1149
1153
|
def test_postordered_each
|
1150
|
-
j = Tree::TreeNode.new(
|
1151
|
-
f = Tree::TreeNode.new(
|
1152
|
-
k = Tree::TreeNode.new(
|
1153
|
-
a = Tree::TreeNode.new(
|
1154
|
-
d = Tree::TreeNode.new(
|
1155
|
-
h = Tree::TreeNode.new(
|
1156
|
-
z = Tree::TreeNode.new(
|
1154
|
+
j = Tree::TreeNode.new('j')
|
1155
|
+
f = Tree::TreeNode.new('f')
|
1156
|
+
k = Tree::TreeNode.new('k')
|
1157
|
+
a = Tree::TreeNode.new('a')
|
1158
|
+
d = Tree::TreeNode.new('d')
|
1159
|
+
h = Tree::TreeNode.new('h')
|
1160
|
+
z = Tree::TreeNode.new('z')
|
1157
1161
|
|
1158
1162
|
# The expected order of response
|
1159
1163
|
expected_array = [d, a, h, f, z, k, j]
|
@@ -1198,14 +1202,14 @@ module TestTree
|
|
1198
1202
|
def test_detached_copy
|
1199
1203
|
setup_test_tree
|
1200
1204
|
|
1201
|
-
assert(@root.has_children?,
|
1205
|
+
assert(@root.has_children?, 'The root should have children')
|
1202
1206
|
copy_of_root = @root.detached_copy
|
1203
|
-
assert(!copy_of_root.has_children?,
|
1204
|
-
assert_equal(@root.name, copy_of_root.name,
|
1207
|
+
assert(!copy_of_root.has_children?, 'The copy should not have children')
|
1208
|
+
assert_equal(@root.name, copy_of_root.name, 'The names should be equal')
|
1205
1209
|
|
1206
1210
|
# Try the same test with a child node
|
1207
|
-
assert(!@child3.is_root?,
|
1208
|
-
assert(@child3.has_children?,
|
1211
|
+
assert(!@child3.is_root?, 'Child 3 is not a root')
|
1212
|
+
assert(@child3.has_children?, 'Child 3 has children')
|
1209
1213
|
copy_of_child3 = @child3.detached_copy
|
1210
1214
|
assert(copy_of_child3.is_root?, "Child 3's copy is a root")
|
1211
1215
|
assert(!copy_of_child3.has_children?, "Child 3's copy does not have children")
|
@@ -1215,61 +1219,61 @@ module TestTree
|
|
1215
1219
|
def test_detached_subtree_copy
|
1216
1220
|
setup_test_tree
|
1217
1221
|
|
1218
|
-
assert(@root.has_children?,
|
1222
|
+
assert(@root.has_children?, 'The root should have children.')
|
1219
1223
|
tree_copy = @root.detached_subtree_copy
|
1220
1224
|
|
1221
|
-
assert_equal(@root.name, tree_copy.name,
|
1222
|
-
assert_not_equal(@root.object_id, tree_copy.object_id,
|
1223
|
-
assert(tree_copy.is_root?,
|
1224
|
-
assert(tree_copy.has_children?,
|
1225
|
-
assert_equal(tree_copy.children.count, @root.children.count,
|
1225
|
+
assert_equal(@root.name, tree_copy.name, 'The names should be equal.')
|
1226
|
+
assert_not_equal(@root.object_id, tree_copy.object_id, 'Object_ids should differ.')
|
1227
|
+
assert(tree_copy.is_root?, 'Copied root should be a root node.')
|
1228
|
+
assert(tree_copy.has_children?, 'Copied tree should have children.')
|
1229
|
+
assert_equal(tree_copy.children.count, @root.children.count, 'Copied tree and the original tree should have same number of children.')
|
1226
1230
|
|
1227
|
-
assert_equal(tree_copy[0].name, @child1.name,
|
1228
|
-
assert_not_equal(tree_copy[0].object_id, @child1.object_id,
|
1229
|
-
assert(!tree_copy[0].is_root?,
|
1230
|
-
assert(!tree_copy[0].has_children?,
|
1231
|
+
assert_equal(tree_copy[0].name, @child1.name, 'The names of Child1 (original and copy) should be same.')
|
1232
|
+
assert_not_equal(tree_copy[0].object_id, @child1.object_id, 'Child1 Object_ids (original and copy) should differ.')
|
1233
|
+
assert(!tree_copy[0].is_root?, 'Child1 copied should not be root.')
|
1234
|
+
assert(!tree_copy[0].has_children?, 'Child1 copied should not have children.')
|
1231
1235
|
|
1232
|
-
assert_equal(tree_copy[1].name, @child2.name,
|
1233
|
-
assert_not_equal(tree_copy[1].object_id, @child2.object_id,
|
1234
|
-
assert(!tree_copy[1].is_root?,
|
1235
|
-
assert(!tree_copy[1].has_children?,
|
1236
|
+
assert_equal(tree_copy[1].name, @child2.name, 'The names of Child2 (original and copy) should be same.')
|
1237
|
+
assert_not_equal(tree_copy[1].object_id, @child2.object_id, 'Child2 Object_ids (original and copy) should differ.')
|
1238
|
+
assert(!tree_copy[1].is_root?, 'Child2 copied should not be root.')
|
1239
|
+
assert(!tree_copy[1].has_children?, 'Child2 copied should not have children.')
|
1236
1240
|
|
1237
|
-
assert_equal(tree_copy[2].name, @child3.name,
|
1238
|
-
assert_not_equal(tree_copy[2].object_id, @child3.object_id,
|
1239
|
-
assert(!tree_copy[2].is_root?,
|
1240
|
-
assert(tree_copy[2].has_children?,
|
1241
|
+
assert_equal(tree_copy[2].name, @child3.name, 'The names of Child3 (original and copy) should be same.')
|
1242
|
+
assert_not_equal(tree_copy[2].object_id, @child3.object_id, 'Child3 Object_ids (original and copy) should differ.')
|
1243
|
+
assert(!tree_copy[2].is_root?, 'Child3 copied should not be root.')
|
1244
|
+
assert(tree_copy[2].has_children?, 'Child3 copied should have children.')
|
1241
1245
|
|
1242
|
-
assert_equal(tree_copy[2][0].name, @child4.name,
|
1243
|
-
assert_not_equal(tree_copy[2][0].object_id, @child4.object_id,
|
1244
|
-
assert(!tree_copy[2][0].is_root?,
|
1245
|
-
assert(!tree_copy[2][0].has_children?,
|
1246
|
+
assert_equal(tree_copy[2][0].name, @child4.name, 'The names of Child4 (original and copy) should be same.')
|
1247
|
+
assert_not_equal(tree_copy[2][0].object_id, @child4.object_id, 'Child4 Object_ids (original and copy) should differ.')
|
1248
|
+
assert(!tree_copy[2][0].is_root?, 'Child4 copied should not be root.')
|
1249
|
+
assert(!tree_copy[2][0].has_children?, 'Child4 copied should not have children.')
|
1246
1250
|
end
|
1247
1251
|
|
1248
1252
|
# Test the has_children? method.
|
1249
1253
|
def test_has_children_eh
|
1250
1254
|
setup_test_tree
|
1251
|
-
assert(@root.has_children?,
|
1255
|
+
assert(@root.has_children?, 'The Root node MUST have children')
|
1252
1256
|
end
|
1253
1257
|
|
1254
1258
|
# test the is_leaf? method.
|
1255
1259
|
def test_is_leaf_eh
|
1256
1260
|
setup_test_tree
|
1257
|
-
assert(!@child3.is_leaf?,
|
1258
|
-
assert(@child4.is_leaf?,
|
1261
|
+
assert(!@child3.is_leaf?, 'Child 3 is not a leaf node')
|
1262
|
+
assert(@child4.is_leaf?, 'Child 4 is a leaf node')
|
1259
1263
|
end
|
1260
1264
|
|
1261
1265
|
# Test the is_root? method.
|
1262
1266
|
def test_is_root_eh
|
1263
1267
|
setup_test_tree
|
1264
|
-
assert(@root.is_root?,
|
1268
|
+
assert(@root.is_root?, 'The ROOT node must respond as the root node')
|
1265
1269
|
end
|
1266
1270
|
|
1267
1271
|
# Test the content= method.
|
1268
1272
|
def test_content_equals
|
1269
1273
|
@root.content = nil
|
1270
1274
|
assert_nil(@root.content, "Root's content should be nil")
|
1271
|
-
@root.content =
|
1272
|
-
assert_equal(
|
1275
|
+
@root.content = 'dummy content'
|
1276
|
+
assert_equal('dummy content', @root.content, "Root's content should now be 'dummy content'")
|
1273
1277
|
end
|
1274
1278
|
|
1275
1279
|
# Test the size method.
|
@@ -1286,10 +1290,10 @@ module TestTree
|
|
1286
1290
|
@root << @child1
|
1287
1291
|
@root << @child2
|
1288
1292
|
@root << @child3 << @child4
|
1289
|
-
assert_not_nil(@root['Child1'],
|
1290
|
-
assert_not_nil(@root['Child2'],
|
1291
|
-
assert_not_nil(@root['Child3'],
|
1292
|
-
assert_not_nil(@child3['Child4'],
|
1293
|
+
assert_not_nil(@root['Child1'], 'Child 1 should have been added to Root')
|
1294
|
+
assert_not_nil(@root['Child2'], 'Child 2 should have been added to Root')
|
1295
|
+
assert_not_nil(@root['Child3'], 'Child 3 should have been added to Root')
|
1296
|
+
assert_not_nil(@child3['Child4'], 'Child 4 should have been added to Child3')
|
1293
1297
|
end
|
1294
1298
|
|
1295
1299
|
# Test the [] method.
|
@@ -1298,19 +1302,19 @@ module TestTree
|
|
1298
1302
|
|
1299
1303
|
@root << @child1
|
1300
1304
|
@root << @child2
|
1301
|
-
assert_equal(@child1.name, @root['Child1'].name,
|
1302
|
-
assert_equal(@child1.name, @root[0].name,
|
1303
|
-
assert_equal(@child1.name, @root[-2].name,
|
1304
|
-
assert_equal(@child1.name, @root[-(@root.children.size)].name,
|
1305
|
+
assert_equal(@child1.name, @root['Child1'].name, 'Child 1 should be returned')
|
1306
|
+
assert_equal(@child1.name, @root[0].name, 'Child 1 should be returned')
|
1307
|
+
assert_equal(@child1.name, @root[-2].name, 'Child 1 should be returned') # Negative access also works
|
1308
|
+
assert_equal(@child1.name, @root[-(@root.children.size)].name, 'Child 1 should be returned') # Negative access also works
|
1305
1309
|
|
1306
|
-
assert_equal(@child2.name, @root['Child2'].name,
|
1307
|
-
assert_equal(@child2.name, @root[1].name,
|
1308
|
-
assert_equal(@child2.name, @root[-1].name,
|
1310
|
+
assert_equal(@child2.name, @root['Child2'].name, 'Child 2 should be returned')
|
1311
|
+
assert_equal(@child2.name, @root[1].name, 'Child 2 should be returned')
|
1312
|
+
assert_equal(@child2.name, @root[-1].name, 'Child 2 should be returned') # Negative access also works
|
1309
1313
|
|
1310
|
-
assert_nil(@root['Some Random Name'],
|
1311
|
-
assert_nil(@root[99],
|
1312
|
-
assert_nil(@root[-(@root.children.size+1)],
|
1313
|
-
assert_nil(@root[-3],
|
1314
|
+
assert_nil(@root['Some Random Name'], 'Should return nil')
|
1315
|
+
assert_nil(@root[99], 'Should return nil')
|
1316
|
+
assert_nil(@root[-(@root.children.size+1)], 'Should return nil')
|
1317
|
+
assert_nil(@root[-3], 'Should return nil')
|
1314
1318
|
end
|
1315
1319
|
|
1316
1320
|
# Test the in_degree method.
|
@@ -1340,18 +1344,18 @@ module TestTree
|
|
1340
1344
|
setup_test_tree
|
1341
1345
|
|
1342
1346
|
expected_json = {
|
1343
|
-
|
1344
|
-
|
1345
|
-
|
1346
|
-
|
1347
|
-
{
|
1348
|
-
{
|
1347
|
+
'name' => 'ROOT',
|
1348
|
+
'content' => 'Root Node',
|
1349
|
+
JSON.create_id => 'Tree::TreeNode',
|
1350
|
+
'children' => [
|
1351
|
+
{'name' => 'Child1', 'content' => 'Child Node 1', JSON.create_id => 'Tree::TreeNode'},
|
1352
|
+
{'name' => 'Child2', 'content' => 'Child Node 2', JSON.create_id => 'Tree::TreeNode'},
|
1349
1353
|
{
|
1350
|
-
|
1351
|
-
|
1352
|
-
|
1353
|
-
|
1354
|
-
{
|
1354
|
+
'name' => 'Child3',
|
1355
|
+
'content' => 'Child Node 3',
|
1356
|
+
JSON.create_id => 'Tree::TreeNode',
|
1357
|
+
'children' => [
|
1358
|
+
{'name' => 'Child4', 'content' => 'Grand Child 1', JSON.create_id => 'Tree::TreeNode'}
|
1355
1359
|
]
|
1356
1360
|
}
|
1357
1361
|
]
|
@@ -1362,18 +1366,18 @@ module TestTree
|
|
1362
1366
|
|
1363
1367
|
def test_json_deserialization
|
1364
1368
|
tree_as_json = {
|
1365
|
-
|
1366
|
-
|
1367
|
-
|
1368
|
-
|
1369
|
-
{
|
1370
|
-
{
|
1369
|
+
'name' => 'ROOT',
|
1370
|
+
'content' => 'Root Node',
|
1371
|
+
JSON.create_id => 'Tree::TreeNode',
|
1372
|
+
'children' => [
|
1373
|
+
{'name' => 'Child1', 'content' => 'Child Node 1', JSON.create_id => 'Tree::TreeNode'},
|
1374
|
+
{'name' => 'Child2', 'content' => 'Child Node 2', JSON.create_id => 'Tree::TreeNode'},
|
1371
1375
|
{
|
1372
|
-
|
1373
|
-
|
1374
|
-
|
1375
|
-
|
1376
|
-
{
|
1376
|
+
'name' => 'Child3',
|
1377
|
+
'content' => 'Child Node 3',
|
1378
|
+
JSON.create_id => 'Tree::TreeNode',
|
1379
|
+
'children' => [
|
1380
|
+
{'name' => 'Child4', 'content' => 'Grand Child 1', JSON.create_id => 'Tree::TreeNode'}
|
1377
1381
|
]
|
1378
1382
|
}
|
1379
1383
|
]
|
@@ -1381,30 +1385,30 @@ module TestTree
|
|
1381
1385
|
|
1382
1386
|
tree = JSON.parse(tree_as_json, :create_additions => true)
|
1383
1387
|
|
1384
|
-
assert_equal(@root.name, tree.root.name,
|
1385
|
-
assert_equal(@child1.name, tree[0].name,
|
1386
|
-
assert_equal(@child2.name, tree[1].name,
|
1387
|
-
assert_equal(@child3.name, tree[2].name,
|
1388
|
-
assert_equal(@child4.name, tree[2][0].name,
|
1388
|
+
assert_equal(@root.name, tree.root.name, 'Root should be returned')
|
1389
|
+
assert_equal(@child1.name, tree[0].name, 'Child 1 should be returned')
|
1390
|
+
assert_equal(@child2.name, tree[1].name, 'Child 2 should be returned')
|
1391
|
+
assert_equal(@child3.name, tree[2].name, 'Child 3 should be returned')
|
1392
|
+
assert_equal(@child4.name, tree[2][0].name, 'Grand Child 1 should be returned')
|
1389
1393
|
end
|
1390
1394
|
|
1391
|
-
def
|
1392
|
-
root_node = Tree::TreeNode.new(
|
1393
|
-
root_node << Tree::TreeNode.new(
|
1394
|
-
root_node << Tree::TreeNode.new(
|
1395
|
+
def test_json_round_trip
|
1396
|
+
root_node = Tree::TreeNode.new('ROOT', 'Root Content')
|
1397
|
+
root_node << Tree::TreeNode.new('CHILD1', 'Child1 Content') << Tree::TreeNode.new('GRAND_CHILD1', 'GrandChild1 Content')
|
1398
|
+
root_node << Tree::TreeNode.new('CHILD2', 'Child2 Content')
|
1395
1399
|
|
1396
1400
|
j = root_node.to_json
|
1397
1401
|
|
1398
1402
|
k = JSON.parse(j, :create_additions => true)
|
1399
1403
|
|
1400
|
-
assert_equal(k.name, root_node.name,
|
1401
|
-
assert_equal(k[0].name, root_node[0].name,
|
1402
|
-
assert_equal(k[0][0].name, root_node[0][0].name,
|
1403
|
-
assert_equal(k[1].name, root_node[1].name,
|
1404
|
+
assert_equal(k.name, root_node.name, 'Root should be returned')
|
1405
|
+
assert_equal(k[0].name, root_node[0].name, 'Child 1 should be returned')
|
1406
|
+
assert_equal(k[0][0].name, root_node[0][0].name, 'Grand Child 1 should be returned')
|
1407
|
+
assert_equal(k[1].name, root_node[1].name, 'Child 2 should be returned')
|
1404
1408
|
end
|
1405
1409
|
|
1406
1410
|
# Test the old CamelCase method names
|
1407
|
-
def
|
1411
|
+
def test_old_camel_case_names
|
1408
1412
|
setup_test_tree
|
1409
1413
|
|
1410
1414
|
meth_names_to_test = %w{isRoot? isLeaf? hasContent?
|
@@ -1415,19 +1419,20 @@ module TestTree
|
|
1415
1419
|
|
1416
1420
|
require 'structured_warnings'
|
1417
1421
|
|
1418
|
-
DeprecatedMethodWarning.disable do
|
1422
|
+
StructuredWarnings::DeprecatedMethodWarning.disable do
|
1423
|
+
# noinspection RubyResolve
|
1419
1424
|
assert(@root.isRoot?) # Test if the original method is really called
|
1420
1425
|
end
|
1421
1426
|
|
1422
1427
|
meth_names_to_test.each do |meth_name|
|
1423
|
-
assert_warn(DeprecatedMethodWarning) {@root.send(meth_name)}
|
1428
|
+
assert_warn(StructuredWarnings::DeprecatedMethodWarning) {@root.send(meth_name)}
|
1424
1429
|
end
|
1425
1430
|
|
1426
1431
|
# Special Case for printTree to avoid putting stuff on the STDOUT during the unit test.
|
1427
1432
|
begin
|
1428
1433
|
require 'stringio'
|
1429
1434
|
$stdout = StringIO.new
|
1430
|
-
assert_warn(DeprecatedMethodWarning) { @root.send('printTree') }
|
1435
|
+
assert_warn(StructuredWarnings::DeprecatedMethodWarning) { @root.send('printTree') }
|
1431
1436
|
ensure
|
1432
1437
|
$stdout = STDOUT
|
1433
1438
|
end
|
@@ -1438,11 +1443,11 @@ module TestTree
|
|
1438
1443
|
def test_integer_node_names
|
1439
1444
|
|
1440
1445
|
require 'structured_warnings'
|
1441
|
-
assert_warn(StandardWarning) do
|
1442
|
-
@n_root = Tree::TreeNode.new(0,
|
1443
|
-
@n_child1 = Tree::TreeNode.new(1,
|
1444
|
-
@n_child2 = Tree::TreeNode.new(2,
|
1445
|
-
@n_child3 = Tree::TreeNode.new(
|
1446
|
+
assert_warn(StructuredWarnings::StandardWarning) do
|
1447
|
+
@n_root = Tree::TreeNode.new(0, 'Root Node')
|
1448
|
+
@n_child1 = Tree::TreeNode.new(1, 'Child Node 1')
|
1449
|
+
@n_child2 = Tree::TreeNode.new(2, 'Child Node 2')
|
1450
|
+
@n_child3 = Tree::TreeNode.new('three', 'Child Node 3')
|
1446
1451
|
end
|
1447
1452
|
|
1448
1453
|
@n_root << @n_child1
|
@@ -1455,25 +1460,25 @@ module TestTree
|
|
1455
1460
|
assert_equal(@n_root[1, true].name, 1) # This will work, as the flag is now enabled
|
1456
1461
|
|
1457
1462
|
# Sanity check for the "normal" string name cases. Both cases should work.
|
1458
|
-
assert_equal(@n_root[
|
1463
|
+
assert_equal(@n_root['three', false].name, 'three')
|
1459
1464
|
|
1460
|
-
StandardWarning.disable
|
1461
|
-
assert_equal(@n_root[
|
1465
|
+
StructuredWarnings::StandardWarning.disable
|
1466
|
+
assert_equal(@n_root['three', true].name, 'three')
|
1462
1467
|
|
1463
1468
|
# Also ensure that the warning is actually being thrown
|
1464
|
-
StandardWarning.enable
|
1465
|
-
assert_warn(StandardWarning) {assert_equal(@n_root[
|
1469
|
+
StructuredWarnings::StandardWarning.enable
|
1470
|
+
assert_warn(StructuredWarnings::StandardWarning) {assert_equal(@n_root['three', true].name, 'three') }
|
1466
1471
|
end
|
1467
1472
|
|
1468
1473
|
# Test the addition of a node to itself as a child
|
1469
1474
|
def test_add_node_to_self_as_child
|
1470
|
-
root = Tree::TreeNode.new(
|
1475
|
+
root = Tree::TreeNode.new('root')
|
1471
1476
|
|
1472
1477
|
# Lets check the direct parentage scenario
|
1473
1478
|
assert_raise(ArgumentError) {root << root}
|
1474
1479
|
|
1475
1480
|
# And now a scenario where the node addition is done down the hierarchy
|
1476
|
-
child = Tree::TreeNode.new(
|
1481
|
+
child = Tree::TreeNode.new('child')
|
1477
1482
|
assert_raise(ArgumentError) { root << child << root }
|
1478
1483
|
end
|
1479
1484
|
|
@@ -1484,7 +1489,8 @@ module TestTree
|
|
1484
1489
|
leafs = @root.each_leaf
|
1485
1490
|
parents = leafs.collect {|leaf| leaf.parent }
|
1486
1491
|
leafs.each {|leaf| leaf.remove_from_parent!}
|
1487
|
-
parents.each {|parent| assert(parent.is_leaf?)
|
1492
|
+
parents.each {|parent| assert(parent.is_leaf?) unless parent.has_children?
|
1493
|
+
}
|
1488
1494
|
|
1489
1495
|
end
|
1490
1496
|
|
@@ -1498,7 +1504,7 @@ module TestTree
|
|
1498
1504
|
begin
|
1499
1505
|
@root.first_child << @child2
|
1500
1506
|
rescue RuntimeError => e
|
1501
|
-
fail("No error should have been raised for adding a non-sibling duplicate.")
|
1507
|
+
fail("No error #{e} should have been raised for adding a non-sibling duplicate.")
|
1502
1508
|
end
|
1503
1509
|
|
1504
1510
|
end
|
@@ -1520,15 +1526,15 @@ module TestTree
|
|
1520
1526
|
#
|
1521
1527
|
@other_tree = @root.detached_copy
|
1522
1528
|
@other_tree << @child1.detached_copy
|
1523
|
-
@other_tree[
|
1524
|
-
@other_tree[
|
1529
|
+
@other_tree['Child1'] << Tree::TreeNode.new('Child1a', 'GrandChild Node 1a')
|
1530
|
+
@other_tree['Child1'] << Tree::TreeNode.new('Child1b', 'GrandChild Node 1b')
|
1525
1531
|
@other_tree << @child3.detached_copy
|
1526
|
-
@other_tree[
|
1527
|
-
@other_tree[
|
1532
|
+
@other_tree['Child3'] << Tree::TreeNode.new('Child3a', 'GrandChild Node 3a')
|
1533
|
+
@other_tree['Child3']['Child3a'] << Tree::TreeNode.new('Child3a1', 'GreatGrandChild Node 3a1')
|
1528
1534
|
|
1529
1535
|
# And another (different) one so we can test exceptions...
|
1530
|
-
@other_tree2 = Tree::TreeNode.new(
|
1531
|
-
@other_tree2 << Tree::TreeNode.new(
|
1536
|
+
@other_tree2 = Tree::TreeNode.new('ROOT2', 'A different root')
|
1537
|
+
@other_tree2 << Tree::TreeNode.new('new_child1', 'New Child 1')
|
1532
1538
|
end
|
1533
1539
|
|
1534
1540
|
# Test tree merging.
|
@@ -1538,23 +1544,17 @@ module TestTree
|
|
1538
1544
|
|
1539
1545
|
merged_tree = @root.merge(@other_tree)
|
1540
1546
|
|
1541
|
-
# puts "\n\ntest_merge:\n\n"
|
1542
|
-
# @root.print_tree
|
1543
|
-
# puts "\n"
|
1544
|
-
# @other_tree.print_tree
|
1545
|
-
# puts "\n"
|
1546
|
-
# merged_tree.print_tree
|
1547
1547
|
|
1548
|
-
assert(
|
1549
|
-
assert(
|
1550
|
-
assert(
|
1548
|
+
assert(@root['Child1']['Child1a'].nil?, '.merge() has altered self.')
|
1549
|
+
assert(@root['Child1']['Child1b'].nil?, '.merge() has altered self.')
|
1550
|
+
assert(@root['Child3']['Child3a'].nil?, '.merge() has altered self.')
|
1551
1551
|
assert( merged_tree.is_a?(Tree::TreeNode) )
|
1552
|
-
assert(
|
1553
|
-
assert(
|
1554
|
-
assert(
|
1555
|
-
assert(
|
1556
|
-
assert(
|
1557
|
-
assert(
|
1552
|
+
assert(!merged_tree['Child1']['Child1a'].nil?, ".merge() has not included ['Child1']['Child1a'] from other_tree." )
|
1553
|
+
assert(!merged_tree['Child1']['Child1b'].nil?, ".merge() has not included ['Child1']['Child1b'] from other_tree." )
|
1554
|
+
assert(!merged_tree['Child3']['Child3a'].nil?, ".merge() has not included ['Child3']['Child3a'] from other_tree." )
|
1555
|
+
assert(!merged_tree['Child2'].nil?, ".merge() has not included ['Child2'] from self." )
|
1556
|
+
assert(!merged_tree['Child3']['Child3a']['Child3a1'].nil?, ".merge() has not included ['Child3']['Child3a']['Child3a1'] from other_tree." )
|
1557
|
+
assert(!merged_tree['Child3']['Child4'].nil?, ".merge() has not included ['Child3']['Child4'] from self." )
|
1558
1558
|
|
1559
1559
|
assert_raise(ArgumentError) { @root.merge(@other_tree2) }
|
1560
1560
|
assert_raise(TypeError) { @root.merge('ROOT') }
|
@@ -1565,22 +1565,17 @@ module TestTree
|
|
1565
1565
|
setup_test_tree
|
1566
1566
|
setup_other_test_tree
|
1567
1567
|
|
1568
|
-
|
1569
|
-
# @root.print_tree
|
1570
|
-
# puts "\n"
|
1571
|
-
# @other_tree.print_tree
|
1572
|
-
|
1573
|
-
@root.merge!(@other_tree)
|
1568
|
+
@root.merge!(@other_tree)
|
1574
1569
|
|
1575
1570
|
# puts "\n"
|
1576
1571
|
# @root.print_tree
|
1577
1572
|
|
1578
|
-
assert(
|
1579
|
-
assert(
|
1580
|
-
assert(
|
1581
|
-
assert(
|
1582
|
-
assert(
|
1583
|
-
assert(
|
1573
|
+
assert(!@root['Child1']['Child1a'].nil?, ".merge() has not included ['Child1']['Child1a'] from other_tree." )
|
1574
|
+
assert(!@root['Child1']['Child1b'].nil?, ".merge() has not included ['Child1']['Child1b'] from other_tree." )
|
1575
|
+
assert(!@root['Child3']['Child3a'].nil?, ".merge() has not included ['Child3']['Child3a'] from other_tree." )
|
1576
|
+
assert(!@root['Child2'].nil?, ".merge() has not included ['Child2'] from self." )
|
1577
|
+
assert(!@root['Child3']['Child3a']['Child3a1'].nil?, ".merge() has not included ['Child3']['Child3a']['Child3a1'] from other_tree." )
|
1578
|
+
assert(!@root['Child3']['Child4'].nil?, ".merge() has not included ['Child3']['Child4'] from self." )
|
1584
1579
|
|
1585
1580
|
assert_raise(ArgumentError) { @root.merge!(@other_tree2) }
|
1586
1581
|
assert_raise(TypeError) { @root.merge!('ROOT') }
|
@@ -1616,38 +1611,38 @@ module TestTree
|
|
1616
1611
|
end
|
1617
1612
|
|
1618
1613
|
def test_change_parent
|
1619
|
-
root_node = Tree::TreeNode.new(
|
1614
|
+
root_node = Tree::TreeNode.new('OLD_ROOT')
|
1620
1615
|
|
1621
|
-
child_node = Tree::TreeNode.new(
|
1616
|
+
child_node = Tree::TreeNode.new('CHILD')
|
1622
1617
|
assert_equal(0, child_node.node_depth)
|
1623
1618
|
|
1624
1619
|
root_node << child_node
|
1625
|
-
assert_equal(root_node[
|
1620
|
+
assert_equal(root_node['CHILD'].name, 'CHILD')
|
1626
1621
|
assert_equal(0, root_node.node_depth)
|
1627
1622
|
assert_equal(1, child_node.node_depth)
|
1628
1623
|
|
1629
|
-
grandchild_node = Tree::TreeNode.new(
|
1624
|
+
grandchild_node = Tree::TreeNode.new('GRANDCHILD')
|
1630
1625
|
child_node << grandchild_node
|
1631
|
-
assert_equal(root_node[
|
1626
|
+
assert_equal(root_node['CHILD']['GRANDCHILD'].name, 'GRANDCHILD')
|
1632
1627
|
assert_equal(0, root_node.node_depth)
|
1633
1628
|
assert_equal(1, child_node.node_depth)
|
1634
1629
|
assert_equal(2, grandchild_node.node_depth)
|
1635
1630
|
|
1636
|
-
root2_node = Tree::TreeNode.new(
|
1631
|
+
root2_node = Tree::TreeNode.new('NEW_ROOT')
|
1637
1632
|
assert_equal(0, root2_node.node_depth)
|
1638
1633
|
|
1639
1634
|
# Move the grand child to a new root.
|
1640
1635
|
root2_node << grandchild_node
|
1641
|
-
assert_equal(root2_node[
|
1636
|
+
assert_equal(root2_node['GRANDCHILD'].name, 'GRANDCHILD')
|
1642
1637
|
assert_equal(root2_node, grandchild_node.parent)
|
1643
1638
|
assert_equal(1, grandchild_node.node_depth)
|
1644
1639
|
|
1645
1640
|
# Test the move semantics for addition of an existing child node
|
1646
|
-
root1 = Tree::TreeNode.new(
|
1647
|
-
root1 << Tree::TreeNode.new(
|
1648
|
-
root1 << Tree::TreeNode.new(
|
1649
|
-
root1[
|
1650
|
-
assert_equal(root1[
|
1641
|
+
root1 = Tree::TreeNode.new('1')
|
1642
|
+
root1 << Tree::TreeNode.new('2') << Tree::TreeNode.new('4')
|
1643
|
+
root1 << Tree::TreeNode.new('3') << Tree::TreeNode.new('5')
|
1644
|
+
root1['3'] << Tree::TreeNode.new('6')
|
1645
|
+
assert_equal(root1['3']['6'].name, '6')
|
1651
1646
|
|
1652
1647
|
# Create a new tree
|
1653
1648
|
root2 = root1.dup
|
@@ -1655,24 +1650,24 @@ module TestTree
|
|
1655
1650
|
assert_not_same(root1, root2)
|
1656
1651
|
|
1657
1652
|
# Now 'move' the "4" node to the new tree. This should have 'dup' semantics.
|
1658
|
-
root2[
|
1659
|
-
assert_equal(
|
1660
|
-
assert_nil(root1[
|
1653
|
+
root2['3'] << root1['2']['4']
|
1654
|
+
assert_equal('3', root2['3']['4'].parent.name) # This is on the new tree
|
1655
|
+
assert_nil(root1['2']['4']) # This is on the old tree
|
1661
1656
|
|
1662
1657
|
end
|
1663
1658
|
|
1664
1659
|
# Test the path_as_string method.
|
1665
1660
|
def test_path_as_string
|
1666
|
-
j = Tree::TreeNode.new(
|
1667
|
-
f = Tree::TreeNode.new(
|
1668
|
-
k = Tree::TreeNode.new(
|
1669
|
-
a = Tree::TreeNode.new(
|
1670
|
-
d = Tree::TreeNode.new(
|
1671
|
-
h = Tree::TreeNode.new(
|
1672
|
-
z = Tree::TreeNode.new(
|
1673
|
-
p = Tree::TreeNode.new(
|
1674
|
-
t = Tree::TreeNode.new(
|
1675
|
-
e = Tree::TreeNode.new(
|
1661
|
+
j = Tree::TreeNode.new('j')
|
1662
|
+
f = Tree::TreeNode.new('f')
|
1663
|
+
k = Tree::TreeNode.new('k')
|
1664
|
+
a = Tree::TreeNode.new('a')
|
1665
|
+
d = Tree::TreeNode.new('d')
|
1666
|
+
h = Tree::TreeNode.new('h')
|
1667
|
+
z = Tree::TreeNode.new('z')
|
1668
|
+
p = Tree::TreeNode.new('p')
|
1669
|
+
t = Tree::TreeNode.new('t')
|
1670
|
+
e = Tree::TreeNode.new('e')
|
1676
1671
|
|
1677
1672
|
# Create the following Tree
|
1678
1673
|
# j <-- level 0 (Root)
|
@@ -1690,7 +1685,7 @@ module TestTree
|
|
1690
1685
|
h << t
|
1691
1686
|
j << k << z
|
1692
1687
|
|
1693
|
-
assert_equal(t.path_as_string
|
1688
|
+
assert_equal(t.path_as_string, 'j=>f=>h=>t') # Check the default sep.
|
1694
1689
|
|
1695
1690
|
assert_equal(t.path_as_string(' => '), 'j => f => h => t')
|
1696
1691
|
assert_equal(z.path_as_string(' => '), 'j => k => z')
|
@@ -1699,16 +1694,16 @@ module TestTree
|
|
1699
1694
|
|
1700
1695
|
# Test the path_as_array method.
|
1701
1696
|
def test_path_as_array
|
1702
|
-
j = Tree::TreeNode.new(
|
1703
|
-
f = Tree::TreeNode.new(
|
1704
|
-
k = Tree::TreeNode.new(
|
1705
|
-
a = Tree::TreeNode.new(
|
1706
|
-
d = Tree::TreeNode.new(
|
1707
|
-
h = Tree::TreeNode.new(
|
1708
|
-
z = Tree::TreeNode.new(
|
1709
|
-
p = Tree::TreeNode.new(
|
1710
|
-
t = Tree::TreeNode.new(
|
1711
|
-
e = Tree::TreeNode.new(
|
1697
|
+
j = Tree::TreeNode.new('j')
|
1698
|
+
f = Tree::TreeNode.new('f')
|
1699
|
+
k = Tree::TreeNode.new('k')
|
1700
|
+
a = Tree::TreeNode.new('a')
|
1701
|
+
d = Tree::TreeNode.new('d')
|
1702
|
+
h = Tree::TreeNode.new('h')
|
1703
|
+
z = Tree::TreeNode.new('z')
|
1704
|
+
p = Tree::TreeNode.new('p')
|
1705
|
+
t = Tree::TreeNode.new('t')
|
1706
|
+
e = Tree::TreeNode.new('e')
|
1712
1707
|
|
1713
1708
|
# Create the following Tree
|
1714
1709
|
# j <-- level 0 (Root)
|
@@ -1726,9 +1721,9 @@ module TestTree
|
|
1726
1721
|
h << t
|
1727
1722
|
j << k << z
|
1728
1723
|
|
1729
|
-
assert_equal(e.path_as_array,
|
1730
|
-
assert_equal(p.path_as_array,
|
1731
|
-
assert_equal(k.path_as_array,
|
1724
|
+
assert_equal(e.path_as_array, %w(j f a d e))
|
1725
|
+
assert_equal(p.path_as_array, %w(j f h p))
|
1726
|
+
assert_equal(k.path_as_array, %w(j k))
|
1732
1727
|
end
|
1733
1728
|
end
|
1734
1729
|
end
|