ruby-poker 0.3.0 → 0.3.1
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.
- data/CHANGELOG +8 -0
- data/README.rdoc +51 -0
- data/Rakefile +30 -23
- data/lib/card.rb +7 -0
- data/lib/ruby-poker.rb +18 -4
- data/ruby-poker.gemspec +32 -0
- data/test/test_card.rb +4 -0
- data/test/test_poker_hand.rb +178 -133
- metadata +14 -14
- data/README +0 -63
    
        data/CHANGELOG
    CHANGED
    
    | @@ -1,3 +1,11 @@ | |
| 1 | 
            +
            2009-01-24 (0.3.1)
         | 
| 2 | 
            +
                * Bug [#23623] undefined method <=> for nil:NilClass
         | 
| 3 | 
            +
                
         | 
| 4 | 
            +
            2008-12-30 (0.3.1)
         | 
| 5 | 
            +
                * Bug (#20407) Raise an exception when creating a new hand with duplicates
         | 
| 6 | 
            +
                * Added PokerHand#uniq method
         | 
| 7 | 
            +
                * Removed deprecated `Gem::manage_gems` from Rakefile
         | 
| 8 | 
            +
             | 
| 1 9 | 
             
            2008-05-17 (0.3.0)
         | 
| 2 10 | 
             
                * Changed Card#== to compare based on card suit and face value. Before it only compared the face value of two cards. Warning: This change may potentially break your program if you were comparing Card objects directly.
         | 
| 3 11 | 
             
                * Replaced `PokerHand#arranged_hand` with `PokerHand#sort_using_rank` which is more descriptive. This loosely corresponds to bug #20194.
         | 
    
        data/README.rdoc
    ADDED
    
    | @@ -0,0 +1,51 @@ | |
| 1 | 
            +
            = Poker library in Ruby
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            == Author
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            Rob Olson (rko618 [at] gmail)
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            == Description
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            Ruby-Poker handles the logic for getting the rank of a poker hand. It can also be used to compare two or more hands to determine which hand has the highest poker value.
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            Card representations can be passed to the PokerHand constructor as a string or an array. Face cards (cards ten, jack, queen, king, and ace) are created using their letter representation (T, J, Q, K, A).
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            == Install
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                sudo gem install ruby-poker
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            == Examples
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            In this section some examples show what can be done with this class.
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                require 'rubygems'
         | 
| 22 | 
            +
                require 'ruby-poker'
         | 
| 23 | 
            +
                
         | 
| 24 | 
            +
                hand1 = PokerHand.new("8H 9C TC JD QH")
         | 
| 25 | 
            +
                hand2 = PokerHand.new(["3D", "3C", "3S", "KD", "AH"])
         | 
| 26 | 
            +
                puts hand1                => 8h 9c Tc Jd Qh (Straight)
         | 
| 27 | 
            +
                puts hand1.just_cards     => 8h 9c Tc Jd Qh
         | 
| 28 | 
            +
                puts hand1.rank           => Straight
         | 
| 29 | 
            +
                puts hand2                => 3d 3c 3s Kd Ah (Three of a kind)
         | 
| 30 | 
            +
                puts hand2.rank           => Three of a kind
         | 
| 31 | 
            +
                puts hand1 > hand2        => true
         | 
| 32 | 
            +
             | 
| 33 | 
            +
            == Duplicates
         | 
| 34 | 
            +
             | 
| 35 | 
            +
            By default ruby-poker will not raise an exception if you add the same card to a hand twice. You can tell ruby-poker to not allow duplicates by doing the following
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                PokerHand.allow_duplicates = false
         | 
| 38 | 
            +
                
         | 
| 39 | 
            +
            Place that line near the beginning of your program. The change is program wide so once allow_duplicates is set to false, _all_ poker hands will raise an exception if a duplicate card is added to the hand.
         | 
| 40 | 
            +
             | 
| 41 | 
            +
            == Compatibility
         | 
| 42 | 
            +
             | 
| 43 | 
            +
            Ruby-Poker is compatible with Ruby 1.8 and Ruby 1.9.
         | 
| 44 | 
            +
             | 
| 45 | 
            +
            == History
         | 
| 46 | 
            +
             | 
| 47 | 
            +
            In the 0.2.0 release Patrick Hurley's Texas Holdem code from http://rubyquiz.com/quiz24.html was merged into ruby-poker.
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            == License
         | 
| 50 | 
            +
             | 
| 51 | 
            +
            This is free software; you can redistribute it and/or modify it under the terms of the BSD license. See LICENSE for more details.
         | 
    
        data/Rakefile
    CHANGED
    
    | @@ -1,6 +1,5 @@ | |
| 1 1 | 
             
            #!/usr/bin/env ruby
         | 
| 2 2 |  | 
| 3 | 
            -
            Gem::manage_gems
         | 
| 4 3 | 
             
            require 'rake/rdoctask'
         | 
| 5 4 | 
             
            require "rake/testtask"
         | 
| 6 5 | 
             
            require 'rake/gempackagetask'
         | 
| @@ -11,32 +10,39 @@ rescue LoadError | |
| 11 10 | 
             
              nil
         | 
| 12 11 | 
             
            end
         | 
| 13 12 |  | 
| 14 | 
            -
            RUBYPOKER_VERSION = "0.3. | 
| 13 | 
            +
            RUBYPOKER_VERSION = "0.3.1"
         | 
| 15 14 |  | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
              s. | 
| 20 | 
            -
              s.summary = "Ruby library for comparing poker hands and determining the winner." 
         | 
| 21 | 
            -
              s.version = RUBYPOKER_VERSION
         | 
| 22 | 
            -
              
         | 
| 15 | 
            +
            spec = Gem::Specification.new do |s|
         | 
| 16 | 
            +
              s.name     = "ruby-poker"
         | 
| 17 | 
            +
              s.version  = RUBYPOKER_VERSION
         | 
| 18 | 
            +
              s.date     = "2009-01-24"
         | 
| 23 19 | 
             
              s.rubyforge_project = "rubypoker"
         | 
| 24 20 | 
             
              s.platform = Gem::Platform::RUBY
         | 
| 21 | 
            +
              s.summary = "Poker library in Ruby"
         | 
| 22 | 
            +
              s.description = "Ruby library for comparing poker hands and determining the winner."
         | 
| 23 | 
            +
              s.author  = "Rob Olson"
         | 
| 24 | 
            +
              s.email    = "rko618@gmail.com"
         | 
| 25 | 
            +
              s.homepage = "http://github.com/robolson/ruby-poker"
         | 
| 26 | 
            +
              s.has_rdoc = true
         | 
| 27 | 
            +
              s.files    = ["CHANGELOG", 
         | 
| 28 | 
            +
            		"examples/deck.rb", 
         | 
| 29 | 
            +
            		"examples/quick_example.rb", 
         | 
| 30 | 
            +
            		"lib/card.rb", 
         | 
| 31 | 
            +
            		"lib/ruby-poker.rb", 
         | 
| 32 | 
            +
            		"LICENSE", 
         | 
| 33 | 
            +
            		"Rakefile", 
         | 
| 34 | 
            +
            		"README.rdoc", 
         | 
| 35 | 
            +
            		"ruby-poker.gemspec"]
         | 
| 36 | 
            +
              s.test_files = ["test/test_card.rb", 
         | 
| 37 | 
            +
                "test/test_poker_hand.rb"]
         | 
| 38 | 
            +
              s.require_paths << 'lib'
         | 
| 25 39 |  | 
| 26 | 
            -
              s. | 
| 27 | 
            -
              s.require_path = "lib" 
         | 
| 28 | 
            -
             | 
| 29 | 
            -
              s.has_rdoc = true 
         | 
| 30 | 
            -
              s.extra_rdoc_files = ["README", "CHANGELOG", "LICENSE"]
         | 
| 40 | 
            +
              s.extra_rdoc_files = ["README.rdoc", "CHANGELOG", "LICENSE"]
         | 
| 31 41 | 
             
              s.rdoc_options << '--title' << 'Ruby Poker Documentation' <<
         | 
| 32 | 
            -
                                '--main'  << 'README' <<
         | 
| 42 | 
            +
                                '--main'  << 'README.rdoc' <<
         | 
| 33 43 | 
             
                                '--inline-source' << '-q'
         | 
| 34 44 |  | 
| 35 | 
            -
              s. | 
| 36 | 
            -
             | 
| 37 | 
            -
              s.author = "Robert Olson"
         | 
| 38 | 
            -
              s.email = "rko618@gmail.com"
         | 
| 39 | 
            -
              s.homepage = "http://rubyforge.org/projects/rubypoker/"
         | 
| 45 | 
            +
              # s.add_dependency("thoughtbot-shoulda", ["> 2.0.0"])
         | 
| 40 46 | 
             
            end
         | 
| 41 47 |  | 
| 42 48 | 
             
            Rake::GemPackageTask.new(spec) do |pkg| 
         | 
| @@ -48,6 +54,7 @@ Rake::TestTask.new do |test| | |
| 48 54 | 
             
              test.libs << "test"
         | 
| 49 55 | 
             
              test.test_files = Dir[ "test/test_*.rb" ]
         | 
| 50 56 | 
             
              test.verbose = true
         | 
| 57 | 
            +
              test.warning = true
         | 
| 51 58 | 
             
            end
         | 
| 52 59 |  | 
| 53 60 | 
             
            desc "Start autotest"
         | 
| @@ -55,9 +62,9 @@ task :autotest do | |
| 55 62 | 
             
              ruby "-I lib -w /usr/bin/autotest"
         | 
| 56 63 | 
             
            end
         | 
| 57 64 |  | 
| 58 | 
            -
            Rake::RDocTask.new(: | 
| 59 | 
            -
              rdoc.rdoc_files.include('README', 'CHANGELOG', 'LICENSE', 'lib/')
         | 
| 60 | 
            -
              rdoc.main     = 'README'
         | 
| 65 | 
            +
            Rake::RDocTask.new(:docs) do |rdoc|
         | 
| 66 | 
            +
              rdoc.rdoc_files.include('README.rdoc', 'CHANGELOG', 'LICENSE', 'lib/')
         | 
| 67 | 
            +
              rdoc.main     = 'README.rdoc'
         | 
| 61 68 | 
             
              rdoc.rdoc_dir = 'doc/html'
         | 
| 62 69 | 
             
              rdoc.title    = 'Ruby Poker Documentation'
         | 
| 63 70 | 
             
              rdoc.options << '--inline-source'
         | 
    
        data/lib/card.rb
    CHANGED
    
    | @@ -115,4 +115,11 @@ class Card | |
| 115 115 | 
             
              def == card2
         | 
| 116 116 | 
             
                @value == card2.value
         | 
| 117 117 | 
             
              end
         | 
| 118 | 
            +
              alias :eql? :==
         | 
| 119 | 
            +
              
         | 
| 120 | 
            +
              # Compute a hash-code for this Card. Two Cards with the same
         | 
| 121 | 
            +
              # content will have the same hash code (and will compare using eql?). 
         | 
| 122 | 
            +
              def hash
         | 
| 123 | 
            +
                @value.hash
         | 
| 124 | 
            +
              end
         | 
| 118 125 | 
             
            end
         | 
    
        data/lib/ruby-poker.rb
    CHANGED
    
    | @@ -27,6 +27,8 @@ class PokerHand | |
| 27 27 | 
             
                else
         | 
| 28 28 | 
             
                  @hand = cards
         | 
| 29 29 | 
             
                end
         | 
| 30 | 
            +
                
         | 
| 31 | 
            +
                check_for_duplicates if !@@allow_duplicates
         | 
| 30 32 | 
             
              end
         | 
| 31 33 |  | 
| 32 34 | 
             
              # Returns a new PokerHand object with the cards sorted by suit
         | 
| @@ -262,7 +264,7 @@ class PokerHand | |
| 262 264 | 
             
              end
         | 
| 263 265 |  | 
| 264 266 | 
             
              # Returns a string of the hand arranged based on its rank. Usually this will be the
         | 
| 265 | 
            -
              # same as  | 
| 267 | 
            +
              # same as by_face but there are some cases where it makes a difference.
         | 
| 266 268 | 
             
              #
         | 
| 267 269 | 
             
              #     ph = PokerHand.new("AS 3S 5S 2S 4S")
         | 
| 268 270 | 
             
              #     ph.sort_using_rank        # => "5s 4s 3s 2s As"
         | 
| @@ -287,7 +289,7 @@ class PokerHand | |
| 287 289 | 
             
              alias :to_ary :to_a
         | 
| 288 290 |  | 
| 289 291 | 
             
              def <=> other_hand
         | 
| 290 | 
            -
                self.score[0] <=> other_hand.score[0]
         | 
| 292 | 
            +
                self.score[0].compact <=> other_hand.score[0].compact
         | 
| 291 293 | 
             
              end
         | 
| 292 294 |  | 
| 293 295 | 
             
              # Add a card to the hand
         | 
| @@ -318,7 +320,13 @@ class PokerHand | |
| 318 320 | 
             
                @hand.delete(Card.new(card))
         | 
| 319 321 | 
             
              end
         | 
| 320 322 |  | 
| 321 | 
            -
               | 
| 323 | 
            +
              # Same concept as Array#uniq
         | 
| 324 | 
            +
              def uniq
         | 
| 325 | 
            +
                PokerHand.new(@hand.uniq)
         | 
| 326 | 
            +
              end
         | 
| 327 | 
            +
              
         | 
| 328 | 
            +
              # Resolving methods are just passed directly down to the @hand array
         | 
| 329 | 
            +
              RESOLVING_METHODS = [:size, :+, :-]
         | 
| 322 330 | 
             
              RESOLVING_METHODS.each do |method|
         | 
| 323 331 | 
             
                class_eval %{
         | 
| 324 332 | 
             
                  def #{method}(*args, &block)
         | 
| @@ -327,7 +335,13 @@ class PokerHand | |
| 327 335 | 
             
                }
         | 
| 328 336 | 
             
              end
         | 
| 329 337 |  | 
| 330 | 
            -
               | 
| 338 | 
            +
              protected
         | 
| 339 | 
            +
              
         | 
| 340 | 
            +
              def check_for_duplicates
         | 
| 341 | 
            +
                if @hand.size != @hand.uniq.size && !@@allow_duplicates
         | 
| 342 | 
            +
                  raise "You are attempting to create a hand that contains duplicate cards. Set PokerHand.allow_duplicates to true if you do not want to ignore this error."
         | 
| 343 | 
            +
                end
         | 
| 344 | 
            +
              end
         | 
| 331 345 |  | 
| 332 346 | 
             
              # if md is a string, arrange_hand will remove extra white space
         | 
| 333 347 | 
             
              # if md is a MatchData, arrange_hand returns the matched segment
         | 
    
        data/ruby-poker.gemspec
    ADDED
    
    | @@ -0,0 +1,32 @@ | |
| 1 | 
            +
            Gem::Specification.new do |s|
         | 
| 2 | 
            +
              s.name     = "ruby-poker"
         | 
| 3 | 
            +
              s.version  = "0.3.1"
         | 
| 4 | 
            +
              s.date     = "2009-01-24"
         | 
| 5 | 
            +
              s.rubyforge_project = "rubypoker"
         | 
| 6 | 
            +
              s.platform = Gem::Platform::RUBY
         | 
| 7 | 
            +
              s.summary = "Poker library in Ruby"
         | 
| 8 | 
            +
              s.description = "Ruby library for comparing poker hands and determining the winner."
         | 
| 9 | 
            +
              s.author  = "Rob Olson"
         | 
| 10 | 
            +
              s.email    = "rko618@gmail.com"
         | 
| 11 | 
            +
              s.homepage = "http://github.com/robolson/ruby-poker"
         | 
| 12 | 
            +
              s.has_rdoc = true
         | 
| 13 | 
            +
              s.files    = ["CHANGELOG", 
         | 
| 14 | 
            +
            		"examples/deck.rb", 
         | 
| 15 | 
            +
            		"examples/quick_example.rb", 
         | 
| 16 | 
            +
            		"lib/card.rb", 
         | 
| 17 | 
            +
            		"lib/ruby-poker.rb", 
         | 
| 18 | 
            +
            		"LICENSE", 
         | 
| 19 | 
            +
            		"Rakefile", 
         | 
| 20 | 
            +
            		"README.rdoc", 
         | 
| 21 | 
            +
            		"ruby-poker.gemspec"]
         | 
| 22 | 
            +
              s.test_files = ["test/test_card.rb", 
         | 
| 23 | 
            +
                "test/test_poker_hand.rb"]
         | 
| 24 | 
            +
              s.require_paths << 'lib'
         | 
| 25 | 
            +
              
         | 
| 26 | 
            +
              s.extra_rdoc_files = ["README", "CHANGELOG", "LICENSE"]
         | 
| 27 | 
            +
              s.rdoc_options << '--title' << 'Ruby Poker Documentation' <<
         | 
| 28 | 
            +
                                '--main'  << 'README.rdoc' <<
         | 
| 29 | 
            +
                                '--inline-source' << '-q'
         | 
| 30 | 
            +
              
         | 
| 31 | 
            +
              # s.add_dependency("thoughtbot-shoulda", ["> 2.0.0"])
         | 
| 32 | 
            +
            end
         | 
    
        data/test/test_card.rb
    CHANGED
    
    
    
        data/test/test_poker_hand.rb
    CHANGED
    
    | @@ -1,165 +1,210 @@ | |
| 1 | 
            -
            require 'test/unit'
         | 
| 2 1 | 
             
            require 'ruby-poker.rb'
         | 
| 2 | 
            +
            require 'rubygems'
         | 
| 3 | 
            +
            require 'shoulda'
         | 
| 3 4 |  | 
| 4 5 | 
             
            class TestPokerHand < Test::Unit::TestCase
         | 
| 5 | 
            -
               | 
| 6 | 
            -
             | 
| 7 | 
            -
                 | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 6 | 
            +
              context "A PokerHand instance" do
         | 
| 7 | 
            +
              
         | 
| 8 | 
            +
                setup do
         | 
| 9 | 
            +
                  @trips = PokerHand.new("2D 9C AS AH AC")
         | 
| 10 | 
            +
                  @full_boat = PokerHand.new(["2H", "2D", "4C", "4D", "4S"])
         | 
| 11 | 
            +
                  @flush = PokerHand.new("3D 6D 7D TD QD 5H 2S")
         | 
| 12 | 
            +
                  @straight = PokerHand.new("8H 9D TS JH QC AS")
         | 
| 13 | 
            +
                end
         | 
| 11 14 |  | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 15 | 
            +
                # there are a lot of combinations that should be tested here. I will add more
         | 
| 16 | 
            +
                # troublesome cases as I think of them.
         | 
| 17 | 
            +
                should "sort using rank" do
         | 
| 18 | 
            +
                  assert_equal("As Ah Ac 9c 2d", @trips.sort_using_rank)
         | 
| 19 | 
            +
                  assert_equal("4s 4d 4c 2h 2d", @full_boat.sort_using_rank)
         | 
| 20 | 
            +
                  assert_equal("Qd Td 7d 6d 3d 2s 5h", @flush.sort_using_rank)
         | 
| 21 | 
            +
                  assert_equal("Qc Jh Ts 9d 8h As", @straight.sort_using_rank)
         | 
| 19 22 |  | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
              def test_by_face
         | 
| 25 | 
            -
                assert_equal([13, 13, 13, 8, 1], @trips.by_face.hand.collect {|c| c.face})
         | 
| 26 | 
            -
              end
         | 
| 27 | 
            -
             | 
| 28 | 
            -
              def test_by_suit
         | 
| 29 | 
            -
                assert_equal([3, 2, 1, 0, 0], @trips.by_suit.hand.collect {|c| c.suit})
         | 
| 30 | 
            -
              end
         | 
| 31 | 
            -
             | 
| 32 | 
            -
              def test_face_values
         | 
| 33 | 
            -
                assert_equal([1, 8, 13, 13, 13], @trips.face_values)
         | 
| 34 | 
            -
              end
         | 
| 23 | 
            +
                  assert_equal("As Ah 3d 3c Kd", PokerHand.new("AS AH KD 3D 3C").sort_using_rank)
         | 
| 24 | 
            +
                  assert_equal("As Ah 3d 3c 2d", PokerHand.new("2D AS AH 3D 3C").sort_using_rank)
         | 
| 25 | 
            +
                end
         | 
| 35 26 |  | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
                 | 
| 39 | 
            -
              end
         | 
| 27 | 
            +
                should "return card sorted by face value" do
         | 
| 28 | 
            +
                  assert_equal([13, 13, 13, 8, 1], @trips.by_face.hand.collect {|c| c.face})
         | 
| 29 | 
            +
                end
         | 
| 40 30 |  | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
                 | 
| 44 | 
            -
              end
         | 
| 31 | 
            +
                should "return cards sorted by suit" do
         | 
| 32 | 
            +
                  assert_equal([3, 2, 1, 0, 0], @trips.by_suit.hand.collect {|c| c.suit})
         | 
| 33 | 
            +
                end
         | 
| 45 34 |  | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 48 | 
            -
                 | 
| 49 | 
            -
             | 
| 35 | 
            +
                should "return just the face values of the cards" do
         | 
| 36 | 
            +
                  assert_equal([1, 8, 13, 13, 13], @trips.face_values)
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
                
         | 
| 39 | 
            +
                should "recognize a straight flush" do
         | 
| 40 | 
            +
                  assert !@flush.straight_flush?
         | 
| 41 | 
            +
                  assert !@straight.straight_flush?
         | 
| 42 | 
            +
                  assert PokerHand.new("8H 9H TH JH QH AS").straight_flush?
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
              
         | 
| 45 | 
            +
                should "recognize a royal flush" do
         | 
| 46 | 
            +
                  assert !@flush.royal_flush?
         | 
| 47 | 
            +
                  assert PokerHand.new("AD KD QD JD TD").royal_flush?
         | 
| 48 | 
            +
                end
         | 
| 50 49 |  | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 50 | 
            +
                should "recognize a flush" do
         | 
| 51 | 
            +
                  assert @flush.flush?
         | 
| 52 | 
            +
                  assert !@trips.flush?
         | 
| 53 | 
            +
                end
         | 
| 55 54 |  | 
| 56 | 
            -
             | 
| 57 | 
            -
             | 
| 58 | 
            -
             | 
| 59 | 
            -
             | 
| 55 | 
            +
                should "recognize a four of a kind" do
         | 
| 56 | 
            +
                  assert !@trips.four_of_a_kind?
         | 
| 57 | 
            +
                  assert PokerHand.new("AD 9C AS AH AC")
         | 
| 58 | 
            +
                end
         | 
| 60 59 |  | 
| 61 | 
            -
             | 
| 62 | 
            -
             | 
| 63 | 
            -
             | 
| 64 | 
            -
             | 
| 60 | 
            +
                should "recognize a full house" do
         | 
| 61 | 
            +
                  assert !@trips.full_house?
         | 
| 62 | 
            +
                  assert @full_boat.full_house?
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
                
         | 
| 65 | 
            +
                should "recognize a straight" do
         | 
| 66 | 
            +
                  assert @straight.straight?
         | 
| 67 | 
            +
                  assert PokerHand.new("AH 2S 3D 4H 5D").straight?
         | 
| 68 | 
            +
                end
         | 
| 65 69 |  | 
| 66 | 
            -
             | 
| 67 | 
            -
             | 
| 68 | 
            -
                 | 
| 69 | 
            -
              end
         | 
| 70 | 
            +
                should "recognize a three of a kind" do
         | 
| 71 | 
            +
                  assert @trips.three_of_a_kind?
         | 
| 72 | 
            +
                end
         | 
| 70 73 |  | 
| 71 | 
            -
             | 
| 72 | 
            -
             | 
| 73 | 
            -
             | 
| 74 | 
            +
                should "recognize a two pair" do
         | 
| 75 | 
            +
                  assert PokerHand.new("2S 2D TH TD 4S").two_pair?
         | 
| 76 | 
            +
                  assert !PokerHand.new("6D 7C 5D 5H 3S").two_pair?
         | 
| 77 | 
            +
                end
         | 
| 78 | 
            +
                
         | 
| 79 | 
            +
                should "recognize a pair" do
         | 
| 80 | 
            +
                  assert !PokerHand.new("5C JC 2H 7S 3D").pair?
         | 
| 81 | 
            +
                  assert PokerHand.new("6D 7C 5D 5H 3S").pair?
         | 
| 82 | 
            +
                end
         | 
| 83 | 
            +
                
         | 
| 84 | 
            +
                should "recognize a hand with the rank highest_card" do
         | 
| 85 | 
            +
                  # hard to test, make sure it does not return null
         | 
| 86 | 
            +
                  assert PokerHand.new("2D 4S 6C 8C TH").highest_card?
         | 
| 87 | 
            +
                end
         | 
| 74 88 |  | 
| 75 | 
            -
             | 
| 76 | 
            -
             | 
| 77 | 
            -
                 | 
| 78 | 
            -
              end
         | 
| 79 | 
            -
              
         | 
| 80 | 
            -
              def test_royal_flush
         | 
| 81 | 
            -
                assert !@flush.royal_flush?
         | 
| 82 | 
            -
                assert PokerHand.new("AD KD QD JD TD").royal_flush?
         | 
| 83 | 
            -
              end
         | 
| 89 | 
            +
                should "have an instance variable hand that is an array of Cards" do
         | 
| 90 | 
            +
                  assert_instance_of Card, @trips.hand[0]
         | 
| 91 | 
            +
                end
         | 
| 84 92 |  | 
| 85 | 
            -
             | 
| 86 | 
            -
             | 
| 87 | 
            -
             | 
| 93 | 
            +
                should "return the hand's rating as a string" do
         | 
| 94 | 
            +
                  assert_equal "Three of a kind", @trips.hand_rating
         | 
| 95 | 
            +
                  assert_equal "Full house", @full_boat.hand_rating
         | 
| 96 | 
            +
                end
         | 
| 88 97 |  | 
| 89 | 
            -
             | 
| 90 | 
            -
             | 
| 91 | 
            -
             | 
| 92 | 
            -
             | 
| 98 | 
            +
                should "respond to rank" do
         | 
| 99 | 
            +
                  # rank is an alias for hand_rating
         | 
| 100 | 
            +
                  assert_respond_to @trips, :rank
         | 
| 101 | 
            +
                end
         | 
| 93 102 |  | 
| 94 | 
            -
             | 
| 95 | 
            -
             | 
| 96 | 
            -
                 | 
| 97 | 
            -
                assert PokerHand.new("8H 9H TH JH QH AS").straight_flush?
         | 
| 98 | 
            -
              end
         | 
| 103 | 
            +
                should "return the hand as a string" do
         | 
| 104 | 
            +
                  assert_equal("2d 9c As Ah Ac", @trips.just_cards)
         | 
| 105 | 
            +
                end
         | 
| 99 106 |  | 
| 100 | 
            -
             | 
| 101 | 
            -
             | 
| 102 | 
            -
             | 
| 107 | 
            +
                should "return the hand's score" do
         | 
| 108 | 
            +
                  assert_equal([4, 13, 8, 1], @trips.score[0])
         | 
| 109 | 
            +
                end
         | 
| 103 110 |  | 
| 104 | 
            -
             | 
| 105 | 
            -
             | 
| 106 | 
            -
             | 
| 107 | 
            -
             | 
| 108 | 
            -
              
         | 
| 109 | 
            -
              def test_matching
         | 
| 110 | 
            -
                assert_match(/9c/, @trips)
         | 
| 111 | 
            -
              end
         | 
| 111 | 
            +
                should "be able to match regular expressions" do
         | 
| 112 | 
            +
                  assert_match(/9c/, @trips.to_s)
         | 
| 113 | 
            +
                  assert_no_match(/AD/, @trips.to_s)
         | 
| 114 | 
            +
                end
         | 
| 112 115 |  | 
| 113 | 
            -
             | 
| 114 | 
            -
             | 
| 115 | 
            -
             | 
| 116 | 
            +
                should "return the correct number of cards in the hand" do
         | 
| 117 | 
            +
                  assert_equal(2, PokerHand.new("2c 3d").size)
         | 
| 118 | 
            +
                end
         | 
| 116 119 |  | 
| 117 | 
            -
             | 
| 118 | 
            -
             | 
| 119 | 
            -
             | 
| 120 | 
            -
             | 
| 121 | 
            -
             | 
| 122 | 
            -
             | 
| 120 | 
            +
                should "be comparable to other PokerHands" do
         | 
| 121 | 
            +
                  hand1 = PokerHand.new("5C JC 2H 5S 3D")
         | 
| 122 | 
            +
                  hand2 = PokerHand.new("6D 7C 5D 5H 3S")
         | 
| 123 | 
            +
                  assert_equal(1, hand1 <=> hand2)
         | 
| 124 | 
            +
                  assert_equal(-1, hand2 <=> hand1)
         | 
| 125 | 
            +
                end
         | 
| 123 126 |  | 
| 124 | 
            -
             | 
| 125 | 
            -
             | 
| 127 | 
            +
                should "be considered equal to other poker hands that contain the same cards" do
         | 
| 128 | 
            +
                  assert_equal(0, @trips <=> @trips)
         | 
| 126 129 |  | 
| 127 | 
            -
             | 
| 128 | 
            -
             | 
| 129 | 
            -
             | 
| 130 | 
            -
             | 
| 130 | 
            +
                  hand1 = PokerHand.new("Ac Qc Ks Kd 9d 3c")
         | 
| 131 | 
            +
                  hand2 = PokerHand.new("Ah Qs 9h Kh Kc 3s")
         | 
| 132 | 
            +
                  assert_equal(0, hand1 <=> hand2)
         | 
| 133 | 
            +
                end
         | 
| 131 134 |  | 
| 132 | 
            -
             | 
| 133 | 
            -
             | 
| 134 | 
            -
             | 
| 135 | 
            -
             | 
| 136 | 
            -
             | 
| 137 | 
            -
             | 
| 138 | 
            -
             | 
| 135 | 
            +
                should "be able to add a Card to itself" do
         | 
| 136 | 
            +
                  ph = PokerHand.new()
         | 
| 137 | 
            +
                  ph << "Qd"
         | 
| 138 | 
            +
                  ph << Card.new("2D")
         | 
| 139 | 
            +
                  ph << ["3d", "4d"]
         | 
| 140 | 
            +
                  assert_equal("Qd 2d 3d 4d", ph.just_cards)
         | 
| 141 | 
            +
                end
         | 
| 139 142 |  | 
| 140 | 
            -
             | 
| 141 | 
            -
             | 
| 142 | 
            -
             | 
| 143 | 
            -
             | 
| 144 | 
            -
             | 
| 143 | 
            +
                should "be able to delete a card" do
         | 
| 144 | 
            +
                  ph = PokerHand.new("Ac")
         | 
| 145 | 
            +
                  ph.delete("Ac")
         | 
| 146 | 
            +
                  assert_equal(Array.new, ph.hand)
         | 
| 147 | 
            +
                end
         | 
| 145 148 |  | 
| 146 | 
            -
             | 
| 147 | 
            -
             | 
| 148 | 
            -
             | 
| 149 | 
            -
             | 
| 150 | 
            -
                 | 
| 151 | 
            -
             | 
| 149 | 
            +
                context "when duplicates are allowed" do
         | 
| 150 | 
            +
                  setup do
         | 
| 151 | 
            +
                    PokerHand.allow_duplicates = true
         | 
| 152 | 
            +
                  end
         | 
| 153 | 
            +
                
         | 
| 154 | 
            +
                  should "create a PokerHand of unique cards" do
         | 
| 155 | 
            +
                    uniq_ph = PokerHand.new("3s 4s 3s").uniq
         | 
| 156 | 
            +
                    assert_instance_of(PokerHand, uniq_ph)  # want to be sure uniq hands back a PokerHand
         | 
| 157 | 
            +
                    assert_contains(uniq_ph.hand, Card.new('3s'))
         | 
| 158 | 
            +
                    assert_contains(uniq_ph.hand, Card.new('4s'))
         | 
| 159 | 
            +
                  end
         | 
| 160 | 
            +
                
         | 
| 161 | 
            +
                  should "allow five of a kind" do
         | 
| 162 | 
            +
                    # there is no five of a kind. This just tests to make sure
         | 
| 163 | 
            +
                    # that ruby-poker doesn't crash if given 5 of the same card
         | 
| 164 | 
            +
                    ph = PokerHand.new("KS KS KS KS KS")
         | 
| 165 | 
            +
                    assert_equal("Four of a kind", ph.rank)
         | 
| 166 | 
            +
                  end
         | 
| 152 167 |  | 
| 153 | 
            -
             | 
| 154 | 
            -
             | 
| 155 | 
            -
             | 
| 156 | 
            -
             | 
| 157 | 
            -
             | 
| 168 | 
            +
                  should "allow duplicates on initialize" do
         | 
| 169 | 
            +
                    assert_nothing_raised RuntimeError do
         | 
| 170 | 
            +
                      PokerHand.new("3s 3s")
         | 
| 171 | 
            +
                    end
         | 
| 172 | 
            +
                  end
         | 
| 158 173 |  | 
| 159 | 
            -
             | 
| 160 | 
            -
             | 
| 161 | 
            -
             | 
| 174 | 
            +
                  should "allow duplicate card to be added after initialize" do
         | 
| 175 | 
            +
                    ph = PokerHand.new("2d")
         | 
| 176 | 
            +
                    ph << "2d"
         | 
| 177 | 
            +
                    assert_equal("2d 2d", ph.just_cards)
         | 
| 178 | 
            +
                  end
         | 
| 162 179 | 
             
                end
         | 
| 180 | 
            +
              
         | 
| 181 | 
            +
                context "when duplicates are not allowed" do
         | 
| 182 | 
            +
                  setup do
         | 
| 183 | 
            +
                    PokerHand.allow_duplicates = false
         | 
| 184 | 
            +
                  end
         | 
| 185 | 
            +
              
         | 
| 186 | 
            +
                  should "not allow duplicates on initialize" do
         | 
| 187 | 
            +
                    PokerHand.allow_duplicates = false
         | 
| 188 | 
            +
                
         | 
| 189 | 
            +
                    assert_raise RuntimeError do
         | 
| 190 | 
            +
                      PokerHand.new("3s 3s")
         | 
| 191 | 
            +
                    end
         | 
| 192 | 
            +
                
         | 
| 193 | 
            +
                    PokerHand.allow_duplicates = true
         | 
| 194 | 
            +
                  end
         | 
| 195 | 
            +
                
         | 
| 196 | 
            +
                  should "not allow duplicates after initialize" do
         | 
| 197 | 
            +
                    PokerHand.allow_duplicates = false
         | 
| 198 | 
            +
                
         | 
| 199 | 
            +
                    ph = PokerHand.new("2d")    
         | 
| 200 | 
            +
                    assert_raise RuntimeError do
         | 
| 201 | 
            +
                      ph << "2d"
         | 
| 202 | 
            +
                    end
         | 
| 203 | 
            +
                
         | 
| 204 | 
            +
                    PokerHand.allow_duplicates = true
         | 
| 205 | 
            +
                  end
         | 
| 206 | 
            +
                end
         | 
| 207 | 
            +
                
         | 
| 163 208 | 
             
              end
         | 
| 164 209 | 
             
            end
         | 
| 165 210 |  | 
    
        metadata
    CHANGED
    
    | @@ -1,51 +1,51 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: ruby-poker
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
              version: 0.3. | 
| 4 | 
            +
              version: 0.3.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors: 
         | 
| 7 | 
            -
            -  | 
| 7 | 
            +
            - Rob Olson
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 11 |  | 
| 12 | 
            -
            date:  | 
| 12 | 
            +
            date: 2009-01-24 00:00:00 -08:00
         | 
| 13 13 | 
             
            default_executable: 
         | 
| 14 14 | 
             
            dependencies: []
         | 
| 15 15 |  | 
| 16 | 
            -
            description: 
         | 
| 16 | 
            +
            description: Ruby library for comparing poker hands and determining the winner.
         | 
| 17 17 | 
             
            email: rko618@gmail.com
         | 
| 18 18 | 
             
            executables: []
         | 
| 19 19 |  | 
| 20 20 | 
             
            extensions: []
         | 
| 21 21 |  | 
| 22 22 | 
             
            extra_rdoc_files: 
         | 
| 23 | 
            -
            - README
         | 
| 23 | 
            +
            - README.rdoc
         | 
| 24 24 | 
             
            - CHANGELOG
         | 
| 25 25 | 
             
            - LICENSE
         | 
| 26 26 | 
             
            files: 
         | 
| 27 | 
            +
            - CHANGELOG
         | 
| 27 28 | 
             
            - examples/deck.rb
         | 
| 28 29 | 
             
            - examples/quick_example.rb
         | 
| 29 30 | 
             
            - lib/card.rb
         | 
| 30 31 | 
             
            - lib/ruby-poker.rb
         | 
| 31 | 
            -
            - test/test_card.rb
         | 
| 32 | 
            -
            - test/test_poker_hand.rb
         | 
| 33 | 
            -
            - Rakefile
         | 
| 34 | 
            -
            - README
         | 
| 35 | 
            -
            - CHANGELOG
         | 
| 36 32 | 
             
            - LICENSE
         | 
| 33 | 
            +
            - Rakefile
         | 
| 34 | 
            +
            - README.rdoc
         | 
| 35 | 
            +
            - ruby-poker.gemspec
         | 
| 37 36 | 
             
            has_rdoc: true
         | 
| 38 | 
            -
            homepage: http:// | 
| 37 | 
            +
            homepage: http://github.com/robolson/ruby-poker
         | 
| 39 38 | 
             
            post_install_message: 
         | 
| 40 39 | 
             
            rdoc_options: 
         | 
| 41 40 | 
             
            - --title
         | 
| 42 41 | 
             
            - Ruby Poker Documentation
         | 
| 43 42 | 
             
            - --main
         | 
| 44 | 
            -
            - README
         | 
| 43 | 
            +
            - README.rdoc
         | 
| 45 44 | 
             
            - --inline-source
         | 
| 46 45 | 
             
            - -q
         | 
| 47 46 | 
             
            require_paths: 
         | 
| 48 47 | 
             
            - lib
         | 
| 48 | 
            +
            - lib
         | 
| 49 49 | 
             
            required_ruby_version: !ruby/object:Gem::Requirement 
         | 
| 50 50 | 
             
              requirements: 
         | 
| 51 51 | 
             
              - - ">="
         | 
| @@ -61,10 +61,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 61 61 | 
             
            requirements: []
         | 
| 62 62 |  | 
| 63 63 | 
             
            rubyforge_project: rubypoker
         | 
| 64 | 
            -
            rubygems_version: 1. | 
| 64 | 
            +
            rubygems_version: 1.3.1
         | 
| 65 65 | 
             
            signing_key: 
         | 
| 66 66 | 
             
            specification_version: 2
         | 
| 67 | 
            -
            summary:  | 
| 67 | 
            +
            summary: Poker library in Ruby
         | 
| 68 68 | 
             
            test_files: 
         | 
| 69 69 | 
             
            - test/test_card.rb
         | 
| 70 70 | 
             
            - test/test_poker_hand.rb
         | 
    
        data/README
    DELETED
    
    | @@ -1,63 +0,0 @@ | |
| 1 | 
            -
            = Poker hand evaluator for Ruby
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            == Author
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            Robert Olson (rko618 [at] gmail [dot] com)
         | 
| 6 | 
            -
             | 
| 7 | 
            -
            == License
         | 
| 8 | 
            -
             | 
| 9 | 
            -
            This is free software; you can redistribute it and/or modify it under the
         | 
| 10 | 
            -
            terms of the BSD license. See LICENSE for more details.
         | 
| 11 | 
            -
             | 
| 12 | 
            -
            == Download
         | 
| 13 | 
            -
             | 
| 14 | 
            -
            The latest version of <b>ruby poker</b> can be found at
         | 
| 15 | 
            -
             | 
| 16 | 
            -
            http://rubyforge.org/frs/?group_id=5257
         | 
| 17 | 
            -
             | 
| 18 | 
            -
            The homepage of this project is located at
         | 
| 19 | 
            -
             | 
| 20 | 
            -
            http://rubyforge.org/projects/rubypoker
         | 
| 21 | 
            -
             | 
| 22 | 
            -
            == Description
         | 
| 23 | 
            -
             | 
| 24 | 
            -
            Ruby-Poker handles the logic for getting the rank of a poker hand. It can also be used
         | 
| 25 | 
            -
            to compare two or more hands to determine which hand has the highest poker value.
         | 
| 26 | 
            -
             | 
| 27 | 
            -
            Card representations can be passed to the PokerHand constructor as a string or an array.
         | 
| 28 | 
            -
            Face cards (cards ten, jack, queen, king, and ace) are created using their 
         | 
| 29 | 
            -
            letter representation (T, J, Q, K, A).
         | 
| 30 | 
            -
             | 
| 31 | 
            -
            == Examples
         | 
| 32 | 
            -
             | 
| 33 | 
            -
            In this section some examples show what can be done with this class.
         | 
| 34 | 
            -
             | 
| 35 | 
            -
                hand1 = PokerHand.new("8H 9C TC JD QH")
         | 
| 36 | 
            -
                hand2 = PokerHand.new(["3D", "3C", "3S", "KD", "AH"])
         | 
| 37 | 
            -
                puts hand1                => 8h 9c Tc Jd Qh (Straight)
         | 
| 38 | 
            -
                puts hand1.just_cards     => 8h 9c Tc Jd Qh
         | 
| 39 | 
            -
                puts hand1.rank           => Straight
         | 
| 40 | 
            -
                puts hand2                => 3d 3c 3s Kd Ah (Three of a kind)
         | 
| 41 | 
            -
                puts hand2.rank           => Three of a kind
         | 
| 42 | 
            -
                puts hand1 > hand2        => true
         | 
| 43 | 
            -
             | 
| 44 | 
            -
            == Duplicates
         | 
| 45 | 
            -
             | 
| 46 | 
            -
            By default ruby-poker will not raise an exception if you add the same card to a hand
         | 
| 47 | 
            -
            twice. You can tell ruby-poker to not allow duplicates by doing the following
         | 
| 48 | 
            -
             | 
| 49 | 
            -
                PokerHand.allow_duplicates = false
         | 
| 50 | 
            -
                
         | 
| 51 | 
            -
            Place that line near the beginning of your program. The change is program wide so
         | 
| 52 | 
            -
            once allow_duplicates is set to false, _all_ poker hands will raise an exception
         | 
| 53 | 
            -
            if a duplicate card is added to the hand.
         | 
| 54 | 
            -
             | 
| 55 | 
            -
            == Compatibility
         | 
| 56 | 
            -
             | 
| 57 | 
            -
            Ruby-Poker is compatible with Ruby 1.8 and Ruby 1.9.
         | 
| 58 | 
            -
             | 
| 59 | 
            -
            == Background
         | 
| 60 | 
            -
             | 
| 61 | 
            -
            The original version of ruby-poker was written entirely by myself (Robert Olson).
         | 
| 62 | 
            -
            As of the 0.2.0 release ruby-poker incorporates Patrick Hurley's Texas 
         | 
| 63 | 
            -
            Holdem code from http://rubyquiz.com/quiz24.html which I merged into ruby-poker.
         |