danbarry-poker 1.2

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/card.rb ADDED
@@ -0,0 +1,42 @@
1
+ module Poker
2
+ class Card
3
+ include Comparable
4
+
5
+ SUITS = ['Spades', 'Diamonds', 'Clubs', 'Hearts']
6
+ VALUES = {
7
+ 'Ace' => 14,
8
+ 'King' => 13,
9
+ 'Queen' => 12,
10
+ 'Jack' => 11,
11
+ '10' => 10,
12
+ '9' => 9,
13
+ '8' => 8,
14
+ '7' => 7,
15
+ '6' => 6,
16
+ '5' => 5,
17
+ '4' => 4,
18
+ '3' => 3,
19
+ '2' => 2,
20
+ }
21
+ FACES = VALUES.keys
22
+
23
+ attr_reader :value, :suit
24
+
25
+ def initialize(suit, face_or_value)
26
+ self.suit = suit
27
+ self.value = VALUES[face_or_value] || face_or_value
28
+ raise ArgumentError unless SUITS.include?(suit) && VALUES.has_value?(value)
29
+ end
30
+
31
+ def face
32
+ VALUES.index(value)
33
+ end
34
+
35
+ def <=> other_card
36
+ value <=> other_card.value
37
+ end
38
+
39
+ private
40
+ attr_writer :value, :suit
41
+ end
42
+ end
data/lib/deck.rb ADDED
@@ -0,0 +1,25 @@
1
+ module Poker
2
+ class Deck
3
+ attr_accessor :cards
4
+
5
+ def initialize
6
+ @cards = Card::SUITS.map do |suit|
7
+ Card::FACES.map do |value|
8
+ Card.new(suit, value)
9
+ end
10
+ end.flatten
11
+ @card_index = 0
12
+ end
13
+
14
+ def shuffle
15
+ @cards = @cards.sort_by {rand}
16
+ @card_index = 0
17
+ self
18
+ end
19
+
20
+ def next(quantity = 1)
21
+ raise IndexError if @card_index + quantity > 52
22
+ @cards[@card_index...(@card_index += quantity)]
23
+ end
24
+ end
25
+ end
data/lib/hand.rb ADDED
@@ -0,0 +1,162 @@
1
+ module Poker
2
+ class Hand
3
+ include Comparable
4
+ attr_reader :cards
5
+
6
+ def initialize(*hands_or_cards)
7
+ @cards = hands_or_cards.map do |hand_or_card|
8
+ if hand_or_card.is_a?(Hand)
9
+ hand_or_card.cards
10
+ else
11
+ hand_or_card
12
+ end
13
+ end.flatten.uniq.sort.reverse
14
+ end
15
+
16
+ def straight_flush?
17
+ @straight_flush ||= suited_cards.any? do |cards|
18
+ Hand.new(*cards).straight?
19
+ end
20
+ end
21
+
22
+ def quads?
23
+ @quads ||= matched_cards.any? do |cards|
24
+ cards.length >= 4
25
+ end
26
+ end
27
+
28
+ def full_house?
29
+ @full_house ||= set? && two_pair?
30
+ end
31
+
32
+ def flush?
33
+ @flush ||= suited_cards.any? do |cards|
34
+ cards.length >= 5
35
+ end
36
+ end
37
+
38
+ def straight?
39
+ @straight ||= !straight_cards.empty?
40
+ end
41
+
42
+ def set?
43
+ @set ||= matched_cards.any? do |cards|
44
+ cards.length >= 3
45
+ end
46
+ end
47
+
48
+ def two_pair?
49
+ @two_pair ||= matched_cards.length >= 2
50
+ end
51
+
52
+ def pair?
53
+ @pair ||= matched_cards.length >= 1
54
+ end
55
+
56
+ def four_to_flush?
57
+ @four_to_flush ||= suited_cards.any? do |cards|
58
+ cards.length >= 4
59
+ end
60
+ end
61
+
62
+ def open_ended?
63
+ @open_ended ||= straight_cards(4).any? do |cards|
64
+ cards.first.face != 'Ace' && cards.last.face != 'Ace'
65
+ end
66
+ end
67
+
68
+ def gutshot?
69
+ @gutshot ||= !gutshot_cards.empty?
70
+ end
71
+
72
+ def double_gutshot?
73
+ @double_gutshot ||= gutshot_cards.length >= 2
74
+ end
75
+
76
+ def <=> other_hand
77
+ return rank <=> other_hand.rank unless rank == other_hand.rank
78
+ return 0 if tie_breaker == other_hand.tie_breaker
79
+ tie_breaker.each_with_index do |card, i|
80
+ compared = card.value <=> other_hand.tie_breaker[i].value
81
+ return compared unless compared == 0
82
+ end
83
+ end
84
+
85
+ protected
86
+ def rank
87
+ @rank ||= if straight_flush?: 8
88
+ elsif quads?: 7
89
+ elsif full_house?: 6
90
+ elsif flush?: 5
91
+ elsif straight?: 4
92
+ elsif set?: 3
93
+ elsif two_pair?: 2
94
+ elsif pair?: 1
95
+ else; 0
96
+ end
97
+ end
98
+
99
+ def tie_breaker
100
+ @tie_breaker ||= if flush?
101
+ Hand.new(*suited_cards.find{|cards| cards.length >= 5}).unsuited!.tie_breaker
102
+ elsif quads?
103
+ quads = matched_cards.find{|cards| cards.length == 4}
104
+ quads + [(@cards - quads).first]
105
+ elsif full_house?
106
+ set = matched_cards.find{|cards| cards.length == 3}
107
+ set + (matched_cards - [set]).first.first(2)
108
+ elsif straight?
109
+ [straight_cards.last.last]
110
+ elsif set?
111
+ set = matched_cards.first
112
+ set + (@cards - set).first(2)
113
+ elsif two_pair?
114
+ two_pair = matched_cards.first(2).flatten
115
+ two_pair + [(@cards - two_pair).first]
116
+ elsif pair?
117
+ pair = matched_cards.first
118
+ pair + (@cards - pair).first(3)
119
+ else
120
+ @cards.first(5)
121
+ end
122
+ end
123
+
124
+ def unsuited!
125
+ @suited_cards = []
126
+ self
127
+ end
128
+
129
+ private
130
+ def matched_cards
131
+ @matched_cards ||= @cards.map{|card| card.value}.uniq.map do |value|
132
+ cards = @cards.select{|card| card.value == value}
133
+ cards.length > 1 ? cards : nil
134
+ end.compact
135
+ end
136
+
137
+ def suited_cards
138
+ @suited_cards ||= @cards.map{|card| card.suit}.uniq.map do |suit|
139
+ @cards.select{|card| card.suit == suit}
140
+ end
141
+ end
142
+
143
+ def straight_cards(length = 5)
144
+ @straight_cards ||= {}
145
+ @straight_cards[length] ||= (1..14-(length-1)).map do |low| # straight can start at a low ace up to a 10
146
+ high = low + (length - 1)
147
+ cards = (low..high).map do |value|
148
+ @cards.find{|card| card.value % 13 == value % 13} # %13 allows an ace to be high or low
149
+ end.compact
150
+ end.select{|cards| cards.length == length}
151
+ end
152
+
153
+ def gutshot_cards
154
+ @gutshot_cards ||= (1..10).map do |low|
155
+ high = low + 4
156
+ (low..high).reject do |value|
157
+ @cards.find{|card| card.value % 13 == value % 13}
158
+ end
159
+ end.reject{|cards| cards.length != 1}.uniq.flatten
160
+ end
161
+ end
162
+ end
data/lib/poker.rb ADDED
@@ -0,0 +1,3 @@
1
+ require File.dirname(__FILE__) + '/card'
2
+ require File.dirname(__FILE__) + '/hand'
3
+ require File.dirname(__FILE__) + '/deck'
data/spec/card_spec.rb ADDED
@@ -0,0 +1,94 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ module Poker
4
+ describe Card, '#new' do
5
+ it 'should accept the four suits' do
6
+ lambda {
7
+ ['Spades', 'Diamonds', 'Clubs', 'Hearts'].each do |suit|
8
+ Card.new(suit, 'Ace')
9
+ end
10
+ }.should_not raise_error
11
+ end
12
+
13
+ it 'should reject unknown suits' do
14
+ lambda { Card.new('Rubies', 'Ace') }.should raise_error(ArgumentError)
15
+ end
16
+
17
+ it 'should accept a string of a card name' do
18
+ lambda {
19
+ Card.new('Spades', 'Ace')
20
+ Card.new('Spades', 'King')
21
+ Card.new('Spades', 'Queen')
22
+ Card.new('Spades', 'Jack')
23
+ (2..10).each do |value|
24
+ Card.new('Spades', value.to_s)
25
+ end
26
+ }.should_not raise_error
27
+ end
28
+
29
+ it 'should reject unknown card names' do
30
+ lambda { Card.new('Spades', '1') }.should raise_error(ArgumentError)
31
+ lambda { Card.new('Spades', '11') }.should raise_error(ArgumentError)
32
+ lambda { Card.new('Spades', 'Joker') }.should raise_error(ArgumentError)
33
+ end
34
+
35
+ it 'should accept card values' do
36
+ lambda {
37
+ (2..14).each do |value|
38
+ Card.new('Spades', value)
39
+ end
40
+ }.should_not raise_error
41
+ end
42
+
43
+ it 'should consider cards made by face and value the same' do
44
+ Card.new('Spades', 'Ace').should == Card.new('Spades', 14)
45
+ Card.new('Spades', 'King').should == Card.new('Spades', 13)
46
+ Card.new('Spades', 'Queen').should == Card.new('Spades', 12)
47
+ Card.new('Spades', 'Jack').should == Card.new('Spades', 11)
48
+ (2..10).each do |value|
49
+ Card.new('Spades', value.to_s).should == Card.new('Spades', value)
50
+ end
51
+ end
52
+
53
+ it 'should reject values outside the range' do
54
+ lambda { Card.new('Spades', 1) }.should raise_error(ArgumentError)
55
+ lambda { Card.new('Spades', 15) }.should raise_error(ArgumentError)
56
+ end
57
+ end
58
+
59
+ describe Card, '#face' do
60
+ it 'should return the face for that card' do
61
+ Card.new('Spades', 'Ace').face.should == 'Ace'
62
+ Card.new('Spades', 'King').face.should == 'King'
63
+ Card.new('Spades', 'Queen').face.should == 'Queen'
64
+ Card.new('Spades', 'Jack').face.should == 'Jack'
65
+ (2..10).each do |value|
66
+ Card.new('Spades', value).face.should == value.to_s
67
+ end
68
+ end
69
+ end
70
+
71
+ describe Card, '#value' do
72
+ it 'should return the value for that card' do
73
+ Card.new('Spades', 'Ace').value.should == 14
74
+ Card.new('Spades', 'King').value.should == 13
75
+ Card.new('Spades', 'Queen').value.should == 12
76
+ Card.new('Spades', 'Jack').value.should == 11
77
+ (2..10).each do |value|
78
+ Card.new('Spades', value).value.should == value
79
+ end
80
+ end
81
+ end
82
+
83
+ describe Card, '#<=>' do
84
+ it 'should order the cards by value' do
85
+ Card.new('Spades', 'Ace').should > Card.new('Spades', 'King')
86
+ Card.new('Spades', 'King').should > Card.new('Spades', 'Queen')
87
+ Card.new('Spades', 'Queen').should > Card.new('Spades', 'Jack')
88
+ Card.new('Spades', 'Jack').should > Card.new('Spades', '10')
89
+ (2..9).each do |value|
90
+ Card.new('Spades', value+1).should > Card.new('Spades', value)
91
+ end
92
+ end
93
+ end
94
+ end
data/spec/deck_spec.rb ADDED
@@ -0,0 +1,50 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ module Poker
4
+ describe Deck, '#next' do
5
+ it 'should give you the number of cards you ask for' do
6
+ count = rand 10
7
+ Deck.new.next(count).length.should == count
8
+ end
9
+
10
+ it 'should give 1 card by default' do
11
+ Deck.new.next.length.should == 1
12
+ end
13
+
14
+ it 'should not give out the same card twice' do
15
+ Deck.new.next(52).uniq.length.should == 52
16
+ end
17
+
18
+ it 'should not give out the same card(s) on subsequent calls' do
19
+ deck = Deck.new
20
+ count = rand(10)+1
21
+ deck.next(count).should_not == deck.next(count)
22
+ end
23
+
24
+ it 'should eventually run out of cards' do
25
+ lambda {
26
+ Deck.new.next(53)
27
+ }.should raise_error(IndexError)
28
+ lambda {
29
+ deck = Deck.new
30
+ deck.next 40
31
+ deck.next 13
32
+ }.should raise_error(IndexError)
33
+ end
34
+ end
35
+
36
+ describe Deck, '#shuffle' do
37
+ it 'should allow you to take out more cards' do
38
+ deck = Deck.new
39
+ deck.next 52
40
+ lambda {
41
+ deck.shuffle.next 52
42
+ }.should_not raise_error
43
+ end
44
+
45
+ it 'should change the order of the cards' do
46
+ deck = Deck.new
47
+ deck.next(52).should_not == deck.shuffle.next(52)
48
+ end
49
+ end
50
+ end
data/spec/hand_spec.rb ADDED
@@ -0,0 +1,1049 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ module Poker
4
+ describe Hand, '#new' do
5
+ before do
6
+ @cards = [
7
+ Card.new('Hearts', '6'),
8
+ Card.new('Spades', 'Queen'),
9
+ Card.new('Diamonds', '4'),
10
+ Card.new('Clubs', '7'),
11
+ Card.new('Diamonds', 'Jack'),
12
+ Card.new('Spades', '8')
13
+ ]
14
+ end
15
+
16
+ it 'should contain the given cards' do
17
+ Hand.new(*@cards).cards.sort.should == @cards.sort
18
+ end
19
+
20
+ it 'should contain the cards in any given hands' do
21
+ Hand.new(Hand.new(*@cards[0..2]), Hand.new(*@cards[3..5])).cards.sort.should == @cards.sort
22
+ end
23
+
24
+ it 'should accept a combination of hands and cards' do
25
+ Hand.new(Hand.new(*@cards[0..2]), *@cards[3..5]).cards.sort.should == @cards.sort
26
+ end
27
+
28
+ it 'should ignore the same card if given twice' do
29
+ Hand.new(@cards[3], *@cards).cards.sort.should == @cards.sort
30
+ end
31
+
32
+ it 'should ignore the same card if given in two hands' do
33
+ Hand.new(Hand.new(*@cards[0..3]), Hand.new(*@cards[2..5])).cards.sort.should == @cards.sort
34
+ end
35
+
36
+ it 'should ignore the same card if given in a combo of cards and hands' do
37
+ Hand.new(Hand.new(*@cards[0..3]), *@cards[2..5]).cards.sort.should == @cards.sort
38
+ end
39
+ end
40
+
41
+ describe Hand do
42
+ before do
43
+ @straight_flush = Hand.new(
44
+ Card.new('Spades', '6'),
45
+ Card.new('Spades', '5'),
46
+ Card.new('Spades', '9'),
47
+ Card.new('Spades', '7'),
48
+ Card.new('Spades', '8')
49
+ )
50
+ @quads = Hand.new(
51
+ Card.new('Hearts', '6'),
52
+ Card.new('Spades', '6'),
53
+ Card.new('Clubs', '6'),
54
+ Card.new('Spades', '7'),
55
+ Card.new('Diamonds', '6')
56
+ )
57
+ @full_house = Hand.new(
58
+ Card.new('Spades', '6'),
59
+ Card.new('Hearts', '6'),
60
+ Card.new('Diamonds', '6'),
61
+ Card.new('Spades', '7'),
62
+ Card.new('Clubs', '7')
63
+ )
64
+ @flush = Hand.new(
65
+ Card.new('Spades', '6'),
66
+ Card.new('Spades', 'Queen'),
67
+ Card.new('Spades', '3'),
68
+ Card.new('Spades', '7'),
69
+ Card.new('Spades', '8')
70
+ )
71
+ @straight = Hand.new(
72
+ Card.new('Spades', '6'),
73
+ Card.new('Clubs', '5'),
74
+ Card.new('Spades', '9'),
75
+ Card.new('Diamonds', '7'),
76
+ Card.new('Hearts', '8')
77
+ )
78
+ @set = Hand.new(
79
+ Card.new('Spades', '6'),
80
+ Card.new('Hearts', '6'),
81
+ Card.new('Spades', '9'),
82
+ Card.new('Clubs', '6'),
83
+ Card.new('Diamonds', '8')
84
+ )
85
+ @two_pair = Hand.new(
86
+ Card.new('Spades', '6'),
87
+ Card.new('Hearts', '5'),
88
+ Card.new('Clubs', '6'),
89
+ Card.new('Diamonds', '5'),
90
+ Card.new('Spades', '8')
91
+ )
92
+ @pair = Hand.new(
93
+ Card.new('Hearts', '6'),
94
+ Card.new('Spades', '5'),
95
+ Card.new('Clubs', '8'),
96
+ Card.new('Diamonds', '7'),
97
+ Card.new('Spades', '8')
98
+ )
99
+ @high_card = Hand.new(
100
+ Card.new('Hearts', '6'),
101
+ Card.new('Spades', 'Queen'),
102
+ Card.new('Diamonds', '4'),
103
+ Card.new('Clubs', '7'),
104
+ Card.new('Diamonds', 'Jack')
105
+ )
106
+ end
107
+
108
+ describe 'straight flush' do
109
+ it 'should be a straight flush' do
110
+ @straight_flush.should be_straight_flush
111
+ end
112
+
113
+ it 'should be a flush' do
114
+ @straight_flush.should be_flush
115
+ end
116
+
117
+ it 'should be a straight' do
118
+ @straight_flush.should be_straight
119
+ end
120
+
121
+ it 'should not be anything else' do
122
+ @straight_flush.should_not be_pair
123
+ @straight_flush.should_not be_two_pair
124
+ @straight_flush.should_not be_set
125
+ @straight_flush.should_not be_full_house
126
+ @straight_flush.should_not be_quads
127
+ end
128
+
129
+ describe 'wheel' do
130
+ it 'should be a straight flush' do
131
+ Hand.new(
132
+ Card.new('Spades', 'Ace'),
133
+ Card.new('Spades', '2'),
134
+ Card.new('Spades', '3'),
135
+ Card.new('Spades', '4'),
136
+ Card.new('Spades', '5')
137
+ ).should be_straight_flush
138
+ end
139
+ end
140
+ end
141
+
142
+ describe 'quads' do
143
+ it 'should be quads' do
144
+ @quads.should be_quads
145
+ end
146
+
147
+ it 'should be a set' do
148
+ @quads.should be_set
149
+ end
150
+
151
+ it 'should be a pair' do
152
+ @quads.should be_set
153
+ end
154
+
155
+ it 'should not be anything else' do
156
+ @quads.should_not be_two_pair
157
+ @quads.should_not be_straight
158
+ @quads.should_not be_flush
159
+ @quads.should_not be_full_house
160
+ @quads.should_not be_straight_flush
161
+ end
162
+ end
163
+
164
+ describe 'full house' do
165
+ it 'should be a full house' do
166
+ @full_house.should be_full_house
167
+ end
168
+
169
+ it 'should be a set' do
170
+ @full_house.should be_set
171
+ end
172
+
173
+ it 'should be two pair' do
174
+ @full_house.should be_two_pair
175
+ end
176
+
177
+ it 'should be a pair' do
178
+ @full_house.should be_pair
179
+ end
180
+
181
+ it 'should not be anything else' do
182
+ @full_house.should_not be_straight
183
+ @full_house.should_not be_flush
184
+ @full_house.should_not be_quads
185
+ @full_house.should_not be_straight_flush
186
+ end
187
+ end
188
+
189
+ describe 'flush' do
190
+ it 'should be a flush' do
191
+ @flush.should be_flush
192
+ end
193
+
194
+ it 'should not be anything else' do
195
+ @flush.should_not be_pair
196
+ @flush.should_not be_two_pair
197
+ @flush.should_not be_set
198
+ @flush.should_not be_straight
199
+ @flush.should_not be_full_house
200
+ @flush.should_not be_quads
201
+ @flush.should_not be_straight_flush
202
+ end
203
+ end
204
+
205
+ describe 'straight' do
206
+ it 'should be a straight' do
207
+ @straight.should be_straight
208
+ end
209
+
210
+ it 'should not be anything else' do
211
+ @straight.should_not be_pair
212
+ @straight.should_not be_two_pair
213
+ @straight.should_not be_set
214
+ @straight.should_not be_flush
215
+ @straight.should_not be_full_house
216
+ @straight.should_not be_quads
217
+ @straight.should_not be_straight_flush
218
+ end
219
+
220
+ describe 'wheel' do
221
+ it 'should be a straight' do
222
+ Hand.new(
223
+ Card.new('Spades', 'Ace'),
224
+ Card.new('Clubs', '2'),
225
+ Card.new('Spades', '3'),
226
+ Card.new('Hearts', '4'),
227
+ Card.new('Diamonds', '5')
228
+ ).should be_straight
229
+ end
230
+ end
231
+ end
232
+
233
+ describe 'set' do
234
+ it 'should be a set' do
235
+ @set.should be_set
236
+ end
237
+
238
+ it 'should be a pair' do
239
+ @set.should be_pair
240
+ end
241
+
242
+ it 'should not be anything else' do
243
+ @set.should_not be_two_pair
244
+ @set.should_not be_straight
245
+ @set.should_not be_flush
246
+ @set.should_not be_full_house
247
+ @set.should_not be_quads
248
+ @set.should_not be_straight_flush
249
+ end
250
+ end
251
+
252
+ describe 'two pair' do
253
+ it 'should be two pair' do
254
+ @two_pair.should be_two_pair
255
+ end
256
+
257
+ it 'should be a pair' do
258
+ @two_pair.should be_pair
259
+ end
260
+
261
+ it 'should not be anything else' do
262
+ @two_pair.should_not be_set
263
+ @two_pair.should_not be_straight
264
+ @two_pair.should_not be_flush
265
+ @two_pair.should_not be_full_house
266
+ @two_pair.should_not be_quads
267
+ @two_pair.should_not be_straight_flush
268
+ end
269
+ end
270
+
271
+ describe 'pair' do
272
+ it 'should be a pair' do
273
+ @pair.should be_pair
274
+ end
275
+
276
+ it 'should not be anything else' do
277
+ @pair.should_not be_two_pair
278
+ @pair.should_not be_set
279
+ @pair.should_not be_straight
280
+ @pair.should_not be_flush
281
+ @pair.should_not be_full_house
282
+ @pair.should_not be_quads
283
+ @pair.should_not be_full_house
284
+ end
285
+ end
286
+
287
+ describe 'high card' do
288
+ it 'should not be anything else' do
289
+ @high_card.should_not be_pair
290
+ @high_card.should_not be_two_pair
291
+ @high_card.should_not be_set
292
+ @high_card.should_not be_straight
293
+ @high_card.should_not be_flush
294
+ @high_card.should_not be_full_house
295
+ @high_card.should_not be_quads
296
+ @high_card.should_not be_straight_flush
297
+ end
298
+ end
299
+
300
+ describe 'straight and flush' do
301
+ before do
302
+ @straight_and_flush = Hand.new(
303
+ Card.new('Spades', 'Ace'),
304
+ Card.new('Spades', '10'),
305
+ Card.new('Spades', '9'),
306
+ Card.new('Clubs', '8'),
307
+ Card.new('Spades', '7'),
308
+ Card.new('Spades', '6')
309
+ )
310
+ end
311
+
312
+ it 'should be a straight' do
313
+ @straight_and_flush.should be_straight
314
+ end
315
+
316
+ it 'should be a flush' do
317
+ @straight_and_flush.should be_flush
318
+ end
319
+
320
+ it 'should not be a straight flush' do
321
+ @straight_and_flush.should_not be_straight_flush
322
+ end
323
+ end
324
+
325
+ describe 'four to flush' do
326
+ before do
327
+ @four_to_flush = Hand.new(
328
+ Card.new('Spades', 'Ace'),
329
+ Card.new('Spades', '10'),
330
+ Card.new('Clubs', '8'),
331
+ Card.new('Spades', '7'),
332
+ Card.new('Spades', '6')
333
+ )
334
+ end
335
+
336
+ it 'should be four to a flush' do
337
+ @four_to_flush.should be_four_to_flush
338
+ end
339
+
340
+ it 'should not be a flush' do
341
+ @four_to_flush.should_not be_flush
342
+ end
343
+ end
344
+
345
+ describe 'open ended' do
346
+ before do
347
+ @open_ended = Hand.new(
348
+ Card.new('Spades', 'Ace'),
349
+ Card.new('Spades', '9'),
350
+ Card.new('Clubs', '8'),
351
+ Card.new('Spades', '7'),
352
+ Card.new('Spades', '6')
353
+ )
354
+ end
355
+
356
+ it 'should be open ended' do
357
+ @open_ended.should be_open_ended
358
+ end
359
+
360
+ it 'should not be a straight' do
361
+ @open_ended.should_not be_straight
362
+ end
363
+
364
+ it 'should not include Ace through 4' do
365
+ Hand.new(
366
+ Card.new('Spades', 'Ace'),
367
+ Card.new('Clubs', '2'),
368
+ Card.new('Spades', '3'),
369
+ Card.new('Hearts', '4'),
370
+ Card.new('Diamonds', '8')
371
+ ).should_not be_open_ended
372
+ end
373
+
374
+ it 'should not include Jack through Ace' do
375
+ Hand.new(
376
+ Card.new('Spades', 'Ace'),
377
+ Card.new('Clubs', 'King'),
378
+ Card.new('Spades', 'Queen'),
379
+ Card.new('Hearts', 'Jack'),
380
+ Card.new('Diamonds', '8')
381
+ ).should_not be_open_ended
382
+ end
383
+ end
384
+
385
+ describe 'gutshot' do
386
+ it 'should include 1-card gaps between 1 card and 3 others' do
387
+ Hand.new(
388
+ Card.new('Spades', 'Jack'),
389
+ Card.new('Clubs', '2'),
390
+ Card.new('Spades', '5'),
391
+ Card.new('Hearts', '4'),
392
+ Card.new('Diamonds', '6')
393
+ ).should be_gutshot
394
+ end
395
+
396
+ it 'should include 1-card gaps between 2 cards and 2 others' do
397
+ Hand.new(
398
+ Card.new('Spades', 'Jack'),
399
+ Card.new('Clubs', '2'),
400
+ Card.new('Spades', '5'),
401
+ Card.new('Hearts', '3'),
402
+ Card.new('Diamonds', '6')
403
+ ).should be_gutshot
404
+ end
405
+
406
+ it 'should include 1-card gaps between 3 cards and 1 other' do
407
+ Hand.new(
408
+ Card.new('Spades', 'Jack'),
409
+ Card.new('Clubs', '2'),
410
+ Card.new('Spades', '3'),
411
+ Card.new('Hearts', '4'),
412
+ Card.new('Diamonds', '6')
413
+ ).should be_gutshot
414
+ end
415
+
416
+ it 'should include Ace through 4' do
417
+ Hand.new(
418
+ Card.new('Spades', 'Ace'),
419
+ Card.new('Clubs', '2'),
420
+ Card.new('Spades', '3'),
421
+ Card.new('Hearts', '4'),
422
+ Card.new('Diamonds', '8')
423
+ ).should be_gutshot
424
+ end
425
+
426
+ it 'should include Jack through Ace' do
427
+ Hand.new(
428
+ Card.new('Spades', 'Ace'),
429
+ Card.new('Clubs', 'King'),
430
+ Card.new('Spades', 'Queen'),
431
+ Card.new('Hearts', 'Jack'),
432
+ Card.new('Diamonds', '8')
433
+ ).should be_gutshot
434
+ end
435
+ end
436
+
437
+ describe 'double gutshot' do
438
+ it 'should include 2 1-card gaps between 1, 3, and 1 cards' do
439
+ Hand.new(
440
+ Card.new('Spades', '4'),
441
+ Card.new('Clubs', '6'),
442
+ Card.new('Spades', '7'),
443
+ Card.new('Hearts', '8'),
444
+ Card.new('Diamonds', '10')
445
+ ).should be_double_gutshot
446
+ end
447
+
448
+ it 'should include 2 1-card gaps between 2, 2, and 2 cards' do
449
+ Hand.new(
450
+ Card.new('Spades', '4'),
451
+ Card.new('Clubs', '5'),
452
+ Card.new('Spades', '7'),
453
+ Card.new('Hearts', '8'),
454
+ Card.new('Diamonds', '10'),
455
+ Card.new('Hearts', 'Jack')
456
+ ).should be_double_gutshot
457
+ end
458
+
459
+ it 'should include 2 1-card gaps between 3, 1, and 3 cards' do
460
+ Hand.new(
461
+ Card.new('Spades', '4'),
462
+ Card.new('Clubs', '5'),
463
+ Card.new('Spades', '6'),
464
+ Card.new('Hearts', '8'),
465
+ Card.new('Diamonds', '10'),
466
+ Card.new('Hearts', 'Jack'),
467
+ Card.new('Clubs', 'Queen')
468
+ ).should be_double_gutshot
469
+ end
470
+
471
+ it 'should not include 2-card gaps between 2 cards and 3 cards' do
472
+ Hand.new(
473
+ Card.new('Spades', '4'),
474
+ Card.new('Clubs', '5'),
475
+ Card.new('Spades', '8'),
476
+ Card.new('Hearts', '9'),
477
+ Card.new('Diamonds', '10')
478
+ ).should_not be_double_gutshot
479
+ end
480
+
481
+ it 'should not include 2-card gaps between 3 cards and 2 cards' do
482
+ Hand.new(
483
+ Card.new('Spades', '4'),
484
+ Card.new('Clubs', '5'),
485
+ Card.new('Spades', '6'),
486
+ Card.new('Hearts', '9'),
487
+ Card.new('Diamonds', '10')
488
+ ).should_not be_double_gutshot
489
+ end
490
+
491
+ it 'should not include 1-card gaps between 3 cards and 3 cards' do
492
+ Hand.new(
493
+ Card.new('Spades', '4'),
494
+ Card.new('Clubs', '5'),
495
+ Card.new('Spades', '6'),
496
+ Card.new('Clubs', '8'),
497
+ Card.new('Hearts', '9'),
498
+ Card.new('Diamonds', '10')
499
+ ).should_not be_double_gutshot
500
+ end
501
+ end
502
+
503
+ describe 'rankings' do
504
+ before do
505
+ @highest_quads = Hand.new(
506
+ Card.new('Clubs', 'Ace'),
507
+ Card.new('Hearts', 'Ace'),
508
+ Card.new('Spades', 'Ace'),
509
+ Card.new('Diamonds', 'Ace'),
510
+ Card.new('Hearts', 'King')
511
+ )
512
+ @highest_full_house = Hand.new(
513
+ Card.new('Clubs', 'Ace'),
514
+ Card.new('Hearts', 'Ace'),
515
+ Card.new('Spades', 'Ace'),
516
+ Card.new('Diamonds', 'King'),
517
+ Card.new('Hearts', 'King')
518
+ )
519
+ @highest_flush = Hand.new(
520
+ Card.new('Clubs', 'Ace'),
521
+ Card.new('Clubs', 'King'),
522
+ Card.new('Clubs', 'Queen'),
523
+ Card.new('Clubs', 'Jack'),
524
+ Card.new('Clubs', '9')
525
+ )
526
+ @highest_straight = Hand.new(
527
+ Card.new('Clubs', 'Ace'),
528
+ Card.new('Hearts', 'King'),
529
+ Card.new('Spades', 'Queen'),
530
+ Card.new('Diamonds', 'Jack'),
531
+ Card.new('Hearts', '10')
532
+ )
533
+ @highest_set = Hand.new(
534
+ Card.new('Clubs', 'Ace'),
535
+ Card.new('Hearts', 'Ace'),
536
+ Card.new('Spades', 'Ace'),
537
+ Card.new('Diamonds', 'King'),
538
+ Card.new('Hearts', 'Queen')
539
+ )
540
+ @highest_two_pair = Hand.new(
541
+ Card.new('Clubs', 'Ace'),
542
+ Card.new('Hearts', 'Ace'),
543
+ Card.new('Spades', 'King'),
544
+ Card.new('Diamonds', 'King'),
545
+ Card.new('Hearts', 'Queen')
546
+ )
547
+ @highest_pair = Hand.new(
548
+ Card.new('Hearts', 'Ace'),
549
+ Card.new('Diamonds', 'Ace'),
550
+ Card.new('Spades', 'King'),
551
+ Card.new('Diamonds', 'Queen'),
552
+ Card.new('Clubs', 'Jack')
553
+ )
554
+ @highest_high_card = Hand.new(
555
+ Card.new('Hearts', 'Ace'),
556
+ Card.new('Spades', 'King'),
557
+ Card.new('Diamonds', 'Queen'),
558
+ Card.new('Clubs', 'Jack'),
559
+ Card.new('Diamonds', '9')
560
+ )
561
+ end
562
+
563
+ describe 'straight flush' do
564
+ before do
565
+ @highest_straight_flush = Hand.new(
566
+ Card.new('Clubs', 'Ace'),
567
+ Card.new('Clubs', 'King'),
568
+ Card.new('Clubs', 'Queen'),
569
+ Card.new('Clubs', 'Jack'),
570
+ Card.new('Clubs', '10')
571
+ )
572
+ @lowest_straight_flush = Hand.new(
573
+ Card.new('Clubs', 'Ace'),
574
+ Card.new('Clubs', '2'),
575
+ Card.new('Clubs', '3'),
576
+ Card.new('Clubs', '4'),
577
+ Card.new('Clubs', '5')
578
+ )
579
+ end
580
+
581
+ it 'should beat a smaller straight flush' do
582
+ @highest_straight_flush.should > @straight_flush
583
+ @straight_flush.should > @lowest_straight_flush
584
+ end
585
+
586
+ it 'should beat any quads' do
587
+ @lowest_straight_flush.should > @highest_quads
588
+ end
589
+
590
+ it 'should beat any full house' do
591
+ @lowest_straight_flush.should > @highest_full_house
592
+ end
593
+
594
+ it 'should beat any flush' do
595
+ @lowest_straight_flush.should > @highest_flush
596
+ end
597
+
598
+ it 'should beat any straight' do
599
+ @lowest_straight_flush.should > @highest_straight
600
+ end
601
+
602
+ it 'should beat any set' do
603
+ @lowest_straight_flush.should > @highest_set
604
+ end
605
+
606
+ it 'should beat any two pair' do
607
+ @lowest_straight_flush.should > @highest_two_pair
608
+ end
609
+
610
+ it 'should beat any pair' do
611
+ @lowest_straight_flush.should > @highest_pair
612
+ end
613
+
614
+ it 'should beat any high card' do
615
+ @lowest_straight_flush.should > @highest_high_card
616
+ end
617
+ end
618
+
619
+ describe 'quads' do
620
+ before do
621
+ @lowest_quads = Hand.new(
622
+ Card.new('Clubs', '2'),
623
+ Card.new('Hearts', '2'),
624
+ Card.new('Spades', '2'),
625
+ Card.new('Diamonds', '2'),
626
+ Card.new('Hearts', '3')
627
+ )
628
+ end
629
+
630
+ it 'should beat smaller quads' do
631
+ @highest_quads.should > @quads
632
+ @quads.should > @lowest_quads
633
+ end
634
+
635
+ it 'should beat any full house' do
636
+ @lowest_quads.should > @highest_full_house
637
+ end
638
+
639
+ it 'should beat any flush' do
640
+ @lowest_quads.should > @highest_flush
641
+ end
642
+
643
+ it 'should beat any straight' do
644
+ @lowest_quads.should > @highest_straight
645
+ end
646
+
647
+ it 'should beat any set' do
648
+ @lowest_quads.should > @highest_set
649
+ end
650
+
651
+ it 'should beat any two pair' do
652
+ @lowest_quads.should > @highest_two_pair
653
+ end
654
+
655
+ it 'should beat any pair' do
656
+ @lowest_quads.should > @highest_pair
657
+ end
658
+
659
+ it 'should beat any high card' do
660
+ @lowest_quads.should > @highest_high_card
661
+ end
662
+
663
+ it 'should consider the quads first' do
664
+ Hand.new(
665
+ Card.new('Clubs', 'Ace'),
666
+ Card.new('Hearts', 'Ace'),
667
+ Card.new('Spades', 'Ace'),
668
+ Card.new('Diamonds', 'Ace'),
669
+ Card.new('Hearts', '2')
670
+ ).should > Hand.new(
671
+ Card.new('Clubs', 'King'),
672
+ Card.new('Hearts', 'King'),
673
+ Card.new('Spades', 'King'),
674
+ Card.new('Diamonds', 'King'),
675
+ Card.new('Hearts', 'Queen')
676
+ )
677
+ end
678
+
679
+ it 'should consider the kicker if the quads are the same' do
680
+ Hand.new(
681
+ Card.new('Clubs', 'Ace'),
682
+ Card.new('Hearts', 'Ace'),
683
+ Card.new('Spades', 'Ace'),
684
+ Card.new('Diamonds', 'Ace'),
685
+ Card.new('Hearts', 'Queen')
686
+ ).should > Hand.new(
687
+ Card.new('Clubs', 'Ace'),
688
+ Card.new('Hearts', 'Ace'),
689
+ Card.new('Spades', 'Ace'),
690
+ Card.new('Diamonds', 'Ace'),
691
+ Card.new('Hearts', 'Jack')
692
+ )
693
+ end
694
+ end
695
+
696
+ describe 'full house' do
697
+ before do
698
+ @lowest_full_house = Hand.new(
699
+ Card.new('Clubs', '2'),
700
+ Card.new('Hearts', '2'),
701
+ Card.new('Spades', '2'),
702
+ Card.new('Diamonds', '3'),
703
+ Card.new('Hearts', '3')
704
+ )
705
+ end
706
+
707
+ it 'should beat a smaller full house' do
708
+ @highest_full_house.should > @full_house
709
+ @full_house.should > @lowest_full_house
710
+ end
711
+
712
+ it 'should beat any flush' do
713
+ @lowest_full_house.should > @highest_flush
714
+ end
715
+
716
+ it 'should beat any straight' do
717
+ @lowest_full_house.should > @highest_straight
718
+ end
719
+
720
+ it 'should beat any set' do
721
+ @lowest_full_house.should > @highest_set
722
+ end
723
+
724
+ it 'should beat any two pair' do
725
+ @lowest_full_house.should > @highest_two_pair
726
+ end
727
+
728
+ it 'should beat any pair' do
729
+ @lowest_full_house.should > @highest_pair
730
+ end
731
+
732
+ it 'should beat any high card' do
733
+ @lowest_full_house.should > @highest_high_card
734
+ end
735
+
736
+ it 'should consider the set first' do
737
+ Hand.new(
738
+ Card.new('Clubs', 'Ace'),
739
+ Card.new('Hearts', 'Ace'),
740
+ Card.new('Spades', 'Ace'),
741
+ Card.new('Diamonds', '2'),
742
+ Card.new('Hearts', '2')
743
+ ).should > Hand.new(
744
+ Card.new('Clubs', 'King'),
745
+ Card.new('Hearts', 'King'),
746
+ Card.new('Spades', 'King'),
747
+ Card.new('Diamonds', 'Queen'),
748
+ Card.new('Hearts', 'Queen')
749
+ )
750
+ end
751
+
752
+ it 'should consider the pair if the set is the same' do
753
+ Hand.new(
754
+ Card.new('Clubs', 'Ace'),
755
+ Card.new('Hearts', 'Ace'),
756
+ Card.new('Spades', 'Ace'),
757
+ Card.new('Diamonds', 'Queen'),
758
+ Card.new('Hearts', 'Queen')
759
+ ).should > Hand.new(
760
+ Card.new('Clubs', 'Ace'),
761
+ Card.new('Hearts', 'Ace'),
762
+ Card.new('Spades', 'Ace'),
763
+ Card.new('Diamonds', 'Jack'),
764
+ Card.new('Hearts', 'Jack')
765
+ )
766
+ end
767
+ end
768
+
769
+ describe 'flush' do
770
+ before do
771
+ @lowest_flush = Hand.new(
772
+ Card.new('Clubs', '2'),
773
+ Card.new('Clubs', '3'),
774
+ Card.new('Clubs', '4'),
775
+ Card.new('Clubs', '5'),
776
+ Card.new('Clubs', '7')
777
+ )
778
+ end
779
+
780
+ it 'should beat a smaller flush' do
781
+ @highest_flush.should > @flush
782
+ @flush.should > @lowest_flush
783
+ end
784
+
785
+ it 'should beat any straight' do
786
+ @lowest_flush.should > @highest_straight
787
+ end
788
+
789
+ it 'should beat any set' do
790
+ @lowest_flush.should > @highest_set
791
+ end
792
+
793
+ it 'should beat any two pair' do
794
+ @lowest_flush.should > @highest_two_pair
795
+ end
796
+
797
+ it 'should beat any pair' do
798
+ @lowest_flush.should > @highest_pair
799
+ end
800
+
801
+ it 'should beat any high card' do
802
+ @lowest_flush.should > @highest_high_card
803
+ end
804
+
805
+ it 'should compare the highest cards in the flush' do
806
+ Hand.new(
807
+ Card.new('Spades', 'Ace'),
808
+ Card.new('Spades', 'King'),
809
+ Card.new('Spades', '4'),
810
+ Card.new('Spades', '3'),
811
+ Card.new('Spades', '2')
812
+ ).should > Hand.new(
813
+ Card.new('Spades', 'Ace'),
814
+ Card.new('Spades', 'Queen'),
815
+ Card.new('Spades', 'Jack'),
816
+ Card.new('Spades', '10'),
817
+ Card.new('Spades', '9')
818
+ )
819
+ end
820
+ end
821
+
822
+ describe 'straight' do
823
+ before do
824
+ @lowest_straight = Hand.new(
825
+ Card.new('Clubs', 'Ace'),
826
+ Card.new('Hearts', '2'),
827
+ Card.new('Spades', '3'),
828
+ Card.new('Diamonds', '4'),
829
+ Card.new('Hearts', '5')
830
+ )
831
+ end
832
+
833
+ it 'should beat a smaller straight' do
834
+ @highest_straight.should > @straight
835
+ @straight.should > @lowest_straight
836
+ end
837
+
838
+ it 'should beat any set' do
839
+ @lowest_straight.should > @highest_set
840
+ end
841
+
842
+ it 'should beat any two pair' do
843
+ @lowest_straight.should > @highest_two_pair
844
+ end
845
+
846
+ it 'should beat any pair' do
847
+ @lowest_straight.should > @highest_pair
848
+ end
849
+
850
+ it 'should beat any high card' do
851
+ @lowest_straight.should > @highest_high_card
852
+ end
853
+ end
854
+
855
+ describe 'set' do
856
+ before do
857
+ @lowest_set = Hand.new(
858
+ Card.new('Spades', '2'),
859
+ Card.new('Clubs', '2'),
860
+ Card.new('Hearts', '2'),
861
+ Card.new('Diamonds', '3'),
862
+ Card.new('Clubs', '4')
863
+ )
864
+ end
865
+
866
+ it 'should beat a smaller set' do
867
+ @highest_set.should > @set
868
+ @set.should > @lowest_set
869
+ end
870
+
871
+ it 'should beat any two pair' do
872
+ @lowest_set.should > @highest_two_pair
873
+ end
874
+
875
+ it 'should beat any pair' do
876
+ @lowest_set.should > @highest_pair
877
+ end
878
+
879
+ it 'should beat any high card' do
880
+ @lowest_set.should > @highest_high_card
881
+ end
882
+
883
+ it 'should beat smaller sets' do
884
+ Hand.new(
885
+ Card.new('Spades', '7'),
886
+ Card.new('Clubs', '7'),
887
+ Card.new('Diamonds', '7'),
888
+ Card.new('Hearts', '2'),
889
+ Card.new('Clubs', '3')
890
+ ).should > Hand.new(
891
+ Card.new('Spades', '6'),
892
+ Card.new('Clubs', '6'),
893
+ Card.new('Diamonds', '6'),
894
+ Card.new('Hearts', 'King'),
895
+ Card.new('Clubs', 'Ace')
896
+ )
897
+ end
898
+
899
+ it 'should beat smaller kickers' do
900
+ Hand.new(
901
+ Card.new('Spades', '7'),
902
+ Card.new('Clubs', '7'),
903
+ Card.new('Diamonds', '7'),
904
+ Card.new('Hearts', 'Ace'),
905
+ Card.new('Clubs', 'Jack')
906
+ ).should > Hand.new(
907
+ Card.new('Spades', '7'),
908
+ Card.new('Clubs', '7'),
909
+ Card.new('Diamonds', '7'),
910
+ Card.new('Hearts', 'Ace'),
911
+ Card.new('Clubs', '10')
912
+ )
913
+ end
914
+ end
915
+
916
+ describe 'two pair' do
917
+ before do
918
+ @lowest_two_pair = Hand.new(
919
+ Card.new('Spades', '2'),
920
+ Card.new('Clubs', '2'),
921
+ Card.new('Hearts', '3'),
922
+ Card.new('Diamonds', '3'),
923
+ Card.new('Clubs', '4')
924
+ )
925
+ end
926
+
927
+ it 'should beat a smaller two pair' do
928
+ @highest_two_pair.should > @two_pair
929
+ @two_pair.should > @lowest_two_pair
930
+ end
931
+
932
+ it 'should beat any pair' do
933
+ @lowest_two_pair.should > @highest_pair
934
+ end
935
+
936
+ it 'should beat any high card' do
937
+ @lowest_two_pair.should > @highest_high_card
938
+ end
939
+
940
+ it 'should beat smaller first pairs' do
941
+ Hand.new(
942
+ Card.new('Spades', 'Ace'),
943
+ Card.new('Clubs', 'Ace'),
944
+ Card.new('Diamonds', '2'),
945
+ Card.new('Hearts', '2'),
946
+ Card.new('Clubs', '3')
947
+ ).should > Hand.new(
948
+ Card.new('Spades', 'King'),
949
+ Card.new('Clubs', 'King'),
950
+ Card.new('Diamonds', 'Queen'),
951
+ Card.new('Hearts', 'Queen'),
952
+ Card.new('Clubs', 'Ace')
953
+ )
954
+ end
955
+
956
+ it 'should beat smaller second pairs' do
957
+ Hand.new(
958
+ Card.new('Spades', 'King'),
959
+ Card.new('Clubs', 'King'),
960
+ Card.new('Diamonds', 'Queen'),
961
+ Card.new('Hearts', 'Queen'),
962
+ Card.new('Clubs', '2')
963
+ ).should > Hand.new(
964
+ Card.new('Spades', 'King'),
965
+ Card.new('Clubs', 'King'),
966
+ Card.new('Diamonds', 'Jack'),
967
+ Card.new('Hearts', 'Jack'),
968
+ Card.new('Clubs', 'Ace')
969
+ )
970
+ end
971
+
972
+ it 'should beat smaller kickers' do
973
+ Hand.new(
974
+ Card.new('Spades', 'King'),
975
+ Card.new('Clubs', 'King'),
976
+ Card.new('Diamonds', 'Queen'),
977
+ Card.new('Hearts', 'Queen'),
978
+ Card.new('Clubs', 'Ace')
979
+ ).should > Hand.new(
980
+ Card.new('Spades', 'King'),
981
+ Card.new('Clubs', 'King'),
982
+ Card.new('Diamonds', 'Queen'),
983
+ Card.new('Hearts', 'Queen'),
984
+ Card.new('Clubs', 'Jack')
985
+ )
986
+ end
987
+ end
988
+
989
+ describe 'pair' do
990
+ before do
991
+ @lowest_pair = Hand.new(
992
+ Card.new('Spades', '2'),
993
+ Card.new('Clubs', '2'),
994
+ Card.new('Hearts', '3'),
995
+ Card.new('Diamonds', '4'),
996
+ Card.new('Diamonds', '5')
997
+ )
998
+ end
999
+
1000
+ it 'should beat a smaller pair' do
1001
+ @highest_pair.should > @pair
1002
+ @pair.should > @lowest_pair
1003
+ end
1004
+
1005
+ it 'should beat any high card' do
1006
+ @lowest_pair.should > @highest_high_card
1007
+ end
1008
+
1009
+ it 'should beat smaller kickers' do
1010
+ Hand.new(
1011
+ Card.new('Spades', 'Ace'),
1012
+ Card.new('Clubs', 'Ace'),
1013
+ Card.new('Diamonds', 'King'),
1014
+ Card.new('Hearts', 'Queen'),
1015
+ Card.new('Clubs', '2')
1016
+ ).should > Hand.new(
1017
+ Card.new('Spades', 'Ace'),
1018
+ Card.new('Clubs', 'Ace'),
1019
+ Card.new('Diamonds', 'King'),
1020
+ Card.new('Hearts', 'Jack'),
1021
+ Card.new('Clubs', '10')
1022
+ )
1023
+ end
1024
+ end
1025
+
1026
+ describe 'high card' do
1027
+ it 'should beat a smaller high card' do
1028
+ @highest_high_card.should > @high_card
1029
+ end
1030
+
1031
+ it 'should beat a smaller subsequent card' do
1032
+ Hand.new(
1033
+ Card.new('Spades', 'Ace'),
1034
+ Card.new('Clubs', 'King'),
1035
+ Card.new('Diamonds', '4'),
1036
+ Card.new('Hearts', '3'),
1037
+ Card.new('Clubs', '2')
1038
+ ).should > Hand.new(
1039
+ Card.new('Spades', 'Ace'),
1040
+ Card.new('Clubs', 'Queen'),
1041
+ Card.new('Diamonds', 'Jack'),
1042
+ Card.new('Hearts', '10'),
1043
+ Card.new('Clubs', '9')
1044
+ )
1045
+ end
1046
+ end
1047
+ end
1048
+ end
1049
+ end