test/tree.rb in compsci-0.0.3.1 vs test/tree.rb in compsci-0.1.0.1

- old
+ new

@@ -1,73 +1,10 @@ require 'compsci/tree' require 'minitest/autorun' include CompSci -describe Node do - before do - @martin_sheen = Node.new 'martin' - @charlie_sheen = Node.new 'charlie' - @emilio_estevez = Node.new 'emilio' - end - - it "must start with no children" do - [@martin_sheen, @charlie_sheen, @emilio_estevez].each { |n| - n.children.must_be_empty - } - end - - it "must track children" do - @charlie_sheen.add_parent(@martin_sheen) - @martin_sheen.children.must_include @charlie_sheen - - @martin_sheen.children.wont_include @emilio_estevez - @martin_sheen.add_child @emilio_estevez - @martin_sheen.children.must_include @emilio_estevez - end - - it "must create children from scalars" do - @martin_sheen.new_child 'fake_emilio' - @martin_sheen.children.size.must_equal 1 - @martin_sheen.children.first.value.must_equal 'fake_emilio' - @martin_sheen.children.wont_include @emilio_estevez - end -end - -describe ChildNode do - before do - @martin_sheen = ChildNode.new 'martin' - @charlie_sheen = ChildNode.new 'charlie' - @emilio_estevez = ChildNode.new 'emilio' - end - - it "must start with neither parent nor children" do - [@martin_sheen, @charlie_sheen, @emilio_estevez].each { |n| - n.parent.nil?.must_equal true - n.children.must_be_empty - } - end - - it "must track parent and children" do - @charlie_sheen.add_parent(@martin_sheen) - @charlie_sheen.parent.must_equal @martin_sheen - @martin_sheen.children.must_include @charlie_sheen - - @martin_sheen.children.wont_include @emilio_estevez - @martin_sheen.add_child @emilio_estevez - @martin_sheen.children.must_include @emilio_estevez - @emilio_estevez.parent.must_equal @martin_sheen - end - - it "must create children from scalars" do - @martin_sheen.new_child 'fake_emilio' - @martin_sheen.children.size.must_equal 1 - @martin_sheen.children.first.value.must_equal 'fake_emilio' - @martin_sheen.children.wont_include @emilio_estevez - end -end - describe Tree do before do @tree = Tree.new(Node, 42) @vals = Array.new(99) { rand 99 } end @@ -125,29 +62,68 @@ visited.must_equal [0, 1, 2, 3, 4, 9, 10, 5, 6, 7, 8, 11, 12, 13, 14] end end describe NaryTree do + describe "with Node" do + before do + @tree = NaryTree.new(Node, 42, child_slots: 3) + end + + it "must have an open parent" do + @tree.open_parent?(@tree.root).must_equal true + @tree.open_parent?(@tree.open_parent).must_equal true + end + + it "must push a value onto an open parent" do + op = @tree.open_parent + opc = op.children.size + @tree.push 5 + @tree.open_parent.children.size.must_equal opc + 1 + end + end + + describe "with ChildNode" do + before do + @tree = NaryTree.new(ChildNode, 42, child_slots: 4) + end + + it "must have an open parent" do + @tree.open_parent?(@tree.root).must_equal true + @tree.open_parent?(@tree.open_parent).must_equal true + end + + it "must push a value onto an open parent" do + op = @tree.open_parent + opc = op.children.size + @tree.push 5 + @tree.open_parent.children.size.must_equal opc + 1 + end + end +end + +describe "BinaryTree" do before do - @tree = NaryTree.new(ChildNode, 42, child_slots: 3) + @tree = BinaryTree.new(Node, 42) end - it "must have an open parent" do - @tree.open_parent?(@tree.root).must_equal true - @tree.open_parent?(@tree.open_parent).must_equal true + it "must have 2 child_slots" do + @tree.child_slots.must_equal 2 end - it "must push a value onto an open parent" do - op = @tree.open_parent - opc = op.children.size - @tree.push 5 - @tree.open_parent.children.size.must_equal opc + 1 + it "must to_s" do + item_count = 31 + # tree already has a root node + (item_count - 1).times { @tree.push rand 99 } + str = @tree.to_s + line_count = str.split("\n").size + line_count.must_equal Math.log(item_count + 1, 2).ceil end describe "searching" do before do - @tree = NaryTree.new(ChildNode, 42, child_slots: 2) + @tree = NaryTree.new(Node, 42, child_slots: 2) 99.times { |i| @tree.push i } end it "must find 42 quickly" do count = 0 @@ -193,172 +169,8 @@ @tree.bf_search { |n| count += 1 n.value == 81 } count.must_equal 83 - end - end -end - -describe BinaryTree do - before do - @tree = BinaryTree.new(ChildNode, 42) - end - - it "must have 2 child_slots" do - @tree.child_slots.must_equal 2 - end - - it "must to_s" do - item_count = 31 - # tree already has a root node - (item_count - 1).times { @tree.push rand 99 } - str = @tree.to_s - line_count = str.split("\n").size - line_count.must_equal Math.log(item_count + 1, 2).ceil - end -end - -describe CompleteBinaryTree do - it "must calculate a parent index" do - valid = { - 1 => 0, - 2 => 0, - 3 => 1, - 4 => 1, - 5 => 2, - 6 => 2, - 7 => 3, - 8 => 3, - 9 => 4, - 10 => 4, - } - - invalid = { - 0 => -1, - -1 => -1, - -2 => -2, - } - valid.each { |idx, pidx| - CompleteBinaryTree.parent_idx(idx).must_equal pidx - } - invalid.each { |idx, pidx| - CompleteBinaryTree.parent_idx(idx).must_equal pidx - } - end - - it "must calculate children indices" do - valid = { - 0 => [1, 2], - 1 => [3, 4], - 2 => [5, 6], - 3 => [7, 8], - 4 => [9, 10], - 5 => [11, 12], - 6 => [13, 14], - 7 => [15, 16], - 8 => [17, 18], - 9 => [19, 20], - 10 => [21, 22], - } - - invalid = { - -3 => [-5, -4], - -2 => [-3, -2], - -1 => [-1, 0], - } - - valid.each { |idx, cidx| - CompleteBinaryTree.children_idx(idx).must_equal cidx - } - invalid.each { |idx, cidx| - CompleteBinaryTree.children_idx(idx).must_equal cidx - } - end - - describe "instance" do - before do - @array = (0..99).sort_by { rand } - @empty = CompleteBinaryTree.new - @nonempty = CompleteBinaryTree.new(store: @array) - end - - it "must have a size" do - @empty.size.must_equal 0 - @nonempty.size.must_equal @array.size - end - - it "must have a last_idx, nil when empty" do - @empty.last_idx.nil?.must_equal true - @nonempty.last_idx.must_equal 99 - end - end -end - -describe CompleteNaryTree do - it "must calculate a parent index for N=3" do - valid = { - 1 => 0, - 2 => 0, - 3 => 0, - 4 => 1, - 5 => 1, - 6 => 1, - 7 => 2, - 8 => 2, - 9 => 2, - 10 => 3, - } - - invalid = { - 0 => -1, - -1 => -1, - -2 => -1, - } - valid.each { |idx, pidx| - CompleteNaryTree.parent_idx(idx, 3).must_equal pidx - } - invalid.each { |idx, pidx| - CompleteNaryTree.parent_idx(idx, 3).must_equal pidx - } - end - - it "must calculate children indices for N=3" do - valid = { - 0 => [1, 2, 3], - 1 => [4, 5, 6], - 2 => [7, 8, 9], - 3 => [10, 11, 12], - } - - invalid = { - -3 => [-8, -7, -6], - -2 => [-5, -4, -3], - -1 => [-2, -1, 0], - } - - valid.each { |idx, cidx| - CompleteNaryTree.children_idx(idx, 3).must_equal cidx - } - invalid.each { |idx, cidx| - CompleteNaryTree.children_idx(idx, 3).must_equal cidx - } - end - - describe "instance" do - before do - @array = (0..99).sort_by { rand } - @empty = CompleteNaryTree.new(child_slots: 5) - @nonempty = CompleteNaryTree.new(store: @array, child_slots: 3) - end - - it "must have a size" do - @empty.size.must_equal 0 - @nonempty.size.must_equal @array.size - end - - it "must have a last_idx, nil when empty" do - @empty.last_idx.nil?.must_equal true - @nonempty.last_idx.must_equal 99 end end end