To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / vendor / gems / rubytree-0.5.2 / test / test_tree.rb @ 442:753f1380d6bc

History | View | Annotate | Download (25 KB)

1
#!/usr/bin/env ruby
2

    
3
# testtree.rb
4
#
5
# $Revision: 1.6 $ by $Author: anupamsg $
6
# $Name:  $
7
#
8
# Copyright (c) 2006, 2007 Anupam Sengupta
9
#
10
# All rights reserved.
11
#
12
# Redistribution and use in source and binary forms, with or without modification,
13
# are permitted provided that the following conditions are met:
14
#
15
# - Redistributions of source code must retain the above copyright notice, this
16
#   list of conditions and the following disclaimer.
17
#
18
# - Redistributions in binary form must reproduce the above copyright notice, this
19
#   list of conditions and the following disclaimer in the documentation and/or
20
#   other materials provided with the distribution.
21
#
22
# - Neither the name of the organization nor the names of its contributors may
23
#   be used to endorse or promote products derived from this software without
24
#   specific prior written permission.
25
#
26
#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
29
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
30
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
31
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
32
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
33
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36
#
37

    
38
require 'test/unit'
39
require 'tree'
40

    
41
module TestTree
42
  # Test class for the Tree node.
43
  class TestTreeNode < Test::Unit::TestCase
44

    
45
    Person = Struct::new(:First, :last)
46

    
47
    def setup
48
      @root = Tree::TreeNode.new("ROOT", "Root Node")
49

    
50
      @child1 = Tree::TreeNode.new("Child1", "Child Node 1")
51
      @child2 = Tree::TreeNode.new("Child2", "Child Node 2")
52
      @child3 = Tree::TreeNode.new("Child3", "Child Node 3")
53
      @child4 = Tree::TreeNode.new("Child31", "Grand Child 1")
54

    
55
    end
56

    
57
    # Create this structure for the tests
58
    #
59
    #          +----------+
60
    #          |  ROOT    |
61
    #          +-+--------+
62
    #            |
63
    #            |    +---------------+
64
    #            +----+  CHILD1       |
65
    #            |    +---------------+
66
    #            |
67
    #            |    +---------------+
68
    #            +----+  CHILD2       |
69
    #            |    +---------------+
70
    #            |
71
    #            |    +---------------+   +------------------+
72
    #            +----+  CHILD3       +---+  CHILD4          |
73
    #                 +---------------+   +------------------+
74
    #
75
    def loadChildren
76
      @root << @child1
77
      @root << @child2
78
      @root << @child3 << @child4
79
    end
80

    
81
    def teardown
82
      @root = nil
83
    end
84

    
85
    def test_root_setup
86
      assert_not_nil(@root, "Root cannot be nil")
87
      assert_nil(@root.parent, "Parent of root node should be nil")
88
      assert_not_nil(@root.name, "Name should not be nil")
89
      assert_equal("ROOT", @root.name, "Name should be 'ROOT'")
90
      assert_equal("Root Node", @root.content, "Content should be 'Root Node'")
91
      assert(@root.isRoot?, "Should identify as root")
92
      assert(!@root.hasChildren?, "Cannot have any children")
93
      assert(@root.hasContent?, "This root should have content")
94
      assert_equal(1, @root.size, "Number of nodes should be one")
95
      assert_nil(@root.siblings, "Root cannot have any children")
96

    
97
      assert_raise(RuntimeError) { Tree::TreeNode.new(nil) }
98
    end
99

    
100
    def test_root
101
      loadChildren
102

    
103
      assert_same(@root, @root.root, "Root's root is self")
104
      assert_same(@root, @child1.root, "Root should be ROOT")
105
      assert_same(@root, @child4.root, "Root should be ROOT")
106
    end
107

    
108
    def test_hasContent_eh
109
      aNode = Tree::TreeNode.new("A Node")
110
      assert_nil(aNode.content, "The node should not have content")
111
      assert(!aNode.hasContent?, "The node should not have content")
112

    
113
      aNode.content = "Something"
114
      assert_not_nil(aNode.content, "The node should now have content")
115
      assert(aNode.hasContent?, "The node should now have content")
