PageRenderTime 53ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/test/test_btree.rb

https://github.com/staszek/btree_class
Ruby | 175 lines | 126 code | 28 blank | 21 comment | 3 complexity | f0dd4ca05f74f1f819f1bb76f9ef3894 MD5 | raw file
  1. require "test/unit"
  2. require "lib/btree.rb"
  3. class TestBTree < Test::Unit::TestCase
  4. # Setup tree:
  5. # 0
  6. # [6,12,18]
  7. # // / \ \\
  8. # 1 2 3 4
  9. # [1,2] [7,8] [13,14] [19,20]
  10. #
  11. # Small tree:
  12. # 0
  13. # [4]
  14. # / \
  15. # 1 2
  16. # [2] [6,8]
  17. # / \ / | \
  18. # 3 4 5 6 7
  19. # [1] [3] [5] [7] [9, 10]
  20. #
  21. def setup
  22. # Manual tree bulding - insert nodes(with values)
  23. @tree = BTree.new(:node => Node.new([6, 12, 18]))
  24. @tree.add(Node.new([1, 2]))
  25. @tree.add(Node.new([7, 8]))
  26. @tree.add(Node.new([13, 14]))
  27. @tree.add(Node.new([19, 20]))
  28. @tree.add_sub_trees(0, [1, 2, 3, 4])
  29. # Fast tree bulding - insert values
  30. @small_tree = BTree.new(:n => 3)
  31. @small_tree.add_values( (1..10).to_a)
  32. end
  33. def test_searching
  34. all_nodes = @tree.nodes.all? do |node|
  35. node.keys.all? { |item| @tree.find_value(item)[:find] }
  36. end
  37. assert_equal true, all_nodes
  38. assert_not_equal true, @tree.find_value(24)[:find]
  39. end
  40. def test_brother
  41. assert_equal false, @tree.brother(@tree.nodes[1], :left)
  42. assert_equal false, @tree.brother(@tree.nodes[4], :right)
  43. assert_equal 2, @tree.brother(@tree.nodes[1], :right).id
  44. assert_equal 3, @tree.brother(@tree.nodes[4], :left).id
  45. end
  46. def test_insert
  47. @tree.insert_value(21)
  48. @tree.insert_value(22)
  49. assert_equal [19, 20, 21, 22], @tree.nodes[4].keys
  50. assert_equal false, @tree.insert_value(20)
  51. empty_tree = BTree.new
  52. empty_tree.insert_value(10)
  53. assert_equal [10], empty_tree.nodes[0].keys
  54. end
  55. def test_insert_split
  56. # normal split
  57. @small_tree.insert_value(11)
  58. @small_tree.insert_value(12)
  59. @small_tree.insert_value(13)
  60. @small_tree.insert_value(14)
  61. assert_tree(@small_tree)
  62. assert_equal [10, 12], @small_tree.nodes[16].keys
  63. assert_equal [13, 14], @small_tree.nodes[18].keys
  64. # root split
  65. @small_tree.insert_value(15)
  66. assert_tree(@small_tree)
  67. assert_equal [8], @small_tree.nodes[25].keys
  68. assert_equal [15], @small_tree.nodes[20].keys
  69. end
  70. def test_insert_node_size_wrong
  71. @small_tree.add(Node.new([50,51,52,52,54]))
  72. assert_not_tree(@small_tree)
  73. end
  74. def test_delete_value_in_tree
  75. assert_equal false, @small_tree.delete_value(11)
  76. end
  77. def test_delete_leaf_enough_size
  78. @small_tree.delete_value(10)
  79. assert_equal false, @small_tree.find_value(10)[:find]
  80. assert_equal [9], @small_tree.nodes[12].keys
  81. end
  82. def test_delete_with_brother
  83. @small_tree.delete_value(7)
  84. assert_tree(@small_tree)
  85. assert_equal false, @small_tree.find_value(7)[:find]
  86. assert_equal [6, 9], @small_tree.nodes[9].keys
  87. assert_equal [8], @small_tree.nodes[11].keys
  88. assert_equal [10], @small_tree.nodes[12].keys
  89. end
  90. def test_delete_without_brother
  91. @small_tree.delete_value(5)
  92. assert_tree(@small_tree)
  93. assert_equal false, @small_tree.find_value(5)[:find]
  94. assert_equal [6, 7], @small_tree.nodes[11].keys
  95. assert_equal [8], @small_tree.nodes[9].keys
  96. assert_equal [9, 10], @small_tree.nodes[12].keys
  97. end
  98. def test_delete_not_in_leaf
  99. @small_tree.delete_value(4)
  100. assert_tree(@small_tree)
  101. assert_equal false, @small_tree.find_value(4)[:find]
  102. assert_equal [5], @small_tree.nodes[10].keys
  103. assert_equal [6, 7], @small_tree.nodes[11].keys
  104. assert_equal [9, 10], @small_tree.nodes[12].keys
  105. end
  106. def test_delete_all
  107. @small_tree.delete_value(5)
  108. assert_tree(@small_tree)
  109. @small_tree.delete_value(6)
  110. assert_tree(@small_tree)
  111. @small_tree.delete_value(9)
  112. assert_tree(@small_tree)
  113. @small_tree.delete_value(7)
  114. assert_tree(@small_tree)
  115. @small_tree.delete_value(1)
  116. assert_tree(@small_tree)
  117. @small_tree.delete_value(3)
  118. assert_tree(@small_tree)
  119. @small_tree.delete_value(8)
  120. assert_tree(@small_tree)
  121. @small_tree.delete_value(10)
  122. assert_tree(@small_tree)
  123. @small_tree.delete_value(2)
  124. assert_tree(@small_tree)
  125. @small_tree.delete_value(4)
  126. assert_not_tree(@small_tree)
  127. assert_equal [], @small_tree.nodes[@small_tree.root].keys
  128. end
  129. def test_succ
  130. assert_equal 7, @tree.succ(6)
  131. assert_equal 8, @tree.succ(7)
  132. assert_equal 12, @tree.succ(8)
  133. assert_equal 5, @small_tree.next(4)
  134. assert_equal false, @tree.next(20)
  135. assert_equal false, @tree.next(40)
  136. end
  137. def test_first_value
  138. assert_equal 1, @tree.first_value
  139. assert_equal 1, @small_tree.first_value
  140. end
  141. def assert_tree(tree)
  142. if tree.check_tree then assert(true) else assert(false) end
  143. end
  144. def assert_not_tree(tree)
  145. unless tree.check_tree then assert(true) else assert(false) end
  146. end
  147. end