poker_hands 0.0.4 → 0.0.5
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/lib/deck/hand.rb +5 -4
- data/lib/deck/rank_selector.rb +12 -11
- data/lib/poker_hands.rb +2 -2
- data/lib/rank/flush.rb +2 -1
- data/lib/rank/four_of_a_kind.rb +2 -1
- data/lib/rank/full_house.rb +2 -1
- data/lib/rank/{rank.rb → hand_rank.rb} +2 -2
- data/lib/rank/high_card.rb +2 -1
- data/lib/rank/pair.rb +2 -1
- data/lib/rank/straight.rb +2 -1
- data/lib/rank/straight_flush.rb +2 -1
- data/lib/rank/three_of_a_kind.rb +2 -1
- data/lib/rank/two_pairs.rb +2 -1
- data/{poker-hands.gemspec → poker_hands.gemspec} +2 -2
- data/spec/{hand_spec.rb → deck/hand_spec.rb} +19 -20
- data/spec/{table_spec.rb → poker_hands_spec.rb} +49 -50
- data/spec/spec_helper.rb +338 -39
- data/spec/support/test_helpers.rb +186 -186
- metadata +5 -5
data/lib/deck/hand.rb
CHANGED
@@ -1,17 +1,18 @@
|
|
1
|
+
require 'deck/rank_selector'
|
1
2
|
module Deck
|
2
3
|
class Hand
|
3
4
|
include ::Deck::RankSelector
|
4
5
|
include Comparable
|
5
6
|
|
6
|
-
attr_reader :
|
7
|
+
attr_reader :cards, :rank
|
7
8
|
|
8
|
-
def initialize(
|
9
|
-
@
|
9
|
+
def initialize(hand_cards)
|
10
|
+
@cards = hand_cards
|
10
11
|
@rank = select_rank
|
11
12
|
end
|
12
13
|
|
13
14
|
def only_values
|
14
|
-
@
|
15
|
+
@cards.map { |card| card.value}
|
15
16
|
end
|
16
17
|
|
17
18
|
private
|
data/lib/deck/rank_selector.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
|
-
module Deck
|
1
|
+
module Deck
|
2
|
+
module RankSelector
|
2
3
|
|
3
4
|
def is_pair?
|
4
|
-
only_value = @
|
5
|
+
only_value = @cards.map { |card| card.value}
|
5
6
|
only_value.detect { |card| only_value.count(card) > 1}
|
6
7
|
end
|
7
8
|
|
8
9
|
def is_two_pairs?
|
9
|
-
only_value = @
|
10
|
+
only_value = @cards.map { |card| card.value}
|
10
11
|
first_value = only_value.detect { |card| only_value.count(card) == 2}
|
11
12
|
if first_value
|
12
13
|
only_value.delete(first_value)
|
@@ -16,23 +17,23 @@ module Deck::RankSelector
|
|
16
17
|
end
|
17
18
|
|
18
19
|
def is_three_of_a_kind?
|
19
|
-
only_value = @
|
20
|
+
only_value = @cards.map { |card| card.value}
|
20
21
|
only_value.detect { |card| only_value.count(card) == 3}
|
21
22
|
end
|
22
23
|
|
23
24
|
def is_straight?
|
24
|
-
only_value = @
|
25
|
+
only_value = @cards.map { |card| card.value}
|
25
26
|
sorted_only_value = only_value.sort
|
26
27
|
only_value === sorted_only_value
|
27
28
|
end
|
28
29
|
|
29
30
|
def is_flush?
|
30
|
-
only_suits = @
|
31
|
+
only_suits = @cards.map { |card| card.suit}
|
31
32
|
only_suits.detect { |card| only_suits.count(card) == 5}
|
32
33
|
end
|
33
34
|
|
34
35
|
def is_full_house?
|
35
|
-
only_value = @
|
36
|
+
only_value = @cards.map { |card| card.value}
|
36
37
|
first_value = only_value.detect { |card| only_value.count(card) == 3}
|
37
38
|
if first_value
|
38
39
|
only_value.delete(first_value)
|
@@ -42,17 +43,17 @@ module Deck::RankSelector
|
|
42
43
|
end
|
43
44
|
|
44
45
|
def is_four_of_a_kind?
|
45
|
-
only_value = @
|
46
|
+
only_value = @cards.map { |card| card.value}
|
46
47
|
only_value.detect { |card| only_value.count(card) == 4}
|
47
48
|
end
|
48
49
|
|
49
50
|
def is_straight_flush?
|
50
|
-
only_suits = @
|
51
|
+
only_suits = @cards.map { |card| card.suit}
|
51
52
|
all_same_suit = only_suits.detect { |card| only_suits.count(card) == 5}
|
52
53
|
|
53
|
-
only_value = @
|
54
|
+
only_value = @cards.map { |card| card.value}
|
54
55
|
sorted_only_value = only_value.sort
|
55
56
|
all_same_suit && only_value === sorted_only_value
|
56
57
|
end
|
57
|
-
|
58
|
+
end
|
58
59
|
end
|
data/lib/poker_hands.rb
CHANGED
@@ -8,7 +8,7 @@ require 'rank/four_of_a_kind'
|
|
8
8
|
require 'rank/full_house'
|
9
9
|
require 'rank/high_card'
|
10
10
|
require 'rank/pair'
|
11
|
-
require 'rank/
|
11
|
+
require 'rank/hand_rank'
|
12
12
|
require 'rank/straight'
|
13
13
|
require 'rank/straight_flush'
|
14
14
|
require 'rank/three_of_a_kind'
|
@@ -37,7 +37,7 @@ class PokerHands
|
|
37
37
|
private
|
38
38
|
|
39
39
|
def same_best_rank?(rank)
|
40
|
-
rank.
|
40
|
+
rank[0].rank.class == rank[1].rank.class
|
41
41
|
end
|
42
42
|
|
43
43
|
def find_winner_if_same_rank(sorted_hands)
|
data/lib/rank/flush.rb
CHANGED
data/lib/rank/four_of_a_kind.rb
CHANGED
data/lib/rank/full_house.rb
CHANGED
data/lib/rank/high_card.rb
CHANGED
data/lib/rank/pair.rb
CHANGED
data/lib/rank/straight.rb
CHANGED
data/lib/rank/straight_flush.rb
CHANGED
data/lib/rank/three_of_a_kind.rb
CHANGED
data/lib/rank/two_pairs.rb
CHANGED
@@ -9,10 +9,10 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.description = "Sample app to play poker"
|
10
10
|
s.authors = ["Cosimo Ranieri"]
|
11
11
|
s.email = 'co.ranieri@gmail.com'
|
12
|
-
s.files = %w(README.md Rakefile
|
12
|
+
s.files = %w(README.md Rakefile poker_hands.gemspec)
|
13
13
|
s.files += Dir.glob("lib/**/*")
|
14
14
|
s.files += Dir.glob("spec/**/*")
|
15
|
-
s.version = '0.0.
|
15
|
+
s.version = '0.0.5'
|
16
16
|
s.homepage = 'https://rubygems.org/gems/poker-hands'
|
17
17
|
s.license = 'MIT'
|
18
18
|
end
|
@@ -1,68 +1,67 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Hand do
|
2
|
+
describe Deck::Hand do
|
4
3
|
|
5
4
|
describe ".new" do
|
6
5
|
context "the hand is a high card" do
|
7
|
-
let(:hand) { Hand.new(high_card)}
|
6
|
+
let(:hand) { Deck::Hand.new(high_card)}
|
8
7
|
it "creates a high card hand" do
|
9
|
-
expect(hand.rank.class).to eq HighCard
|
8
|
+
expect(hand.rank.class).to eq Rank::HighCard
|
10
9
|
end
|
11
10
|
end
|
12
11
|
|
13
12
|
context "the hand is a pair" do
|
14
|
-
let(:hand) { Hand.new(pair)}
|
13
|
+
let(:hand) { Deck::Hand.new(pair)}
|
15
14
|
it "creates a high card hand" do
|
16
|
-
expect(hand.rank.class).to eq Pair
|
15
|
+
expect(hand.rank.class).to eq Rank::Pair
|
17
16
|
end
|
18
17
|
end
|
19
18
|
|
20
19
|
context "the hand is two pairs" do
|
21
|
-
let(:hand) { Hand.new(two_pairs)}
|
20
|
+
let(:hand) { Deck::Hand.new(two_pairs)}
|
22
21
|
it "creates a high card hand" do
|
23
|
-
expect(hand.rank.class).to eq TwoPairs
|
22
|
+
expect(hand.rank.class).to eq Rank::TwoPairs
|
24
23
|
end
|
25
24
|
end
|
26
25
|
|
27
26
|
context "the hand is three of a kind" do
|
28
|
-
let(:hand) { Hand.new(three_of_a_kind)}
|
27
|
+
let(:hand) { Deck::Hand.new(three_of_a_kind)}
|
29
28
|
it "creates a high card hand" do
|
30
|
-
expect(hand.rank.class).to eq ThreeOfAKind
|
29
|
+
expect(hand.rank.class).to eq Rank::ThreeOfAKind
|
31
30
|
end
|
32
31
|
end
|
33
32
|
|
34
33
|
context "the hand is straight" do
|
35
|
-
let(:hand) { Hand.new(straight)}
|
34
|
+
let(:hand) { Deck::Hand.new(straight)}
|
36
35
|
it "creates a high card hand" do
|
37
|
-
expect(hand.rank.class).to eq Straight
|
36
|
+
expect(hand.rank.class).to eq Rank::Straight
|
38
37
|
end
|
39
38
|
end
|
40
39
|
|
41
40
|
context "the hand is a flush" do
|
42
|
-
let(:hand) { Hand.new(flush)}
|
41
|
+
let(:hand) { Deck::Hand.new(flush)}
|
43
42
|
it "creates a flush hand" do
|
44
|
-
expect(hand.rank.class).to eq Flush
|
43
|
+
expect(hand.rank.class).to eq Rank::Flush
|
45
44
|
end
|
46
45
|
end
|
47
46
|
|
48
47
|
context "the hand is a full house" do
|
49
|
-
let(:hand) { Hand.new(full_house)}
|
48
|
+
let(:hand) { Deck::Hand.new(full_house)}
|
50
49
|
it "creates a flush full house" do
|
51
|
-
expect(hand.rank.class).to eq FullHouse
|
50
|
+
expect(hand.rank.class).to eq Rank::FullHouse
|
52
51
|
end
|
53
52
|
end
|
54
53
|
|
55
54
|
context "the hand is a four of a kind" do
|
56
|
-
let(:hand) { Hand.new(four_of_a_kind)}
|
55
|
+
let(:hand) { Deck::Hand.new(four_of_a_kind)}
|
57
56
|
it "creates a four of a kind full house" do
|
58
|
-
expect(hand.rank.class).to eq FourOfAKind
|
57
|
+
expect(hand.rank.class).to eq Rank::FourOfAKind
|
59
58
|
end
|
60
59
|
end
|
61
60
|
|
62
61
|
context "the hand is a straight flush" do
|
63
|
-
let(:hand) { Hand.new(straight_flush)}
|
62
|
+
let(:hand) { Deck::Hand.new(straight_flush)}
|
64
63
|
it "creates a four of a straight flush" do
|
65
|
-
expect(hand.rank.class).to eq StraightFlush
|
64
|
+
expect(hand.rank.class).to eq Rank::StraightFlush
|
66
65
|
end
|
67
66
|
end
|
68
67
|
|
@@ -1,187 +1,186 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe
|
3
|
+
describe PokerHands do
|
4
4
|
describe "#winner" do
|
5
|
-
let(:
|
6
|
-
context "the
|
5
|
+
let(:poker) { PokerHands.new}
|
6
|
+
context "the game contains a straight flush as best hand" do
|
7
7
|
context "there is only one straight flush hand" do
|
8
8
|
before do
|
9
|
-
|
9
|
+
poker.hands = hand_straight_flush
|
10
10
|
end
|
11
11
|
it "return an array where the last element is a straight flush " do
|
12
|
-
expect(
|
12
|
+
expect(poker.winner.rank.class).to eq Rank::StraightFlush
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
context "there are two straight flush hands" do
|
17
17
|
before do
|
18
|
-
|
18
|
+
poker.hands = hand_two_straight_flush
|
19
19
|
end
|
20
20
|
it "return an array where the last element is the highest straight flush " do
|
21
|
-
only_val = Hand.new(
|
21
|
+
only_val = Deck::Hand.new(poker.winner.hand).only_values
|
22
22
|
expect(only_val.max).to eq "8"
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
26
|
end
|
27
27
|
|
28
|
-
context "the
|
28
|
+
context "the game contains a four of a kind as best hand" do
|
29
29
|
context "there is one four of a kind hand" do
|
30
30
|
before do
|
31
|
-
|
31
|
+
poker.hands = hand_four_of_a_kind
|
32
32
|
end
|
33
33
|
it "return an array where the last element is a four of a kind " do
|
34
|
-
expect(
|
34
|
+
expect(poker.winner.rank.class).to eq Rank::FourOfAKind
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
38
|
context "there are two four of a kind hands" do
|
39
39
|
before do
|
40
|
-
|
40
|
+
poker.hands = hand_same_four_of_a_kind
|
41
41
|
end
|
42
42
|
it "return an array where the last element is a four of a kind " do
|
43
|
-
only_val = Hand.new(
|
43
|
+
only_val = Deck::Hand.new(poker.winner.hand).only_values
|
44
44
|
expect(only_val.max).to eq "5"
|
45
45
|
end
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
-
context "the
|
49
|
+
context "the game contains a full house as best hand" do
|
50
50
|
context "there is only one full house" do
|
51
51
|
before do
|
52
|
-
|
52
|
+
poker.hands = hand_full_house
|
53
53
|
end
|
54
54
|
it "return an array where the last element is a full house hand " do
|
55
|
-
expect(
|
55
|
+
expect(poker.winner.rank.class).to eq Rank::FullHouse
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
59
|
context "there are two full house hands" do
|
60
60
|
before do
|
61
|
-
|
61
|
+
poker.hands = hand_same_full_house
|
62
62
|
end
|
63
63
|
it "return an array where the last element is highest full house " do
|
64
|
-
only_val = Hand.new(
|
65
|
-
p only_val
|
64
|
+
only_val = Deck::Hand.new(poker.winner.hand).only_values
|
66
65
|
expect(only_val.max).to eq "5"
|
67
66
|
end
|
68
67
|
end
|
69
68
|
|
70
69
|
end
|
71
70
|
|
72
|
-
context "the
|
71
|
+
context "the game contains a flush as best hand" do
|
73
72
|
context "there is only one flush hand" do
|
74
73
|
before do
|
75
|
-
|
74
|
+
poker.hands = hand_flush
|
76
75
|
end
|
77
76
|
it "return an array where the last element is a flush " do
|
78
|
-
expect(
|
77
|
+
expect(poker.winner.rank.class).to eq Rank::Flush
|
79
78
|
end
|
80
79
|
end
|
81
80
|
|
82
81
|
context "there is two one flush hand" do
|
83
82
|
before do
|
84
|
-
|
83
|
+
poker.hands = hand_two_flush
|
85
84
|
end
|
86
85
|
it "return an array where the last element is the highest flush " do
|
87
|
-
only_val = Hand.new(
|
86
|
+
only_val = Deck::Hand.new(poker.winner.hand).only_values
|
88
87
|
expect(only_val.max).to eq "8"
|
89
88
|
end
|
90
89
|
end
|
91
90
|
|
92
91
|
end
|
93
92
|
|
94
|
-
context "the
|
93
|
+
context "the game contains a straight as best hand" do
|
95
94
|
context "there is only one straight hand" do
|
96
95
|
before do
|
97
|
-
|
96
|
+
poker.hands = hand_straight
|
98
97
|
end
|
99
98
|
it "return an array where the last element is a straight " do
|
100
|
-
expect(
|
99
|
+
expect(poker.winner.rank.class).to eq Rank::Straight
|
101
100
|
end
|
102
101
|
end
|
103
102
|
|
104
103
|
context "there are two straight hands" do
|
105
104
|
before do
|
106
|
-
|
105
|
+
poker.hands = hand_same_straight
|
107
106
|
end
|
108
107
|
it "return an array where the last element the highest straight" do
|
109
|
-
only_val = Hand.new(
|
108
|
+
only_val = Deck::Hand.new(poker.winner.hand).only_values
|
110
109
|
expect(only_val.last).to eq "8"
|
111
110
|
end
|
112
111
|
end
|
113
112
|
|
114
113
|
end
|
115
114
|
|
116
|
-
context "the
|
115
|
+
context "the game contains a three of a kind as best hand" do
|
117
116
|
context "there is only one three of a kind hand" do
|
118
117
|
before do
|
119
|
-
|
118
|
+
poker.hands = hand_three_of_a_kind
|
120
119
|
end
|
121
120
|
it "return an array where the last element is a three of a kind " do
|
122
|
-
expect(
|
121
|
+
expect(poker.winner.rank.class).to eq Rank::ThreeOfAKind
|
123
122
|
end
|
124
123
|
end
|
125
124
|
|
126
125
|
context "there are two three of a kind hands" do
|
127
126
|
before do
|
128
|
-
|
127
|
+
poker.hands = hand_some_three_of_a_kind
|
129
128
|
end
|
130
129
|
it "return an array where the last element is a three of a kind " do
|
131
|
-
only_val = Hand.new(
|
130
|
+
only_val = Deck::Hand.new(poker.winner.hand).only_values
|
132
131
|
expect(only_val.last).to eq "8"
|
133
132
|
end
|
134
133
|
end
|
135
134
|
end
|
136
135
|
|
137
|
-
context "the
|
136
|
+
context "the game contains a two pairs as best hand" do
|
138
137
|
before do
|
139
|
-
|
138
|
+
poker.hands = hand_two_pairs
|
140
139
|
end
|
141
140
|
it "return an array where the last element is a two pairs " do
|
142
|
-
expect(
|
141
|
+
expect(poker.winner.rank.class).to eq Rank::TwoPairs
|
143
142
|
end
|
144
143
|
|
145
|
-
context "the
|
144
|
+
context "the game contains thw hands with same two pairs" do
|
146
145
|
before do
|
147
|
-
|
146
|
+
poker.hands = hand_same_two_pairs
|
148
147
|
end
|
149
148
|
it "return an array where the last element is the two pairs with the highest remaining card" do
|
150
|
-
only_val = Hand.new(
|
149
|
+
only_val = Deck::Hand.new(poker.winner.hand).only_values
|
151
150
|
expect(only_val.last).to eq "8"
|
152
151
|
end
|
153
152
|
end
|
154
153
|
end
|
155
154
|
|
156
|
-
context "the
|
155
|
+
context "the game contains a pair as best hand" do
|
157
156
|
context "the tables contains a unique pair hand" do
|
158
157
|
before do
|
159
|
-
|
158
|
+
poker.hands = hand_pair
|
160
159
|
end
|
161
160
|
it "return an array where the last element is a pair " do
|
162
|
-
expect(
|
161
|
+
expect(poker.winner.rank.class).to eq Rank::Pair
|
163
162
|
end
|
164
163
|
end
|
165
164
|
|
166
|
-
context "the
|
165
|
+
context "the game contains the hands with same pairs" do
|
167
166
|
before do
|
168
|
-
|
167
|
+
poker.hands = hand_same_pair
|
169
168
|
end
|
170
169
|
it "return an array where the last element is the pair with the highest remaining card" do
|
171
|
-
only_val = Hand.new(
|
170
|
+
only_val = Deck::Hand.new(poker.winner.hand).only_values
|
172
171
|
expect(only_val.last).to eq "8"
|
173
172
|
end
|
174
173
|
end
|
175
174
|
|
176
175
|
end
|
177
176
|
|
178
|
-
context "the
|
177
|
+
context "the game contains a high card as best hand" do
|
179
178
|
context "the highest cards have the same value" do
|
180
179
|
before do
|
181
|
-
|
180
|
+
poker.hands = hand_high_card_same_highest
|
182
181
|
end
|
183
182
|
it "return an array where the last element is a high card with the next highest value" do
|
184
|
-
only_val = Hand.new(
|
183
|
+
only_val = Deck::Hand.new(poker.winner.hand).only_values
|
185
184
|
only_val.sort!
|
186
185
|
expect(only_val[only_val.length - 2]).to eq "7"
|
187
186
|
end
|
@@ -189,10 +188,10 @@ describe Table do
|
|
189
188
|
|
190
189
|
context "the highest card is unique" do
|
191
190
|
before do
|
192
|
-
|
191
|
+
poker.hands = hand_high_card
|
193
192
|
end
|
194
193
|
it "return an array where the last element is a high card " do
|
195
|
-
expect(
|
194
|
+
expect(poker.winner.rank.class).to eq Rank::HighCard
|
196
195
|
end
|
197
196
|
end
|
198
197
|
|