116
    end
117

    
118
    def test_length
119
      loadChildren
120
      assert_equal(@root.size, @root.length, "Length and size methods should return the same result")
121
    end
122

    
123
    def test_spaceship          # Test the <=> operator.
124
      firstNode  = Tree::TreeNode.new(1)
125
      secondNode = Tree::TreeNode.new(2)
126

    
127
      assert_equal(firstNode <=> nil, +1)
128
      assert_equal(firstNode <=> secondNode, -1)
129

    
130
      secondNode = Tree::TreeNode.new(1)
131
      assert_equal(firstNode <=> secondNode, 0)
132

    
133
      firstNode  = Tree::TreeNode.new("ABC")
134
      secondNode = Tree::TreeNode.new("XYZ")
135

    
136
      assert_equal(firstNode <=> nil, +1)
137
      assert_equal(firstNode <=> secondNode, -1)
138

    
139
      secondNode = Tree::TreeNode.new("ABC")
140
      assert_equal(firstNode <=> secondNode, 0)
141
    end
142

    
143
    def test_to_s
144
      aNode = Tree::TreeNode.new("A Node", "Some Content")
145

    
146
      expectedString = "Node Name: A Node Content: Some Content Parent: <None> Children: 0 Total Nodes: 1"
147

    
148
      assert_equal(expectedString, aNode.to_s, "The string representation should be same")
149
    end
150

    
151
    def test_firstSibling
152
      loadChildren
153

    
154
      assert_same(@root, @root.firstSibling, "Root's first sibling is itself")
155
      assert_same(@child1, @child1.firstSibling, "Child1's first sibling is itself")
156
      assert_same(@child1, @child2.firstSibling, "Child2's first sibling should be child1")
157
      assert_same(@child1, @child3.firstSibling, "Child3's first sibling should be child1")
158
      assert_not_same(@child1, @child4.firstSibling, "Child4's first sibling is itself")
159
    end
160

    
161
    def test_isFirstSibling_eh
162
      loadChildren
163

    
164
      assert(@root.isFirstSibling?, "Root's first sibling is itself")
165
      assert( @child1.isFirstSibling?, "Child1's first sibling is itself")
166
      assert(!@child2.isFirstSibling?, "Child2 is not the first sibling")
167
      assert(!@child3.isFirstSibling?, "Child3 is not the first sibling")
168
      assert( @child4.isFirstSibling?, "Child4's first sibling is itself")
169
    end
170

    
171
    def test_isLastSibling_eh
172
      loadChildren
173

    
174
      assert(@root.isLastSibling?, "Root's last sibling is itself")
175
      assert(!@child1.isLastSibling?, "Child1 is not the last sibling")
176
      assert(!@child2.isLastSibling?, "Child2 is not the last sibling")
177
      assert( @child3.isLastSibling?, "Child3's last sibling is itself")
178
      assert( @child4.isLastSibling?, "Child4's last sibling is itself")
179
    end
180

    
181
    def test_lastSibling
182
      loadChildren
183

    
184
      assert_same(@root, @root.lastSibling, "Root's last sibling is itself")
185
      assert_same(@child3, @child1.lastSibling, "Child1's last sibling should be child3")
186
      assert_same(@child3, @child2.lastSibling, "Child2's last sibling should be child3")
187
      assert_same(@child3, @child3.lastSibling, "Child3's last sibling should be itself")
188
      assert_not_same(@child3, @child4.lastSibling, "Child4's last sibling is itself")
189
    end
190

    
191
    def test_siblings
192
      loadChildren
193

    
194
      siblings = []
195
      @child1.siblings { |sibling| siblings << sibling}
196
      assert_equal(2, siblings.length, "Should have two siblings")
197
      assert(siblings.include?(@child2), "Should have 2nd child as sibling")
198
      assert(siblings.include?(@child3), "Should have 3rd child as sibling")
199

    
200
      siblings.clear
201
      siblings = @child1.siblings
202
      assert_equal(2, siblings.length, "Should have two siblings")
203

    
204
      siblings.clear
205
      @child4.siblings {|sibling| siblings << sibling}
206
      assert(siblings.empty?, "Should not have any children")
