[#281559] NTLM authentication with httpclient — Jim Clark <diegoslice@...>

I have rewritten my net/http script that I had questions on a couple of

11 messages 2007/12/01

[#281591] question about iterator — Paul Private <paulus4605@...>

dear

15 messages 2007/12/01

[#281603] Identifying a volume as being an iPod — John Joyce <dangerwillrobinsondanger@...>

Does anybody know how to identify a mounted volume as being an iPod ?

21 messages 2007/12/01

[#281612] Why are "Array#push" and "pop" not "push!" and "pop!"? — samppi <rbysamppi@...>

As a novice in Ruby, I love its elegance and consistence; it's now one

30 messages 2007/12/01

[#281653] irb and unix shells — Robert Jones <robertjones21@...>

Can you use irb in place of shells like bash or rc?

21 messages 2007/12/02

[#281779] What are the differences between c++ and Ruby? — "duddilla's" <radhika.duddilla@...>

Hi

13 messages 2007/12/03

[#281810] Everyone's favorite flow control: retry — Charles Oliver Nutter <charles.nutter@...>

Today I was thinking about retry support in JRuby, and figured we've

18 messages 2007/12/03

[#281917] What is the best way to interact with a JDBC database — Venks <venkatesh.mantha@...>

Hi,

14 messages 2007/12/03

[#281965] Rubyisms wanted to shorten code in search program — RichardOnRails <RichardDummyMailbox58407@...>

Hi,

10 messages 2007/12/04

[#282099] Re: Ruby App Distribution — Joe L <superist_joe@...>

I don't see how RubyScript2Exe would work when it's a virtual machine. Would it package the entire virtual machine inside the exe?

12 messages 2007/12/04
[#282102] Re: Ruby App Distribution — "Adam Shelly" <adam.shelly@...> 2007/12/04

On 12/4/07, Joe L <superist_joe@yahoo.com> wrote:

[#282100] I consider this a bug in Ruby... — "Just Another Victim of the Ambient Morality" <ihatespam@...>

I would like to know why the following code doesn't work:

14 messages 2007/12/04

[#282123] Ruby works but not JRuby - when using MySQL Driver — Venks <venkatesh.mantha@...>

Here is the simple Ruby program that works with "Ruby" but gives an

10 messages 2007/12/05

[#282276] Worth an RCR? static_type_check, polymorphic_type_check, quacks_like — John Carter <john.carter@...>

Is there another library like this? I would love it if it were just

17 messages 2007/12/05

[#282277] Capturing STDOUT from a system call (POSIX) into an array — Venks <venkatesh.mantha@...>

What's the best way to capture STDOUT into an Array? I looked at

12 messages 2007/12/05

[#282340] if /hello/ =~line — Peter Loftus <loftuz@...>

Got help with this code earlier its just checking a file for a line

12 messages 2007/12/06

[#282373] function like "function_exits" — Girard Fred <fred.girard@...>

Hi all,

14 messages 2007/12/06

[#282374] regular expression. newbie problem. — Johnathan Smith <stu_09@...>

Hi,

15 messages 2007/12/06
[#282378] Re: regular expression. newbie problem. — Reacher <brandon.g.jones@...> 2007/12/06

On Dec 6, 9:42 am, Johnathan Smith <stu...@hotmail.com> wrote:

[#282413] array iterator that have more arrays that also need iteratio — Raimon Fs <coder@...>

Hello ...

14 messages 2007/12/06
[#282415] Re: array iterator that have more arrays that also need iteratio — Xavier Noria <fxn@...> 2007/12/06

On Dec 6, 2007, at 8:25 PM, Raimon Fs wrote:

[#282447] search-0.0.1 — "ara.t.howard" <ara.t.howard@...>

14 messages 2007/12/06

[#282501] Dynamic local vars — Vasyl Smirnov <vasyl.smirnov@...>

Hi,

14 messages 2007/12/07

[#282605] Word Loop (#149) — Ruby Quiz <james@...>

The three rules of Ruby Quiz:

49 messages 2007/12/07

[#282633] Problem with Hash of Arrays — Jimi Damon <jdamon@...>

I am new to Ruby , but I consider this feature to be a bug.

15 messages 2007/12/07

[#282673] ruby certification — dare ruby <martin@...>

Dear friends,

41 messages 2007/12/08
[#282695] Re: ruby certification — "Austin Ziegler" <halostatue@...> 2007/12/08

On 12/8/07, dare ruby <martin@angleritech.com> wrote:

[#282696] Re: ruby certification — John Joyce <dangerwillrobinsondanger@...> 2007/12/08

Oh, come on.

[#282703] Re: ruby certification — Gregory Seidman <gsslist+ruby@...> 2007/12/08

On Sat, Dec 08, 2007 at 11:25:59PM +0900, John Joyce wrote:

[#282762] Re: ruby certification — Jim Clark <diegoslice@...> 2007/12/09

Gregory Seidman wrote:

[#282779] Re: ruby certification — "Austin Ziegler" <halostatue@...> 2007/12/09

On 12/9/07, Jim Clark <diegoslice@gmail.com> wrote:

[#282942] Re: ruby certification — Jim Clark <diegoslice@...> 2007/12/10

Austin Ziegler wrote:

[#282962] Re: ruby certification — "Todd Benson" <caduceass@...> 2007/12/10

On Dec 10, 2007 12:28 PM, Jim Clark <diegoslice@gmail.com> wrote:

[#282971] Re: ruby certification — "Austin Ziegler" <halostatue@...> 2007/12/10

On 12/10/07, Todd Benson <caduceass@gmail.com> wrote:

[#282684] Looking for a new web framework. — "Tim Uckun" <timuckun@...>

I am looking for a web framework designed to handle multiple domains

16 messages 2007/12/08
[#282752] Re: Looking for a new web framework. — "Mikel Lindsaar" <raasdnil@...> 2007/12/09

Go get Mephisto and put it on rails. Can handle multiple domains, with

[#282748] How much would variable declarations in Ruby make you wince? — "Just Another Victim of the Ambient Morality" <ihatespam@...>

So, I had a conversation with a colleague of mine and he brought up a

60 messages 2007/12/09

[#282822] Confirm My Ruby/GUI investigation? — Wesley Rishel <wes.rishel@...>

I have been reviewing the copious old threads (and the various cited web

14 messages 2007/12/09

[#282995] REXml help - Insert newlines into large xml file — Sean Nakasone <seannakasone@...>

Hello, I have a large xml file that does not have any newlines in it. Can

10 messages 2007/12/11

[#283063] While statements in ruby — Mark Mr <pimea.mark@...>

Hi guys, I have a probably simple question. I dont know how to do

13 messages 2007/12/11

[#283079] opposite .nil? — "Andrew Stone" <stonelists@...>

I've looked around, but could not find a method that is the opposite of

16 messages 2007/12/11

[#283128] How To Avoid Ugly Declerations — Michael Boutros <me@...>

Hello! More and more I find myself having to do something like this:

13 messages 2007/12/12

[#283243] Connecting to Outlook 'Saved Items' folder using win32ole — Alex DeCaria <alex.decaria@...>

Can anyone tell me how to connect to the 'Saved Items' folder in Outlook

11 messages 2007/12/12

[#283396] Showing Running Processes in variable — jackster the jackle <contact@...>

I want to capture the list of running processes on my computer. I am to

13 messages 2007/12/13

[#283432] Newbie Question: What is a class for? — Matthias Borgeson <hibridmatthais@...>

Hello all-

11 messages 2007/12/13

[#283446] Third edition of "Programming Ruby" now in beta — Dave Thomas <dave@...>

Ruby 1.9 is just around the corner, so it looks like a good time to =20

10 messages 2007/12/13

[#283530] Programmer Ping-Pong (#150) — Ruby Quiz <james@...>

The three rules of Ruby Quiz:

43 messages 2007/12/14
[#283538] Re: [QUIZ] Programmer Ping-Pong (#150) — Paul Irofti <bulibuta@...> 2007/12/14

On 2007-12-14, Ruby Quiz <james@grayproductions.net> wrote:

[#283545] Good Ruby IDE for Debian Linux? — "Steckly, Ron" <rsteckly@...>

Hi all,

19 messages 2007/12/14

[#283574] simple way to turn "foo and bar" to "+foo +bar" — Max Williams <toastkid.williams@...>

I want to add a slightly hacky feature into my boolean mysql search

11 messages 2007/12/14

[#283673] Smallest device to code ruby on? — Casimir P <pikselNOSPAMMi@...>

Whats the smallest gadget you can code (and compile) ruby on?

25 messages 2007/12/15

[#283708] autoindenting ruby — "Martin DeMello" <martindemello@...>

Something most of the "IDE roundup" threads seem to pass over lightly

12 messages 2007/12/15

[#283753] Backslashes in Command Line Arguments — Joseph Pecoraro <joepeck02@...>

In writing a script that takes strings on the command line I have run

13 messages 2007/12/16

[#283811] teams -> members -> users — John Griffiths <indiehead@...>

trying to work this out, giving me a headache,

11 messages 2007/12/16

[#283870] Is there any way to pass further the "hidden" block? — "Chiyuan Zhang" <pluskid@...>

Like this:

13 messages 2007/12/17

[#283917] dividing by two and rounding up — Tom Norian <tomnorian@...>

Hey all...I am hoping for a tip

16 messages 2007/12/17

[#283970] Best compiled language for extending Ruby — Sharkie Landshark <shark.fin.soup@...>

I want to write my core logics in a compiled language for 1) performance

26 messages 2007/12/18

[#284001] String#[] behaviour — DNNX <6aLLIaPuMoB@...>

'asd'[0...10] returns 'asd' while 'asd'[-10..-1] returns nil.

14 messages 2007/12/18

[#284037] New to ruby — bigbrother <Cowboyninja@...>

Hey guys, I'm pretty new to ruby. I've got a question

15 messages 2007/12/18

[#284038] Check if directory exists — Florian Schaf <flo.schaf@...>

hi!

13 messages 2007/12/18

[#284082] Hpricot syntax different from Xpath ? — Celine <xhanrot@...>

Hi all

14 messages 2007/12/18

[#284215] best way to distribute? — Pavel Pvl <pavel989@...>

hi, what is the best way to distribute ruby apps without having the end

23 messages 2007/12/19

[#284268] RubyGems 1.0.0 — Eric Hodel <drbrain@...7.net>

Release 1.0.0 fixes several bugs.

24 messages 2007/12/20
[#284328] Re: [ANN] RubyGems 1.0.0 — Jim Morris <ml@...4net.com> 2007/12/20

After trying to install both from the source and from gem update --system

[#284363] RubyGems 1.0.1 — Eric Hodel <drbrain@...7.net>

= Announce: RubyGems Release 1.0.1

12 messages 2007/12/21

[#284462] Matz says namespaces are too hard to implement - why? — Stefan Rusterholz <apeiros@...>

Short primer: What are namespaces?

40 messages 2007/12/22
[#284478] Re: Matz says namespaces are too hard to implement - why? — Robert Klemme <shortcutter@...> 2007/12/22

On 22.12.2007 04:18, Stefan Rusterholz wrote:

[#284479] Re: Matz says namespaces are too hard to implement - why? — Charles Oliver Nutter <charles.nutter@...> 2007/12/22

Robert Klemme wrote:

[#284486] Re: Matz says namespaces are too hard to implement - why? — Stefan Rusterholz <apeiros@...> 2007/12/22

> Or perhaps, the various implementers will be able to answer this

[#284488] Re: Matz says namespaces are too hard to implement - why? — Charles Oliver Nutter <charles.nutter@...> 2007/12/22

Stefan Rusterholz wrote:

[#284491] Re: Matz says namespaces are too hard to implement - why? — Stefan Rusterholz <apeiros@...> 2007/12/22

Charles Oliver Nutter wrote:

[#284493] Re: Matz says namespaces are too hard to implement - why? — Charles Oliver Nutter <charles.nutter@...> 2007/12/22

Stefan Rusterholz wrote:

[#284494] Re: Matz says namespaces are too hard to implement - why? — Stefan Rusterholz <apeiros@...> 2007/12/22

Charles Oliver Nutter wrote:

[#285031] Re: Matz says namespaces are too hard to implement - why? — "Eivind Eklund" <eeklund@...> 2007/12/27

On Dec 22, 2007 4:22 PM, Charles Oliver Nutter <charles.nutter@sun.com> wrote:

[#285115] Re: Matz says namespaces are too hard to implement - why? — Charles Oliver Nutter <charles.nutter@...> 2007/12/28

Eivind Eklund wrote:

[#284644] C++ Functors and Ruby extensions — "Jason Roelofs" <jameskilton@...>

I wonder if anyone has tried to do what I'm doing and if they've come up

10 messages 2007/12/24

[#284651] Trouble with Readline and Building Ruby 1.9 — "James Herdman" <james.herdman@...>

I'm having a little trouble building Ruby 1.9. I'm building on

14 messages 2007/12/24

[#284720] Ruby 1.9.0 is released — Yukihiro Matsumoto <matz@...>

Hi,

54 messages 2007/12/25
[#284729] Re: Ruby 1.9.0 is released — Rk Ch <rollingwoods@...> 2007/12/25

Great christmas gift! Thanks for guys hard worked.

[#284786] Re: Ruby 1.9.0 is released — Yukihiro Matsumoto <matz@...> 2007/12/26

Hi,

[#284800] Re: Ruby 1.9.0 is released — "Jeremy McAnally" <jeremymcanally@...> 2007/12/26

Could you point out some areas that are in dire need of documentation?

[#284731] OT: Polyglot programming article? — Jay Levitt <jay+news@...>

About three or four months ago, I ran across a great article/blog post

10 messages 2007/12/25

[#284772] qt4 bindings, threads — "daniel 虧erud" <daniel.akerud@...>

I couldn't find a mailinglist for the Qt4 Ruby bindings, so I try here. It

11 messages 2007/12/25

[#284867] Destroying an Object — Ken Awamura <ken.awamura@...>

Suppose I create a new object:

19 messages 2007/12/26

[#284894] Purpose of Ruby 1.9? — "=?ISO-8859-2?Q?Rados=B3aw_Bu=B3at?=" <radek.bulat@...>

First of all I want to thank Matz and Ko1 for yours great work! I

26 messages 2007/12/26
[#284896] Re: Purpose of Ruby 1.9? — "Luiz Vitor Martinez Cardoso" <grabber@...> 2007/12/26

WW91IGFyZSBhc2tpbmcgdmVyeSB1c2VmdWxsIHF1ZXN0aW9ucyEgV2VsbC4uLiB3ZSBuZWVkIHdh

[#284905] Re: Purpose of Ruby 1.9? — "Windham, Kristopher R." <kriswindham@...> 2007/12/26

in the Desktop reference by Matz, printed in 2002,

[#284906] Re: Purpose of Ruby 1.9? — "Rick DeNatale" <rick.denatale@...> 2007/12/26

On Dec 26, 2007 5:39 PM, Windham, Kristopher R. <kriswindham@gmail.com> wrote:

[#284918] convert excel spreadsheet to csv — Junkone <junkone1@...>

is there any library to convert excel file to csv.

12 messages 2007/12/27

[#284923] Re: using reg expr with array.index — MonkeeSage <MonkeeSage@...>

On Dec 26, 4:32 pm, Esmail <ebonak_de...@hotmail.com> wrote:

12 messages 2007/12/27

[#284960] Add Array#first= and Array#last= to std lib — "Robert Klemme" <shortcutter@...>

Hi,

35 messages 2007/12/27

[#284980] about method docs — Santanu <thisissantanu@...>

Hello Everybody,

16 messages 2007/12/27

[#285003] Port Ruby on Rails Application — Snoop1990 Snoop1990 <snoopy1990@...>

Hello,

15 messages 2007/12/27

[#285118] testing for 64-bit environment — Tom Metge <tom@...>

subject says it all- anyone know a way to determine if the host system

12 messages 2007/12/28

[#285223] How to jump over the first line in a file? (newbie) — Mark Toth <mark.toth@...>

I have this code:

14 messages 2007/12/28

[#285294] Using "sort!" in a C extension (1.9 problem) — Andre Nathan <andre@...>

Hello

23 messages 2007/12/29
[#285349] Re: Using "sort!" in a C extension (1.9 problem) — "KUBO Takehiro" <kubo@...> 2007/12/30

Hi,

[#285300] Mr Bones - 1.1.0 — "Tim Pease" <tim.pease@...>

Bones

17 messages 2007/12/29

[#285315] Can Ruby be a keylogger on Win/Mac? — Jay Levitt <jay+news@...>

I know the subject's vague; that's because I don't know what I'm talking

14 messages 2007/12/29

[#285475] Best way to download >1GB files — thefed <fedzor@...>

What is the best way to download files from the internet (HTTP) that

19 messages 2007/12/31

Re: [QUIZ] Programmer Ping-Pong (#150)

From: James Koppel <jamesbkoppel@...>
Date: 2007-12-19 02:23:35 UTC
List: ruby-talk #284116
On 12/18/07, Adam Shelly wrote:
>I added test_remove_multiple_nodes - there are definitely a few
>mistakes in the current remove :)

Seems the only mistake was that remove was expecting AVLTree#each to return the node traversed, but it was instead returning the node's data. I modified each to accept the name of a function to be passed to itself, which defaults to data. I made an "identity" method called node, and the passed it in when each is called within remove.

For my test, each and to_a must now accept symbols denoting the type of traversal to be performed, including inorder (the current traversal), preorder, postorder, and level-by-level.

==>avl_tree.rb<==
class AVLTree

  include Enumerable

  # Need something smarter than nil for external nodes
  class ExternalNode
    attr_accessor :parent
    def initialize(parent)
      @parent = parent
    end
    def include?(_)    false              end
    def <<(_)          raise RuntimeError end
    def height;        0                end
    def balance_factor; 0                end
    def left;          self              end
    def right;          self              end
    def each(*args,&iter)                        end
    def left=(node)
      raise(NotImplementedError,
            "external node of #{@parent}")
    end
    def right=(node)
      raise(NotImplementedError,
            "external node of #{@parent}")
    end
    def to_s; '' end
    def to_a; [] end
  end

  class Node
    attr_accessor :data, :parent
    attr_reader :left, :right

    def initialize obj, sortblock
      @parent = nil
      @data  = obj
      @left  = ExternalNode.new(self)
      @right  = ExternalNode.new(self)
      @height = 1
      @compare = sortblock
    end

    def left=(node)
      @height = nil
      @left = node
      node.parent = self
    end

    def right=(node)
      @height = nil
      @right = node
      node.parent = self
    end

    def each(returns=:data,&iter)
      @left.each(&iter)
      iter[self.send(returns)]
      @right.each(&iter)
    end
    
    def node
      self
    end

    def height
      @height || ( [ @left.height, @right.height ].max + 1)
    end

    def << node
      case @compare[node.data,@data]
      when -1
        if Node === @left
          @left << node
        else
          self.left = node
        end
      when 0
        return self            # no dups
      when +1
        if Node === @right
          @right << node
        else
          self.right = node
        end
      end
      rebalance if balance_factor.abs > 1
      @height = nil
    end

    def remove obj
      @height = nil
      case @compare[obj,@data]
      when -1
        if Node === @left
          @left.remove(obj)
        else
          nil
        end
      when 0
        if Node === @left
          largest = nil
          AVLTree.new(@left).each(:node) do |n|
            largest = n if largest.nil? or n.data > largest.data
            largest = n if largest.nil? or n.data > largest.data
          end
          self.data = largest.data
          self.left = largest.left
        elsif Node === @right
          smallest = nil
          AVLTree.new(@right).each(:node) do |n|
            smallest = n if smallest.nil? or n.data < smallest.data
            smallest = n if smallest.nil? or n.data < smallest.data
          end
          self.data  = smallest.data
          self.right = smallest.right
        else
          parent.send :replace_child, self, ExternalNode.new(parent)
        end
        path = self
        while Node === (path = path.parent)
          path.rebalance if path.balance_factor.abs > 1
        end
        self
      when +1
        if Node === @right
          @right.remove(obj)
        else
          nil
        end
      end
    end

    def include? obj
      case obj <=> @data
      when -1 : @left.include?(obj)
      when  0 : true
      when +1 : @right.include?(obj)
      end
    end

    def to_a
      result = @left.to_a
      result << @data
      result.concat @right.to_a
      result
    end

    def [](idx)
        if idx < (leftheight = @left.height)
          @left[idx]
        elsif (idx== leftheight)
          @data
        elsif (idx-=(leftheight+1)) < @right.height
          @right[idx]
        end
    end

    def to_s
      bf = case balance_factor <=> 0
            when -1 : '-' * -balance_factor
            when  0 : '.'
            when  1 : '+' * balance_factor
            end
      "[#{left} "+
        "(#{@data}{#{height}#{bf}}^#{parent.data})"+
        " #{right}]"
    end

    protected

    def balance_factor
      @right.height - @left.height
    end

    def rotate_left
      my_parent, from, to = @parent, self, @right
      temp = @right.left
      @right.left = self
      self.right = temp
      my_parent.send :replace_child, from, to
      to.parent = my_parent
    end

    def rotate_right
      my_parent, from, to = @parent, self, @left
      temp = @left.right
      @left.right = self
      self.left = temp
      my_parent.send :replace_child, from, to
      to.parent = my_parent
    end

    def rebalance
      if (bf = balance_factor) > 1 # right is too high
        if @right.balance_factor < 0
          # double rotate right-left
          # - first the right subtree
          @right.rotate_right
        end
        rotate_left            # single rotate left
      elsif bf < -1            # left must be too high
        if @left.balance_factor > 0
          # double rotate left-right
          # - first force left subtree
          @left.rotate_left
        end
        rotate_right            # single rotate right
      end
    end

    def replace_child(from, to)
      if from.eql? @left
        @left = to
      elsif from.eql? @right
        @right = to
      else
        raise(ArgumentError,
              "#{from} is not a branch of #{self}")
      end
    end

  end

  def initialize(root = nil, &block)
    @root = root
    if block
      raise(ArgumentError,
        "Block argument for #{self.class.name} must" +
        " take 2 arguments and act as sort function"
        ) unless block.arity == 2
    else
      block = proc{|a,b| a<=>b}
    end
    @compare = block
  end

  def empty?
    @root.nil?
  end

  def include?(obj)
    empty? ? false : @root.include?(obj)
  end

  def <<(obj)
    raise(ArgumentError,
          "Objects added to #{self.class.name} must" +
          " respond to <=>"
          ) unless obj.respond_to?(:<=>)

    if empty?
      @root = Node.new(obj, @compare)
      @root.parent = self
    else
      @root << Node.new(obj, @compare)
    end
    self
  end

  def remove(obj)
    @root.remove(obj) unless empty?
  end

  def height
    empty? ? 0 : @root.height
  end

  def [](idx)
    @root[idx]
  end

  def to_a
    empty? ? [] : @root.to_a
  end

  def each(*args,&iter)
    @root.each(*args,&iter) unless empty?
  end

  def to_s
    empty? ? "[]" : @root.to_s
  end

  # Indicates that parent is root in to_s
  def data; '*'; end

  protected

  def replace_child(from, to)
    if @root.eql? from
      @root = to
    else
      raise(ArgumentError,
            "#{from} is not a branch of #{self}")
    end
  end

end
_END_

==>test_avl_tree.rb<==


require "test/unit"
require "avl_tree"

class TestAVLTree < Test::Unit::TestCase
  def setup
    @tree = AVLTree.new
  end

  ##################################################
  # Membership tests
  def test_tree_membership
    assert_equal(true,  @tree.empty?)
    assert_equal(false, @tree.include?(3))

    @tree << 3

    assert_equal(false, @tree.empty?)
    assert_equal(true,  @tree.include?(3))
  end

  def test_tree_should_allow_more_than_one_element
    @tree << 3
    @tree << 4

    assert(@tree.include?(4), "4 not in #{@tree}")
    assert(@tree.include?(3), "3 not in #{@tree}")
  end

  def test_tree_include_many
    0.upto(10) do |i|
      assert_equal(false, @tree.include?(i),
                    "Tree should not include #{i} yet.")
      @tree << i
      0.upto(i) do |j|
        assert_equal(true, @tree.include?(j),
                      "Tree should have 0..#{i},"+
                      " where's #{j}? ")
      end
    end
  end

  # This sits at the intersection of membership
  # and height tests.  We know one node has height 1,
  # and two nodes has height 2, so if we insert one
  # object twice and the height is 1, there must
  # only be one node in the tree.
  def test_tree_does_not_keep_duplicates
    @tree << 'a'
    @tree << 'a'
    assert_equal 1, @tree.height, "one node: #{@tree}"
  end

  ##################################################
  # Height tests
  def test_tree_height_of_one_or_two_nodes_is_N
    @tree << 5
    assert_equal 1, @tree.height, "one node: #{@tree}"
    @tree << 6
    assert_equal 2, @tree.height, "two nodes: #{@tree}"
  end

  def test_tree_height_of_three_nodes_is_two
    @tree << 5
    @tree << 6
    @tree << 7
    assert_equal 2, @tree.height, @tree.to_s
  end

  # RobB: The more precise limit given in [Knuth] is
  # used rather than that from [Wikipedia]
  def test_tree_growth_limit_is_1pt44_log_N
    (1..10).each do |i|
      @tree << i
      limit = ((1.4405 *
                Math::log(i+2.0)/Math::log(2.0)
                ) - 0.3277).ceil
      assert(@tree.height <= limit,
              "Tree of #{i} nodes is too tall by" +
              " #{@tree.height - limit}" +
              " #{@tree}")
    end
  end

  def test_balances_left
    4.downto(1) { |i| @tree << i }
    assert(@tree.height < 4,
            "expected tree height #{@tree.height} < 4")
  end

  def test_balances_right
    1.upto(4) { |i| @tree << i }
    assert(@tree.height < 4,
            "expected tree height #{@tree.height} < 4")
  end

  def test_non_sequential_insertion__part_1
    items = [ 1, 3, 2 ]
    items.each do |i|
      @tree << i
    end
    items.each do |i|
      assert_equal(true, @tree.include?(i),
                    "where is #{i}? ")
    end
  end

  def test_non_sequential_insertion__part_2
    items = [ 3, 1, 2 ]
    items.each do |i|
      @tree << i
    end
    items.each do |i|
      assert_equal(true, @tree.include?(i),
                    "where is #{i}? ")
    end
  end

  ##################################################
  # Access tests (getting data back out)

  # RobB: this tests too much at one time; I sorted ary.
  def test_tree_traverse
    ary = [ 3, 5, 17, 30, 42, 54, 1, 2 ].sort

    ary.each { |n| @tree << n }
    traversal = []
    @tree.each { |n| traversal << n }

    assert_equal(ary.size, traversal.size)

    ary.each do |n|
      assert_equal(true, traversal.include?(n),
                    "#{n} was not visited in tree.")
    end
  end
  
  def test_alternate_traversals
    items = [3,2,4,1,5]
    items.each {|el| @tree << el}
    
    preorder_result = [3,2,1,4,5]
    assert_equal(@tree.to_a(:preorder),preorder_result)
    @tree.each(:preorder) {|el| assert_equal(preorder_result.shift,el)}
    
    inorder_result = [1,2,3,4,5]
    assert_equal(@tree.to_a(:inorder),inorder_result)
    @tree.each(:inorder) {|el| assert_equal(inorder_result.shift,el)}
    
    postorder_result = [1,2,5,4,3]
    assert_equal(@tree.to_a(:postorder),postorder_result)
    @tree.each(:postorder) {|el| assert_equal(postorder_result.shift,el)}
    
    bylevel_result = [3,2,4,1,5]
    assert_equal(@tree.to_a(:by_level),bylevel_result)
    @tree.each(:by_level) {|el| assert_equal(bylevel_result.shift,el)}
  end
    

  def test_tree_find
    [1,2,3,4].each{|n| @tree<<n}
    assert_equal(1, @tree.find{|v|v>0} )
    assert_equal(2, @tree.find{|v|v%2==0} )
  end

  def test_sequential_access
    items = [ 50, 17, 72 ]
    items.each { |n| @tree << n }
    items.sort.each_with_index do |e,i|
      assert_equal(e, @tree[i],
                    "@tree[#{i}] should be like " +
                    "#{items.inspect}.sort[#{i}]")
    end
  end

  # [Knuth] p.473: "The problem of deletion can be solved
  # in O(log N) steps if we approach it correctly."
  def test_remove_node
    @tree << 314
    @tree.remove(314)
    assert_equal(false, @tree.include?(314),
                  '314 still in the tree')
    end

    def test_remove_multiple_nodes
    items = [ 50, 17, 72, 45, 43, 23 ]
    items.each { |n| @tree << n }
    puts @tree, @tree.height
    @tree.remove(50)
    assert_equal(false, @tree.include?(50),
                  '50 still in the tree')
    @tree.remove(72)
    assert_equal(false, @tree.include?(72),
                  '72 still in the tree')
    @tree.remove(45)
    assert_equal(false, @tree.include?(45),
                  '45 still in the tree')
    assert_equal(2, @tree.height)  #tree should have 3 items, height = 2
    end



  ##################################################
  # Interface tests

  def test_custom_comparison_code
    rev_tree = AVLTree.new { |a, b| b <=> a }
    values  = [3, 2, 1]
    values.each { |v| rev_tree << v }
    rev_tree.each { |v| assert_equal(values.shift, v) }

    len_tree = AVLTree.new { |a, b| a.length <=> b.length }
    values  = %w[3 22 111]
    values.each { |v| len_tree << v }
    len_tree.each { |v| assert_equal(values.shift, v) }
  end

end
_END_



      ____________________________________________________________________________________
Never miss a thing.  Make Yahoo your home page. 
http://www.yahoo.com/r/hs


In This Thread

Prev Next