console-blackjack 1.0.7 → 1.1.0
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.
- checksums.yaml +4 -4
- data/Gemfile +3 -2
- data/Gemfile.lock +38 -67
- data/README.md +3 -2
- data/bj.txt +1 -1
- data/{bj.png → console-blackjack-1.0.7.gem} +0 -0
- data/console-blackjack-1.0.8.gem +0 -0
- data/console-blackjack-1.0.9.gem +0 -0
- data/console-blackjack.gemspec +4 -3
- data/lib/blackjack/card.rb +16 -4
- data/lib/blackjack/dealer_hand.rb +1 -1
- data/lib/blackjack/hand.rb +1 -1
- data/lib/blackjack/menus.rb +35 -18
- data/lib/blackjack/player_hand.rb +18 -21
- data/lib/blackjack/shoe.rb +25 -36
- data/lib/blackjack/utils.rb +11 -4
- data/lib/blackjack.rb +11 -6
- data/spec/factories/blackjack_factory.rb +1 -0
- data/spec/factories/card_factory.rb +2 -1
- data/spec/factories/shoe_factory.rb +2 -1
- data/spec/lib/blackjack/card_spec.rb +16 -4
- data/spec/lib/blackjack/dealer_hand_spec.rb +8 -15
- data/spec/lib/blackjack/player_hand_spec.rb +79 -24
- data/spec/lib/blackjack/shoe_spec.rb +24 -17
- data/spec/lib/blackjack_spec.rb +162 -54
- data/spec/spec_helper.rb +4 -5
- data/ss1.png +0 -0
- data/ss2.png +0 -0
- metadata +10 -5
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
FactoryBot.define do
|
4
4
|
factory :shoe do
|
5
|
+
blackjack { nil }
|
5
6
|
num_decks { 1 }
|
6
7
|
cards { [] }
|
7
8
|
|
@@ -9,6 +10,6 @@ FactoryBot.define do
|
|
9
10
|
after(:build, &:new_regular)
|
10
11
|
end
|
11
12
|
|
12
|
-
initialize_with { new(num_decks) }
|
13
|
+
initialize_with { new(blackjack, num_decks) }
|
13
14
|
end
|
14
15
|
end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
# coding: utf-8
|
2
1
|
# frozen_string_literal: true
|
3
2
|
|
4
3
|
RSpec.describe Card do
|
5
|
-
let(:
|
4
|
+
let(:blackjack) { build(:blackjack) }
|
5
|
+
let(:card) { build(:card, blackjack: blackjack) }
|
6
6
|
|
7
7
|
describe '.new' do
|
8
8
|
it 'creates a card' do
|
@@ -19,8 +19,20 @@ RSpec.describe Card do
|
|
19
19
|
end
|
20
20
|
|
21
21
|
describe '#to_s' do
|
22
|
-
|
23
|
-
|
22
|
+
context 'with regular faces' do
|
23
|
+
it 'returns a string value' do
|
24
|
+
expect(card.to_s).to eq('🂡')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'with alternate faces' do
|
29
|
+
before do
|
30
|
+
blackjack.face_type = 2
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'returns a string value' do
|
34
|
+
expect(card.to_s).to eq('A♠')
|
35
|
+
end
|
24
36
|
end
|
25
37
|
end
|
26
38
|
|
@@ -4,13 +4,8 @@ RSpec.describe DealerHand do
|
|
4
4
|
let(:shoe) { build(:shoe, :new_regular) }
|
5
5
|
let(:blackjack) { build(:blackjack) }
|
6
6
|
let(:dealer_hand) { build(:dealer_hand, blackjack: blackjack) }
|
7
|
-
let(:ace) { build(:card, :ace) }
|
8
|
-
let(:
|
9
|
-
let(:six) { build(:card, :six) }
|
10
|
-
let(:seven) { build(:card, :seven) }
|
11
|
-
let(:eight) { build(:card, :eight) }
|
12
|
-
let(:nine) { build(:card, :nine) }
|
13
|
-
let(:ten) { build(:card, :ten) }
|
7
|
+
let(:ace) { build(:card, :ace, blackjack: blackjack) }
|
8
|
+
let(:ten) { build(:card, :ten, blackjack: blackjack) }
|
14
9
|
|
15
10
|
describe '.new' do
|
16
11
|
it 'creates a dealer_hand' do
|
@@ -79,19 +74,19 @@ RSpec.describe DealerHand do
|
|
79
74
|
end
|
80
75
|
|
81
76
|
describe '#draw' do
|
82
|
-
it 'returns " 🂪 🂠
|
77
|
+
it 'returns " 🂪 🂠 ⇒ 10"' do
|
83
78
|
dealer_hand.cards << ten << ace
|
84
79
|
expected = ' 🂪 🂠 ⇒ 10'
|
85
80
|
expect(dealer_hand.draw).to eq(expected)
|
86
81
|
end
|
87
82
|
|
88
|
-
it 'returns " 🂡 🂠
|
83
|
+
it 'returns " 🂡 🂠 ⇒ 11"' do
|
89
84
|
dealer_hand.cards << ace << ten
|
90
85
|
expected = ' 🂡 🂠 ⇒ 11'
|
91
86
|
expect(dealer_hand.draw).to eq(expected)
|
92
87
|
end
|
93
88
|
|
94
|
-
it 'returns " 🂡 🂪
|
89
|
+
it 'returns " 🂡 🂪 ⇒ 21"' do
|
95
90
|
dealer_hand.cards << ace << ten
|
96
91
|
dealer_hand.hide_down_card = false
|
97
92
|
expected = ' 🂡 🂪 ⇒ 21'
|
@@ -132,15 +127,13 @@ RSpec.describe DealerHand do
|
|
132
127
|
end
|
133
128
|
|
134
129
|
describe '#deal_required_cards' do
|
135
|
-
let(:shoe) { build(:shoe, :new_regular) }
|
136
|
-
|
137
130
|
before do
|
138
|
-
blackjack.shoe = shoe
|
131
|
+
blackjack.shoe = build(:shoe, :new_regular)
|
139
132
|
end
|
140
133
|
|
141
134
|
context 'when soft is < 18' do
|
142
135
|
it 'deals cards' do
|
143
|
-
dealer_hand.cards << ace << seven
|
136
|
+
dealer_hand.cards << ace << build(:card, :seven)
|
144
137
|
dealer_hand.deal_required_cards
|
145
138
|
expect(dealer_hand.cards.size >= 3).to be_truthy
|
146
139
|
end
|
@@ -148,7 +141,7 @@ RSpec.describe DealerHand do
|
|
148
141
|
|
149
142
|
context 'when hard is < 17' do
|
150
143
|
it 'deals cards' do
|
151
|
-
dealer_hand.cards << ace << ten << five
|
144
|
+
dealer_hand.cards << ace << ten << build(:card, :five)
|
152
145
|
dealer_hand.deal_required_cards
|
153
146
|
expect(dealer_hand.cards.size >= 4).to be_truthy
|
154
147
|
end
|
@@ -1,16 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
RSpec.describe PlayerHand do
|
4
|
-
let(:
|
5
|
-
let(:blackjack) { build(:blackjack, shoe: shoe) }
|
4
|
+
let(:blackjack) { build(:blackjack, shoe: build(:shoe, :new_regular)) }
|
6
5
|
let(:player_hand) { build(:player_hand, blackjack: blackjack) }
|
7
6
|
let(:dealer_hand) { build(:dealer_hand, blackjack: blackjack) }
|
8
|
-
let(:ace) { build(:card, :ace) }
|
9
|
-
let(:
|
10
|
-
let(:seven) { build(:card, :seven) }
|
11
|
-
let(:eight) { build(:card, :eight) }
|
12
|
-
let(:nine) { build(:card, :nine) }
|
13
|
-
let(:ten) { build(:card, :ten) }
|
7
|
+
let(:ace) { build(:card, :ace, blackjack: blackjack) }
|
8
|
+
let(:ten) { build(:card, :ten, blackjack: blackjack) }
|
14
9
|
|
15
10
|
describe '.new' do
|
16
11
|
it 'creates a player_hand' do
|
@@ -126,7 +121,7 @@ RSpec.describe PlayerHand do
|
|
126
121
|
|
127
122
|
context 'when soft count of 21' do
|
128
123
|
it 'returns true' do
|
129
|
-
player_hand.cards << ace << ace << nine
|
124
|
+
player_hand.cards << ace << ace << build(:card, :nine)
|
130
125
|
expect(player_hand).to be_done
|
131
126
|
end
|
132
127
|
end
|
@@ -140,7 +135,7 @@ RSpec.describe PlayerHand do
|
|
140
135
|
|
141
136
|
context 'when pair of sevens' do
|
142
137
|
it 'returns false' do
|
143
|
-
player_hand.cards << seven << seven
|
138
|
+
player_hand.cards << build(:card, :seven) << build(:card, :seven)
|
144
139
|
expect(player_hand).to_not be_done
|
145
140
|
end
|
146
141
|
end
|
@@ -163,7 +158,7 @@ RSpec.describe PlayerHand do
|
|
163
158
|
|
164
159
|
context 'when not enough money' do
|
165
160
|
it 'returns false' do
|
166
|
-
blackjack.money =
|
161
|
+
blackjack.money = 499
|
167
162
|
expect(player_hand).to_not be_can_split
|
168
163
|
end
|
169
164
|
end
|
@@ -177,14 +172,14 @@ RSpec.describe PlayerHand do
|
|
177
172
|
|
178
173
|
context 'when card values do not match' do
|
179
174
|
it 'returns false' do
|
180
|
-
player_hand.cards << seven << nine
|
175
|
+
player_hand.cards << build(:card, :seven) << build(:card, :nine)
|
181
176
|
expect(player_hand).to_not be_can_split
|
182
177
|
end
|
183
178
|
end
|
184
179
|
|
185
180
|
context 'when card values match' do
|
186
181
|
it 'returns true' do
|
187
|
-
player_hand.cards << seven << seven
|
182
|
+
player_hand.cards << build(:card, :seven) << build(:card, :seven)
|
188
183
|
expect(player_hand).to be_can_split
|
189
184
|
end
|
190
185
|
end
|
@@ -193,7 +188,7 @@ RSpec.describe PlayerHand do
|
|
193
188
|
describe '#can_dbl?' do
|
194
189
|
context 'when not enough money' do
|
195
190
|
it 'returns false' do
|
196
|
-
blackjack.money =
|
191
|
+
blackjack.money = 499
|
197
192
|
expect(player_hand).to_not be_can_dbl
|
198
193
|
end
|
199
194
|
end
|
@@ -221,7 +216,7 @@ RSpec.describe PlayerHand do
|
|
221
216
|
|
222
217
|
context 'when a pair of sixes' do
|
223
218
|
it 'returns true' do
|
224
|
-
player_hand.cards << six << six
|
219
|
+
player_hand.cards << build(:card, :six) << build(:card, :six)
|
225
220
|
expect(player_hand).to be_can_dbl
|
226
221
|
end
|
227
222
|
end
|
@@ -244,14 +239,14 @@ RSpec.describe PlayerHand do
|
|
244
239
|
|
245
240
|
context 'when busted' do
|
246
241
|
it 'returns false' do
|
247
|
-
player_hand.cards << eight << eight << eight
|
242
|
+
player_hand.cards << build(:card, :eight) << build(:card, :eight) << build(:card, :eight)
|
248
243
|
expect(player_hand).to_not be_can_stand
|
249
244
|
end
|
250
245
|
end
|
251
246
|
|
252
247
|
context 'when a pair of sixes' do
|
253
248
|
it 'returns true' do
|
254
|
-
player_hand.cards << six << six
|
249
|
+
player_hand.cards << build(:card, :six) << build(:card, :six)
|
255
250
|
expect(player_hand).to be_can_stand
|
256
251
|
end
|
257
252
|
end
|
@@ -281,21 +276,21 @@ RSpec.describe PlayerHand do
|
|
281
276
|
|
282
277
|
context 'when busted' do
|
283
278
|
it 'returns false' do
|
284
|
-
player_hand.cards << eight << eight << eight
|
279
|
+
player_hand.cards << build(:card, :eight) << build(:card, :eight) << build(:card, :eight)
|
285
280
|
expect(player_hand).to_not be_can_hit
|
286
281
|
end
|
287
282
|
end
|
288
283
|
|
289
284
|
context 'when a hard 21' do
|
290
285
|
it 'returns false' do
|
291
|
-
player_hand.cards << seven << seven << seven
|
286
|
+
player_hand.cards << build(:card, :seven) << build(:card, :seven) << build(:card, :seven)
|
292
287
|
expect(player_hand).to_not be_can_hit
|
293
288
|
end
|
294
289
|
end
|
295
290
|
|
296
291
|
context 'when a pair of sixes' do
|
297
292
|
it 'returns true' do
|
298
|
-
player_hand.cards << six << six
|
293
|
+
player_hand.cards << build(:card, :six) << build(:card, :six)
|
299
294
|
expect(player_hand).to be_can_hit
|
300
295
|
end
|
301
296
|
end
|
@@ -494,6 +489,66 @@ RSpec.describe PlayerHand do
|
|
494
489
|
end
|
495
490
|
end
|
496
491
|
|
492
|
+
describe '#draw_actions' do
|
493
|
+
it 'can hit and stand' do
|
494
|
+
expect do
|
495
|
+
player_hand.draw_actions
|
496
|
+
end.to output(" (H) Hit (S) Stand\n").to_stdout
|
497
|
+
end
|
498
|
+
|
499
|
+
it 'cannot hit' do
|
500
|
+
allow(player_hand).to receive(:can_hit?).and_return(false)
|
501
|
+
expect do
|
502
|
+
player_hand.draw_actions
|
503
|
+
end.to output(" (S) Stand\n").to_stdout
|
504
|
+
end
|
505
|
+
|
506
|
+
it 'cannot stand' do
|
507
|
+
allow(player_hand).to receive(:can_stand?).and_return(false)
|
508
|
+
expect do
|
509
|
+
player_hand.draw_actions
|
510
|
+
end.to output(" (H) Hit\n").to_stdout
|
511
|
+
end
|
512
|
+
|
513
|
+
it 'can split' do
|
514
|
+
allow(player_hand).to receive(:can_split?).and_return(true)
|
515
|
+
expect do
|
516
|
+
player_hand.draw_actions
|
517
|
+
end.to output(" (H) Hit (S) Stand (P) Split\n").to_stdout
|
518
|
+
end
|
519
|
+
|
520
|
+
it 'can double' do
|
521
|
+
allow(player_hand).to receive(:can_dbl?).and_return(true)
|
522
|
+
expect do
|
523
|
+
player_hand.draw_actions
|
524
|
+
end.to output(" (H) Hit (S) Stand (D) Double\n").to_stdout
|
525
|
+
end
|
526
|
+
end
|
527
|
+
|
528
|
+
describe '#draw_lost_str' do
|
529
|
+
it 'returns Busted!' do
|
530
|
+
allow(player_hand).to receive(:busted?).and_return(true)
|
531
|
+
expect(player_hand.draw_lost_str).to eq('Busted!')
|
532
|
+
end
|
533
|
+
|
534
|
+
it 'returns Lose!' do
|
535
|
+
allow(player_hand).to receive(:busted?).and_return(false)
|
536
|
+
expect(player_hand.draw_lost_str).to eq('Lose!')
|
537
|
+
end
|
538
|
+
end
|
539
|
+
|
540
|
+
describe '#draw_won_str' do
|
541
|
+
it 'returns Blackjack!' do
|
542
|
+
allow(player_hand).to receive(:blackjack?).and_return(true)
|
543
|
+
expect(player_hand.draw_won_str).to eq('Blackjack!')
|
544
|
+
end
|
545
|
+
|
546
|
+
it 'returns Won!' do
|
547
|
+
allow(player_hand).to receive(:blackjack?).and_return(false)
|
548
|
+
expect(player_hand.draw_won_str).to eq('Won!')
|
549
|
+
end
|
550
|
+
end
|
551
|
+
|
497
552
|
describe '#pay' do
|
498
553
|
it 'returns if already payed' do
|
499
554
|
player_hand.payed = true
|
@@ -535,25 +590,25 @@ RSpec.describe PlayerHand do
|
|
535
590
|
end
|
536
591
|
|
537
592
|
it 'hand is lost' do
|
538
|
-
player_hand.cards << ten << seven
|
593
|
+
player_hand.cards << ten << build(:card, :seven)
|
539
594
|
player_hand.pay(18, false)
|
540
595
|
expect(player_hand.status).to eq(LOST)
|
541
596
|
end
|
542
597
|
|
543
598
|
it 'blackjack money is descreased by player hand bet' do
|
544
|
-
player_hand.cards << ten << seven
|
599
|
+
player_hand.cards << ten << build(:card, :seven)
|
545
600
|
player_hand.pay(18, false)
|
546
601
|
expect(blackjack.money).to eq(9500)
|
547
602
|
end
|
548
603
|
|
549
604
|
it 'hand is push' do
|
550
|
-
player_hand.cards << ten << seven
|
605
|
+
player_hand.cards << ten << build(:card, :seven)
|
551
606
|
player_hand.pay(17, false)
|
552
607
|
expect(player_hand.status).to eq(PUSH)
|
553
608
|
end
|
554
609
|
|
555
610
|
it 'blackjack money is unaltered' do
|
556
|
-
player_hand.cards << ten << seven
|
611
|
+
player_hand.cards << ten << build(:card, :seven)
|
557
612
|
player_hand.pay(17, false)
|
558
613
|
expect(blackjack.money).to eq(10_000)
|
559
614
|
end
|
@@ -1,7 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
RSpec.describe Shoe do
|
4
|
-
let(:
|
4
|
+
let(:blackjack) { build(:blackjack) }
|
5
|
+
let(:shoe) { build(:shoe, blackjack: blackjack) }
|
6
|
+
|
7
|
+
describe 'CARDS_PER_DECK' do
|
8
|
+
it 'returns 52' do
|
9
|
+
expect(described_class::CARDS_PER_DECK).to eq(52)
|
10
|
+
end
|
11
|
+
end
|
5
12
|
|
6
13
|
describe '.new' do
|
7
14
|
it 'creates a shoe' do
|
@@ -21,7 +28,7 @@ RSpec.describe Shoe do
|
|
21
28
|
end
|
22
29
|
|
23
30
|
context 'with a new regular shoe' do
|
24
|
-
let(:shoe) { build(:shoe, :new_regular) }
|
31
|
+
let(:shoe) { build(:shoe, :new_regular, blackjack: blackjack) }
|
25
32
|
|
26
33
|
it 'returns false' do
|
27
34
|
expect(shoe).to_not be_needs_to_shuffle
|
@@ -29,7 +36,7 @@ RSpec.describe Shoe do
|
|
29
36
|
end
|
30
37
|
|
31
38
|
context 'with 42 cards being dealt' do
|
32
|
-
let(:shoe) { build(:shoe, :new_regular) }
|
39
|
+
let(:shoe) { build(:shoe, :new_regular, blackjack: blackjack) }
|
33
40
|
|
34
41
|
before do
|
35
42
|
42.times { shoe.next_card }
|
@@ -42,7 +49,7 @@ RSpec.describe Shoe do
|
|
42
49
|
end
|
43
50
|
|
44
51
|
describe '#shuffle' do
|
45
|
-
let(:shoe) { build(:shoe) }
|
52
|
+
let(:shoe) { build(:shoe, blackjack: blackjack) }
|
46
53
|
|
47
54
|
it 'calls shuffle' do
|
48
55
|
cards = instance_double(Array)
|
@@ -54,11 +61,11 @@ RSpec.describe Shoe do
|
|
54
61
|
end
|
55
62
|
|
56
63
|
describe '#new_regular' do
|
57
|
-
let(:shoe) { build(:shoe) }
|
64
|
+
let(:shoe) { build(:shoe, blackjack: blackjack) }
|
58
65
|
|
59
66
|
it 'creates a shoe' do
|
60
67
|
shoe.new_regular
|
61
|
-
expect(shoe.cards.size).to eq(
|
68
|
+
expect(shoe.cards.size).to eq(Shoe::CARDS_PER_DECK)
|
62
69
|
end
|
63
70
|
|
64
71
|
it 'calls shuffle' do
|
@@ -69,11 +76,11 @@ RSpec.describe Shoe do
|
|
69
76
|
end
|
70
77
|
|
71
78
|
describe '#new_aces' do
|
72
|
-
let(:shoe) { build(:shoe) }
|
79
|
+
let(:shoe) { build(:shoe, blackjack: blackjack) }
|
73
80
|
|
74
81
|
it 'creates a shoe' do
|
75
82
|
shoe.new_aces
|
76
|
-
expect(shoe.cards.size).to eq(
|
83
|
+
expect(shoe.cards.size).to eq(Shoe::CARDS_PER_DECK)
|
77
84
|
end
|
78
85
|
|
79
86
|
it 'calls shuffle' do
|
@@ -84,11 +91,11 @@ RSpec.describe Shoe do
|
|
84
91
|
end
|
85
92
|
|
86
93
|
describe '#new_jacks' do
|
87
|
-
let(:shoe) { build(:shoe) }
|
94
|
+
let(:shoe) { build(:shoe, blackjack: blackjack) }
|
88
95
|
|
89
96
|
it 'creates a shoe' do
|
90
97
|
shoe.new_jacks
|
91
|
-
expect(shoe.cards.size).to eq(
|
98
|
+
expect(shoe.cards.size).to eq(Shoe::CARDS_PER_DECK)
|
92
99
|
end
|
93
100
|
|
94
101
|
it 'calls shuffle' do
|
@@ -99,11 +106,11 @@ RSpec.describe Shoe do
|
|
99
106
|
end
|
100
107
|
|
101
108
|
describe '#new_aces_jacks' do
|
102
|
-
let(:shoe) { build(:shoe) }
|
109
|
+
let(:shoe) { build(:shoe, blackjack: blackjack) }
|
103
110
|
|
104
111
|
it 'creates a shoe' do
|
105
112
|
shoe.new_aces_jacks
|
106
|
-
expect(shoe.cards.size).to eq(
|
113
|
+
expect(shoe.cards.size).to eq(Shoe::CARDS_PER_DECK)
|
107
114
|
end
|
108
115
|
|
109
116
|
it 'calls shuffle' do
|
@@ -114,11 +121,11 @@ RSpec.describe Shoe do
|
|
114
121
|
end
|
115
122
|
|
116
123
|
describe '#new_sevens' do
|
117
|
-
let(:shoe) { build(:shoe) }
|
124
|
+
let(:shoe) { build(:shoe, blackjack: blackjack) }
|
118
125
|
|
119
126
|
it 'creates a shoe' do
|
120
127
|
shoe.new_sevens
|
121
|
-
expect(shoe.cards.size).to eq(
|
128
|
+
expect(shoe.cards.size).to eq(Shoe::CARDS_PER_DECK)
|
122
129
|
end
|
123
130
|
|
124
131
|
it 'calls shuffle' do
|
@@ -129,11 +136,11 @@ RSpec.describe Shoe do
|
|
129
136
|
end
|
130
137
|
|
131
138
|
describe '#new_eights' do
|
132
|
-
let(:shoe) { build(:shoe) }
|
139
|
+
let(:shoe) { build(:shoe, blackjack: blackjack) }
|
133
140
|
|
134
141
|
it 'creates a shoe' do
|
135
142
|
shoe.new_eights
|
136
|
-
expect(shoe.cards.size).to eq(
|
143
|
+
expect(shoe.cards.size).to eq(Shoe::CARDS_PER_DECK)
|
137
144
|
end
|
138
145
|
|
139
146
|
it 'calls shuffle' do
|
@@ -144,7 +151,7 @@ RSpec.describe Shoe do
|
|
144
151
|
end
|
145
152
|
|
146
153
|
describe '#next_card' do
|
147
|
-
let(:shoe) { build(:shoe, :new_regular) }
|
154
|
+
let(:shoe) { build(:shoe, :new_regular, blackjack: blackjack) }
|
148
155
|
|
149
156
|
it 'removes the next card' do
|
150
157
|
shoe.next_card
|