207

    
208
    end
209

    
210
    def test_isOnlyChild_eh
211
      loadChildren
212

    
213
      assert(!@child1.isOnlyChild?, "Child1 is not the only child")
214
      assert(!@child2.isOnlyChild?, "Child2 is not the only child")
215
      assert(!@child3.isOnlyChild?, "Child3 is not the only child")
216
      assert( @child4.isOnlyChild?, "Child4 is not the only child")
217
    end
218

    
219
    def test_nextSibling
220
      loadChildren
221

    
222
      assert_equal(@child2, @child1.nextSibling, "Child1's next sibling is Child2")
223
      assert_equal(@child3, @child2.nextSibling, "Child2's next sibling is Child3")
224
      assert_nil(@child3.nextSibling, "Child3 does not have a next sibling")
225
      assert_nil(@child4.nextSibling, "Child4 does not have a next sibling")
226
    end
227

    
228
    def test_previousSibling
229
      loadChildren
230

    
231
      assert_nil(@child1.previousSibling, "Child1 does not have previous sibling")
232
      assert_equal(@child1, @child2.previousSibling, "Child2's previous sibling is Child1")
233
      assert_equal(@child2, @child3.previousSibling, "Child3's previous sibling is Child2")
234
      assert_nil(@child4.previousSibling, "Child4 does not have a previous sibling")
235
    end
236

    
237
    def test_add
238
      assert(!@root.hasChildren?, "Should not have any children")
239

    
240
      @root.add(@child1)
241

    
242
      @root << @child2
243

    
244
      assert(@root.hasChildren?, "Should have children")
245
      assert_equal(3, @root.size, "Should have three nodes")
246

    
247
      @root << @child3 << @child4
248

    
249
      assert_equal(5, @root.size, "Should have five nodes")
250
      assert_equal(2, @child3.size, "Should have two nodes")
251

    
252
      assert_raise(RuntimeError) { @root.add(Tree::TreeNode.new(@child1.name)) }
253

    
254
    end
255

    
256
    def test_remove_bang
257
      @root << @child1
258
      @root << @child2
259

    
260
      assert(@root.hasChildren?, "Should have children")
261
      assert_equal(3, @root.size, "Should have three nodes")
262

    
263
      @root.remove!(@child1)
264
      assert_equal(2, @root.size, "Should have two nodes")
265
      @root.remove!(@child2)
266

    
267
      assert(!@root.hasChildren?, "Should have no children")
268
      assert_equal(1, @root.size, "Should have one node")
269

    
270
      @root << @child1
271
      @root << @child2
272

    
273
      assert(@root.hasChildren?, "Should have children")
274
      assert_equal(3, @root.size, "Should have three nodes")
275

    
276
      @root.removeAll!
277

    
278
      assert(!@root.hasChildren?, "Should have no children")
279
      assert_equal(1, @root.size, "Should have one node")
280

    
281
    end
282

    
283
    def test_removeAll_bang
284
      loadChildren
285
      assert(@root.hasChildren?, "Should have children")
286
      @root.removeAll!
287

    
288
      assert(!@root.hasChildren?, "Should have no children")
289
      assert_equal(1, @root.size, "Should have one node")
290
    end
291

    
292
    def test_removeFromParent_bang
293
      loadChildren
294
      assert(@root.hasChildren?, "Should have children")
295
      assert(!@root.isLeaf?, "Root is not a leaf here")
296

    
297
      child1 = @root[0]
298
      assert_not_nil(child1, "Child 1 should exist")
299
      assert_same(@root, child1.root, "Child 1's root should be ROOT")
300
      assert(@root.include?(child1), "root should have child1")
301
      child1.removeFromParent!
302
      assert_same(child1, child1.root, "Child 1's root should be self")
303
      assert(!@root.include?(child1), "root should not have child1")
304

    
305
      child1.removeFromParent!
306
      assert_same(child1, child1.root, "Child 1's root should still be self")
307
    end
308

    
309
    def test_children
310
      loadChildren
311

    
312
      assert(@root.hasChildren?, "Should have children")
313
      assert_equal(5, @root.size, "Should have four nodes")
314
      assert(@child3.hasChildren?, "Should have children")
315
      assert(!@child3.isLeaf?, "Should not be a leaf")
316

    
317
      children = []
318
      for child in @root.children
319
        children << child
320
      end
321

    
322
      assert_equal(3, children.length, "Should have three direct children")
323
      assert(!children.include?(@root), "Should not have root")
324
      assert(children.include?(@child1), "Should have child 1")
325
      assert(children.include?(@child2), "Should have child 2")
326
      assert(children.include?(@child3), "Should have child 3")
327
      assert(!children.include?(@child4), "Should not have child 4")
328

    
329
      children.clear
330
      children = @root.children
331
      assert_equal(3, children.length, "Should have three children")
332

    
333
    end
334

    
335
    def test_firstChild
336
      loadChildren
337

    
338
      assert_equal(@child1, @root.firstChild, "Root's first child is Child1")
339
      assert_nil(@child1.firstChild, "Child1 does not have any children")
340
      assert_equal(@child4, @child3.firstChild, "Child3's first child is Child4")
341

    
342
    end
343

    
344
    def test_lastChild
345
      loadChildren
346

    
347
      assert_equal(@child3, @root.lastChild, "Root's last child is Child3")
348
      assert_nil(@child1.lastChild, "Child1 does not have any children")
349
      assert_equal(@child4, @child3.lastChild, "Child3's last child is Child4")
350

    
351
    end
352

    
353
    def test_find
354
      loadChildren
355
      foundNode = @root.find { |node| node == @child2}
356
      assert_same(@child2, foundNode, "The node should be Child 2")
357

    
358
      foundNode = @root.find { |node| node == @child4}
359
      assert_same(@child4, foundNode, "The node should be Child 4")
360

    
361
      foundNode = @root.find { |node| node.name == "Child31" }
362
      assert_same(@child4, foundNode, "The node should be Child 4")
363
      foundNode = @root.find { |node| node.name == "NOT PRESENT" }
364
      assert_nil(foundNode, "The node should not be found")
365
    end
366

    
367
    def test_parentage
368
      loadChildren
369

    
370
      assert_nil(@root.parentage, "Root does not have any parentage")
371
      assert_equal([@root], @child1.parentage, "Child1 has Root as its parent")
372
      assert_equal([@child3, @root], @child4.parentage, "Child4 has Child3 and Root as ancestors")
373
    end
374

    
375
    def test_each
376
      loadChildren
377
      assert(@root.hasChildren?, "Should have children")
378
      assert_equal(5, @root.size, "Should have five nodes")
379
      assert(@child3.hasChildren?, "Should have children")
380

    
381
      nodes = []
382
      @root.each { |node| nodes << node }
383

    
384
      assert_equal(5, nodes.length, "Should have FIVE NODES")
385
      assert(nodes.include?(@root), "Should have root")
386
      assert(nodes.include?(@child1), "Should have child 1")
387
      assert(nodes.include?(@child2), "Should have child 2")
388
      assert(nodes.include?(@child3), "Should have child 3")
389
      assert(nodes.include?(@child4), "Should have child 4")
390
    end
391

    
392
    def test_each_leaf
393
      loadChildren
394

    
395
      nodes = []
396
      @root.each_leaf { |node| nodes << node }
397

    
398
      assert_equal(3, nodes.length, "Should have THREE LEAF NODES")
399
      assert(!nodes.include?(@root), "Should not have root")
400
      assert(nodes.include?(@child1), "Should have child 1")
401
      assert(nodes.include?(@child2), "Should have child 2")
402
      assert(!nodes.include?(@child3), "Should not have child 3")
403
      assert(nodes.include?(@child4), "Should have child 4")
404
    end
405

    
406
    def test_parent
407
      loadChildren
408
      assert_nil(@root.parent, "Root's parent should be nil")
409
      assert_equal(@root, @child1.parent, "Parent should be root")
410
      assert_equal(@root, @child3.parent, "Parent should be root")
411
      assert_equal(@child3, @child4.parent, "Parent should be child3")
412
      assert_equal(@root, @child4.parent.parent, "Parent should be root")
413
    end
414

    
415
    def test_indexed_access
416
      loadChildren
417
      assert_equal(@child1, @root[0], "Should be the first child")
418
      assert_equal(@child4, @root[2][0], "Should be the grandchild")
419
      assert_nil(@root["TEST"], "Should be nil")
420
      assert_raise(RuntimeError) { @root[nil] }
421
    end
422

    
423
    def test_printTree
424
      loadChildren
425
      #puts
426
      #@root.printTree
427
    end
428

    
429
    # Tests the binary dumping mechanism with an Object content node
430
    def test_marshal_dump
431
      # Setup Test Data
432
      test_root = Tree::TreeNode.new("ROOT", "Root Node")
433
      test_content = {"KEY1" => "Value1", "KEY2" => "Value2" }
434
      test_child      = Tree::TreeNode.new("Child", test_content)
435
      test_content2 = ["AValue1", "AValue2", "AValue3"]
436
      test_grand_child = Tree::TreeNode.new("Grand Child 1", test_content2)
437
      test_root << test_child << test_grand_child
438

    
439
      # Perform the test operation
440
      data = Marshal.dump(test_root) # Marshal
441
      new_root = Marshal.load(data)  # And unmarshal
442

    
443
      # Test the root node
444
      assert_equal(test_root.name, new_root.name, "Must identify as ROOT")
445
      assert_equal(test_root.content, new_root.content, "Must have root's content")
446
      assert(new_root.isRoot?, "Must be the ROOT node")
447
      assert(new_root.hasChildren?, "Must have a child node")
448

    
449
      # Test the child node
450
      new_child = new_root[test_child.name]
451
      assert_equal(test_child.name, new_child.name, "Must have child 1")
452
      assert(new_child.hasContent?, "Child must have content")
453
      assert(new_child.isOnlyChild?, "Child must be the only child")
454

    
455
      new_child_content = new_child.content
456
      assert_equal(Hash, new_child_content.class, "Class of child's content should be a hash")
457
      assert_equal(test_child.content.size, new_child_content.size, "The content should have same size")
458

    
459
      # Test the grand-child node
460
      new_grand_child = new_child[test_grand_child.name]
461
      assert_equal(test_grand_child.name, new_grand_child.name, "Must have grand child")
462
      assert(new_grand_child.hasContent?, "Grand-child must have content")
463
      assert(new_grand_child.isOnlyChild?, "Grand-child must be the only child")
464

    
465
      new_grand_child_content = new_grand_child.content
466
      assert_equal(Array, new_grand_child_content.class, "Class of grand-child's content should be an Array")
467
      assert_equal(test_grand_child.content.size, new_grand_child_content.size, "The content should have same size")
468
    end
469

    
470
    # marshal_load and marshal_dump are symmetric methods
471
    # This alias is for satisfying ZenTest
472
    alias test_marshal_load test_marshal_dump
473

    
474
    # Test the collect method from the mixed-in Enumerable functionality.
475
    def test_collect
476
      loadChildren
477
      collectArray = @root.collect do |node|
478
        node.content = "abc"
479
        node
480
      end
481
      collectArray.each {|node| assert_equal("abc", node.content, "Should be 'abc'")}
482
    end
483

    
484
    # Test freezing the tree
485
    def test_freezeTree_bang
486
      loadChildren
487
      @root.content = "ABC"
488
      assert_equal("ABC", @root.content, "Content should be 'ABC'")
489
      @root.freezeTree!
490
      assert_raise(TypeError) {@root.content = "123"}
491
      assert_raise(TypeError) {@root[0].content = "123"}
492
    end
493

    
494
    # Test whether the content is accesible
495
    def test_content
496
      pers = Person::new("John", "Doe")
497
      @root.content = pers
498
      assert_same(pers, @root.content, "Content should be the same")
499
    end
500

    
501
    # Test the depth computation algorithm
502
    def test_depth
503
      assert_equal(1, @root.depth, "A single node's depth is 1")
504

    
505
      @root << @child1
506
      assert_equal(2, @root.depth, "This should be of depth 2")
507

    
508
      @root << @child2
509
      assert_equal(2, @root.depth, "This should be of depth 2")
510

    
511
      @child2 << @child3
512
      assert_equal(3, @root.depth, "This should be of depth 3")
513
      assert_equal(2, @child2.depth, "This should be of depth 2")
514

    
515
      @child3 << @child4
516
      assert_equal(4, @root.depth, "This should be of depth 4")
517
    end
518

    
519
    # Test the breadth computation algorithm
520
    def test_breadth
521
      assert_equal(1, @root.breadth, "A single node's breadth is 1")
522

    
523
      @root << @child1
524
      assert_equal(1, @root.breadth, "This should be of breadth 1")
525

    
526
      @root << @child2
527
      assert_equal(2, @child1.breadth, "This should be of breadth 2")
528
      assert_equal(2, @child2.breadth, "This should be of breadth 2")
529

    
530
      @root << @child3
531
      assert_equal(3, @child1.breadth, "This should be of breadth 3")
532
      assert_equal(3, @child2.breadth, "This should be of breadth 3")
533

    
534
      @child3 << @child4
535
      assert_equal(1, @child4.breadth, "This should be of breadth 1")
536
    end
537

    
538
    # Test the breadth for each
539
    def test_breadth_each
540
      j = Tree::TreeNode.new("j")
541
      f = Tree::TreeNode.new("f")
542
      k = Tree::TreeNode.new("k")
543
      a = Tree::TreeNode.new("a")
544
      d = Tree::TreeNode.new("d")
545
      h = Tree::TreeNode.new("h")
546
      z = Tree::TreeNode.new("z")
547

    
548
      # The expected order of response
549
      expected_array = [j,
550
                        f, k,
551
                        a, h, z,
552
                        d]
553

    
554
      # Create the following Tree
555
      #        j         <-- level 0 (Root)
556
      #      /   \
557
      #     f      k     <-- level 1
558
      #   /   \      \
559
      #  a     h      z  <-- level 2
560
      #   \
561
      #    d             <-- level 3
562
      j << f << a << d
563
      f << h
564
      j << k << z
565

    
566
      # Create the response
567
      result_array = Array.new
568
      j.breadth_each { |node| result_array << node.detached_copy }
569

    
570
      expected_array.each_index do |i|
571
        assert_equal(expected_array[i].name, result_array[i].name)      # Match only the names.
572
      end
573
    end
574

    
575

    
576
    def test_preordered_each
577
      j = Tree::TreeNode.new("j")
578
      f = Tree::TreeNode.new("f")
579
      k = Tree::TreeNode.new("k")
580
      a = Tree::TreeNode.new("a")
581
      d = Tree::TreeNode.new("d")
582
      h = Tree::TreeNode.new("h")
583
      z = Tree::TreeNode.new("z")
584

    
585
      # The expected order of response
586
      expected_array = [j, f, a, d, h, k, z]
587

    
588
      # Create the following Tree
589
      #        j         <-- level 0 (Root)
590
      #      /   \
591
      #     f      k     <-- level 1
592
      #   /   \      \
593
      #  a     h      z  <-- level 2
594
      #   \
595
      #    d             <-- level 3
596
      j << f << a << d
597
      f << h
598
      j << k << z
599

    
600
      result_array = []
601
      j.preordered_each { |node| result_array << node.detached_copy}
602

    
603
      expected_array.each_index do |i|
604
        # Match only the names.
605
        assert_equal(expected_array[i].name, result_array[i].name)
606
      end
607
    end
608

    
609
    def test_detached_copy
610
      loadChildren
611

    
612
      assert(@root.hasChildren?, "The root should have children")
613
      copy_of_root = @root.detached_copy
614
      assert(!copy_of_root.hasChildren?, "The copy should not have children")
615
      assert_equal(@root.name, copy_of_root.name, "The names should be equal")
616

    
617
      # Try the same test with a child node
618
      assert(!@child3.isRoot?, "Child 3 is not a root")
619
      assert(@child3.hasChildren?, "Child 3 has children")
620
      copy_of_child3 = @child3.detached_copy
621
      assert(copy_of_child3.isRoot?, "Child 3's copy is a root")
622
      assert(!copy_of_child3.hasChildren?, "Child 3's copy does not have children")
623
    end
624

    
625
    def test_hasChildren_eh
626
      loadChildren
627
      assert(@root.hasChildren?, "The Root node MUST have children")
628
    end
629

    
630
    def test_isLeaf_eh
631
      loadChildren
632
      assert(!@child3.isLeaf?, "Child 3 is not a leaf node")
633
      assert(@child4.isLeaf?, "Child 4 is a leaf node")
634
    end
635

    
636
    def test_isRoot_eh
637
      loadChildren
638
      assert(@root.isRoot?, "The ROOT node must respond as the root node")
639
    end
640

    
641
    def test_content_equals
642
      @root.content = nil
643
      assert_nil(@root.content, "Root's content should be nil")
644
      @root.content = "ABCD"
645
      assert_equal("ABCD", @root.content, "Root's content should now be 'ABCD'")
646
    end
647

    
648
    def test_size
649
      assert_equal(1, @root.size, "Root's size should be 1")
650
      loadChildren
651
      assert_equal(5, @root.size, "Root's size should be 5")
652
      assert_equal(2, @child3.size, "Child 3's size should be 2")
653
    end
654

    
655
    def test_lt2                # Test the << method
656
      @root << @child1
657
      @root << @child2
658
      @root << @child3 << @child4
659
      assert_not_nil(@root['Child1'], "Child 1 should have been added to Root")
660
      assert_not_nil(@root['Child2'], "Child 2 should have been added to Root")
661
      assert_not_nil(@root['Child3'], "Child 3 should have been added to Root")
662
      assert_not_nil(@child3['Child31'], "Child 31 should have been added to Child3")
663
    end
664

    
665
    def test_index              #  Test the [] method
666
      assert_raise(RuntimeError) {@root[nil]}
667

    
668
      @root << @child1
669
      @root << @child2
670
      assert_equal(@child1.name, @root['Child1'].name, "Child 1 should be returned")
671
      assert_equal(@child1.name, @root[0].name, "Child 1 should be returned")
672
      assert_equal(@child2.name, @root['Child2'].name, "Child 2 should be returned")
673
      assert_equal(@child2.name, @root[1].name, "Child 2 should be returned")
674

    
675
      assert_nil(@root['Some Random Name'], "Should return nil")
676
      assert_nil(@root[99], "Should return nil")
677
    end
678
  end
679
end
680

    
681
__END__
682

683
# $Log: test_tree.rb,v $
684
# Revision 1.6  2007/12/22 00:28:59  anupamsg
685
# Added more test cases, and enabled ZenTest compatibility.
686
#
687
# Revision 1.5  2007/12/19 02:24:18  anupamsg
688
# Updated the marshalling logic to handle non-string contents on the nodes.
689
#
690
# Revision 1.4  2007/10/02 03:38:11  anupamsg
691
# Removed dependency on the redundant "Person" class.
692
# (TC_TreeTest::test_comparator): Added a new test for the spaceship operator.
693
# (TC_TreeTest::test_hasContent): Added tests for hasContent? and length methods.
694
#
695
# Revision 1.3  2007/10/02 03:07:30  anupamsg
696
# * Rakefile: Added an optional task for rcov code coverage.
697
#
698
# * test/test_binarytree.rb: Removed the unnecessary dependency on "Person" class.
699
#
700
# * test/test_tree.rb: Removed dependency on the redundant "Person" class.
701
#
702
# Revision 1.2  2007/08/31 01:16:28  anupamsg
703
# Added breadth and pre-order traversals for the tree. Also added a method
704
# to return the detached copy of a node from the tree.
705
#
706
# Revision 1.1  2007/07/21 04:52:38  anupamsg
707
# Renamed the test files.
708
#
709
# Revision 1.13  2007/07/18 22:11:50  anupamsg
710
# Added depth and breadth methods for the TreeNode.
711
#
712
# Revision 1.12  2007/07/18 07:17:34  anupamsg
713
# Fixed a  issue where TreeNode.ancestors was shadowing Module.ancestors. This method
714
# has been renamed to TreeNode.parentage.
715
#
716
# Revision 1.11  2007/07/17 03:39:29  anupamsg
717
# Moved the CVS Log keyword to end of the files.
718
#