card_nine 0.4.1 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 854dfb09dcd2e62f7ec6b5c965862bb9f962753b
4
- data.tar.gz: 9f052c35d78081007e70e590297399bd45aea9f9
3
+ metadata.gz: fc6e81abfc7d2342293b27bd817dc6d3efd7dc6d
4
+ data.tar.gz: 443536f808e04a8ee0e1b04eb30fe2468aa276cb
5
5
  SHA512:
6
- metadata.gz: 84002ce61aa852ffd44c0d75e20fa0718595248bd02175d78ad3fab7ceda2ab3f8a6b3d5d9a28d779809ee2000e263c8aafa8de768be3c82cf2f29b281220b9e
7
- data.tar.gz: 9d195cbcb17037dab55d72f8fa4f3180525342f242ba1c608d18f4315371864161827ce355d0f34bbac8e5d7b8d968bc925b50a2af468bcaa335b3a9d5ec681d
6
+ metadata.gz: 841fa6dae3ce1dd5b2dfd0bbffb7ce6795691b1fdada683304590a136f3ef5505828e8ee07cc6a6a7b432e67316fc1bf791d8824073ee797146fe44a2ba08df3
7
+ data.tar.gz: 53a22aadba21b045dc72073cc1bf851d6ec50d95165e3ab2c28b778ffe137b0669150e331930a55d097d4914224d73ee611da7be83fc2f503fab77c63bdaf581
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.1
1
+ 0.5.0
data/lib/card_nine.rb CHANGED
@@ -6,8 +6,5 @@
6
6
  module CardNine
7
7
  require 'card_nine/card'
8
8
  require 'card_nine/deck'
9
- require 'card_nine/dealer'
10
- require 'card_nine/table'
11
- require 'card_nine/hand'
12
9
 
13
10
  end
@@ -1,4 +1,18 @@
1
1
  module CardNine
2
2
  class Dealer
3
+
4
+ attr_reader :deck, :locations, :stages
5
+
6
+ def initialize(deck, locations, stages = {})
7
+ @deck = deck
8
+ @locations = locations
9
+ @stages = stages
10
+ end
11
+
12
+ def deal(players)
13
+ Table.new(deck.shuffle, players, locations, stages)
14
+ end
15
+
16
+
3
17
  end
4
18
  end
@@ -0,0 +1,11 @@
1
+ require 'card_nine/table'
2
+ require 'card_nine/dealer'
3
+
4
+ module CardNine
5
+ module Dealers
6
+ class Simple < CardNine::Dealer
7
+
8
+
9
+ end
10
+ end
11
+ end
@@ -1,4 +1,7 @@
1
1
  require 'card_nine/cards/playing_card'
2
+ require 'card_nine/dealer'
3
+ require 'card_nine/table'
4
+
2
5
  module CardNine
3
6
  module Dealers
4
7
  # implements a CardNine::Dealer for the game of Texas Holdem. This is only
@@ -18,29 +21,21 @@ module CardNine
18
21
  # wagering(:round, hand)
19
22
  # end
20
23
  # wager(:resolve, hand)
21
- class TexasHoldem
22
-
23
- attr_accessor :players, :deck
24
+ class TexasHoldem < CardNine::Dealer
24
25
 
25
26
  STAGES = {
26
- deal_hole_cards: ->(h) { h.deal_players(2) },
27
- flop: ->(h) { h.discard; h.deal(3, to: :community) },
28
- turn: ->(h) { h.discard; h.deal(to: :community) },
29
- river: ->(h) { h.discard; h.deal(to: :community) }
27
+ deal_hole_cards: ->(t) { t.deal_players(2) },
28
+ flop: ->(t) { t.discard; t.deal(3, to: :community) },
29
+ turn: ->(t) { t.discard; t.deal(to: :community) },
30
+ river: ->(t) { t.discard; t.deal(to: :community) },
31
+ fold: ->(t, p) { t.remove_player(p) }
30
32
  }
31
33
 
32
- def initialize(players:, deck: CardNine::Cards::PlayingCard.deck)
33
- @players = players
34
- @deck = deck
35
- end
36
-
37
- # generate a new hand from this dealer
38
- # @return [CardNine::Hand]
39
- def new_hand
40
- players.rotate!
41
- Hand.start(players: players, deck: deck, stages: STAGES)
34
+ def initialize
35
+ super CardNine::Cards::PlayingCard.deck, [:community], STAGES
42
36
  end
43
37
 
44
38
  end
39
+
45
40
  end
46
41
  end
@@ -1,13 +1,9 @@
1
+ require 'virtus'
1
2
  module CardNine
2
3
  class Deck
3
- # @!method initialize(args = nil)
4
- # will set the instance vars using the keys of args as a attribute name
5
- # @param [Hash, Nil] args
6
4
  include Virtus.model
7
5
 
8
- # @!attribute [rw] cards
9
- # @return [Array<Card>] all cards in the deck
10
- attribute :cards, Array[Card], default: []
6
+ attribute :cards, Array, default: []
11
7
 
12
8
  # @!attribute [rw] rng
13
9
  # @return [Random,#rand]
@@ -15,7 +11,7 @@ module CardNine
15
11
 
16
12
  # @return Array[Card] randomized
17
13
  def shuffle
18
- cards.shuffle(random: rng)
14
+ cards.shuffle!(random: rng)
19
15
  end
20
16
  end
21
17
  end
@@ -1,38 +1,48 @@
1
- require 'virtus'
2
1
  module CardNine
3
- # a CardNine::Table is the shoe, discard pile, and player hands
4
2
  class Table
5
- include Virtus.model
3
+ attr_reader :shoe, :players, :hands, :locations, :discards, :stages
6
4
 
7
- # @!attribute [rw] deck
8
- # @return [CardNine::Deck, #shuffle]
9
- attribute :deck
5
+ def initialize(shoe, players, locations, stages = {})
6
+ @shoe = shoe
7
+ @players = players
8
+ @locations = locations
9
+ @discards = []
10
+ @stages = stages
11
+ @hands = { shoe: @shoe, discards: @discards }
12
+ (@players + @locations).each { |l| register_loc(l) }
13
+ end
10
14
 
11
- # @!attribute [rw] players
12
- # @return [Array<Object>] all players at this table
13
- attribute :players, Array, default: []
15
+ # @return Array all locations that cards can be dealt to
16
+ def locs
17
+ @hands.keys
18
+ end
14
19
 
15
- # locations as key for array of cards
16
- def layout
17
- @layout ||= init_layout
20
+ # @param [String,Symbol] loc which location to see
21
+ # @return Array[Card] cards for that loc
22
+ def cards_for(loc)
23
+ @hands[loc]
18
24
  end
19
25
 
20
- # deal move +count+ card(s) +from+ the top of one @layout location +to+ top of another
21
- def move_card(count = 1, from: :shoe, to:)
22
- layout[to].unshift(*(layout[from].shift(count)))
26
+
27
+ def deal(count = 1, from: :shoe, to:)
28
+ cards_for(to).push(*cards_for(from).pop(count))
23
29
  end
24
30
 
25
- # return all cards at +loc+ in layout
26
- def at(loc)
27
- layout[loc]
31
+ def deal_each_player(count)
32
+ count.times { @players.each { |p| deal(to: p) } }
28
33
  end
29
34
 
30
- private
31
- def init_layout
32
- l = Hash.new { |h, k| h[k] = [] }
33
- l[:shoe] = self.deck.shuffle
34
- return l
35
+ def deal_each_location(count)
36
+ count.times { @locations.each { |p| deal(to: p) } }
35
37
  end
36
38
 
39
+ def deal_stage(stage_name)
40
+ @stages[stage_name].call(self)
41
+ end
42
+
43
+ private
44
+ def register_loc(loc)
45
+ @hands[loc] = []
46
+ end
37
47
  end
38
48
  end
@@ -0,0 +1,20 @@
1
+ require 'rspec'
2
+ require 'card_nine/dealers/simple'
3
+
4
+ describe CardNine::Dealers::Simple do
5
+ let(:card_names) { %w{Batman Nightwing Batgirl Robin} }
6
+ let(:cards) { card_names.map { |c| CardNine::Cards::SimpleCard.new(c) } }
7
+ let(:deck) { CardNine::Deck.new(cards: card_names) }
8
+
9
+ let(:players) { %w{Tim Dick Jason} }
10
+ let(:locations) { [:batcave] }
11
+ let(:expected_attributes) {
12
+ {
13
+ deck: deck,
14
+ locations: locations
15
+ }
16
+ }
17
+ subject { CardNine::Dealers::Simple.new(deck, locations) }
18
+
19
+
20
+ end
@@ -2,88 +2,5 @@ require 'rspec'
2
2
  require 'card_nine/dealers/texas_holdem'
3
3
 
4
4
  describe CardNine::Dealers::TexasHoldem do
5
- let(:players) { %w|Barbera Stephanie Cassandra| }
6
-
7
- subject { described_class.new(players: players) }
8
-
9
- it { is_expected.to be_a described_class }
10
- it { is_expected.to respond_to :new_hand }
11
-
12
- describe '.new_hand' do
13
- subject { described_class.new(players: players).new_hand }
14
- it { is_expected.to be_a CardNine::Hand }
15
- end
16
-
17
- describe 'STAGES' do
18
- context ':hole_cards' do
19
- subject do
20
- h = described_class.new(players: players).new_hand
21
- h.deal_stage(:deal_hole_cards)
22
- h
23
- end
24
- it { is_expected.to be_a CardNine::Hand }
25
- it { expect(subject.at('Barbera').length).to eq 2 }
26
- it { expect(subject.at('Stephanie').length).to eq 2 }
27
- it { expect(subject.at('Cassandra').length).to eq 2 }
28
- it { expect(subject.at(:discards)).to be_empty }
29
- it { expect(subject.at(:shoe).length).to eq 46 }
30
- end
31
-
32
- context ':flop' do
33
- subject do
34
- h = described_class.new(players: players).new_hand
35
- h.deal_stage(:flop)
36
- h
37
- end
38
- it { is_expected.to be_a CardNine::Hand }
39
- it { expect(subject.at(:community).length).to eq 3 }
40
- it { expect(subject.at(:discards).length).to eq 1 }
41
- it { expect(subject.at(:shoe).length).to eq 48 }
42
- end
43
-
44
- context ':turn' do
45
- subject do
46
- h = described_class.new(players: players).new_hand
47
- h.deal_stage(:turn)
48
- h
49
- end
50
- it { is_expected.to be_a CardNine::Hand }
51
- it { expect(subject.at(:community).length).to eq 1 }
52
- it { expect(subject.at(:discards).length).to eq 1 }
53
- it { expect(subject.at(:shoe).length).to eq 50 }
54
- end
55
-
56
- context ':river' do
57
- subject do
58
- h = described_class.new(players: players).new_hand
59
- h.deal_stage(:river)
60
- h
61
- end
62
- it { is_expected.to be_a CardNine::Hand }
63
- it { expect(subject.at(:community).length).to eq 1 }
64
- it { expect(subject.at(:discards).length).to eq 1 }
65
- it { expect(subject.at(:shoe).length).to eq 50 }
66
- end
67
-
68
- context 'all in order' do
69
- subject do
70
- h = described_class.new(players: players).new_hand
71
- h.deal_stage(:deal_hole_cards)
72
- h.deal_stage(:flop)
73
- h.deal_stage(:turn)
74
- h.deal_stage(:river)
75
- h
76
- end
77
- it { is_expected.to be_a CardNine::Hand }
78
- it { expect(subject.at('Barbera').length).to eq 2 }
79
- it { expect(subject.at('Stephanie').length).to eq 2 }
80
- it { expect(subject.at('Cassandra').length).to eq 2 }
81
- it { expect(subject.at(:community).length).to eq 5 }
82
- it { expect(subject.at(:discards).length).to eq 3 }
83
- it { expect(subject.at(:shoe).length).to eq 38 }
84
-
85
-
86
- end
87
- end
88
5
 
89
6
  end
@@ -7,13 +7,14 @@ describe CardNine::Deck do
7
7
  let(:rng) { Random.new }
8
8
  subject { described_class.new(cards: cards) }
9
9
  it { is_expected.to have_attributes(cards: cards) }
10
+ it { expect(subject.cards.length).to eq 4 }
10
11
  it { expect(subject.rng).to respond_to :rand }
11
12
  it { is_expected.to respond_to :shuffle }
12
13
  it 'should call shuffle on cards list' do
13
14
  cards = %w|Batman Batgirl Robin Nightwing|.map { |n| CardNine::Cards::SimpleCard.new(name: n) }
14
15
  rng = Random.new(1234)
15
16
  deck = described_class.new(rng: rng, cards: cards)
16
- expect(deck.cards).to receive(:shuffle)
17
+ expect(deck.cards).to receive(:shuffle!)
17
18
  deck.shuffle
18
19
  end
19
20
 
@@ -2,73 +2,78 @@ require 'rspec'
2
2
  require 'card_nine/table'
3
3
 
4
4
  describe CardNine::Table do
5
- let(:cards) do
6
- %w|Batman Batgirl Robin Nightwing|.
7
- map { |n| CardNine::Cards::SimpleCard.new(name: n) }
8
- end
9
- let(:deck) { CardNine::Deck.new(cards: cards) }
10
- subject { described_class.new(deck: deck) }
11
- it { is_expected.to be_a described_class }
12
- it { expect(subject.deck).to eq deck }
13
- it { expect(subject.players).to eq [] }
14
- it { expect(subject.layout).to be_a Hash }
15
- it { expect(subject.layout[:shoe].length).to eq 4 }
16
- it { expect(subject.layout[:discards]).to eq [] }
17
- describe '.move_card(from: old_pile, to: new_pile)' do
18
- context 'using default count and :from' do
19
- subject do
20
- table = described_class.new(deck: deck, players: %w|Jason Tim|)
21
- table.move_card(to: 'Tim')
22
- table.move_card(to: 'Jason')
23
- table.move_card(to: :discards)
24
- table
25
- end
5
+ let(:card_names) { %w{Batman Nightwing Batgirl Robin} }
6
+ let(:cards) { card_names.map { |c| CardNine::Cards::SimpleCard.new(c) } }
7
+ let(:shoe) { CardNine::Deck.new(cards: card_names).cards }
26
8
 
27
- it { is_expected.to be_a CardNine::Table }
9
+ let(:players) { %w{Tim Dick Jason} }
10
+ let(:locations) { [:batcave] }
11
+ let(:expected_locs) { [:shoe, :discards] + locations + players }
12
+ let(:expected_attributes) {
13
+ {
14
+ shoe: shoe,
15
+ players: players,
16
+ locations: locations,
17
+ stages: {}
18
+ }
19
+ }
20
+ subject { CardNine::Table.new(shoe, players, locations) }
28
21
 
29
- it 'moves each card to the right spot' do
30
- expect(subject.at('Tim').length).to eq 1
31
- expect(subject.at('Jason').length).to eq 1
32
- expect(subject.at(:shoe).length).to eq 1
33
- expect(subject.at(:discards).length).to eq 1
34
-
35
- end
22
+ it { is_expected.to be_a CardNine::Table }
23
+ it { is_expected.to have_attributes expected_attributes }
24
+ it { expect(subject.locs).to include *expected_locs }
25
+ it { expect(subject.discards).to eq [] }
26
+ it { expect(subject.cards_for(:batcave)).to eq [] }
27
+ it { expect(subject.cards_for('Tim')).to eq [] }
36
28
 
29
+ describe '.deal(count = 1, to:)' do
30
+ let(:table) { CardNine::Table.new(shoe, players, locations) }
31
+ subject { table.deal(to: :batcave); table }
32
+ it { expect(subject.cards_for(:batcave)).to eq ['Robin'] }
33
+ it { expect(subject.shoe).to eq %w{Batman Nightwing Batgirl } }
34
+ context 'with a count of 2' do
35
+ subject { table.deal(2, to: :batcave); table }
36
+ it { expect(subject.cards_for(:batcave)).to eq ['Batgirl', 'Robin'] }
37
+ it { expect(subject.shoe).to eq ['Batman', 'Nightwing'] }
37
38
  end
38
- context 'with count' do
39
+ context 'with a from location' do
39
40
  subject do
40
- table = described_class.new(deck: deck, players: %w|Jason Tim|)
41
- table.move_card(2, to: 'Tim')
42
- table.move_card(2, to: 'Jason')
41
+ table.deal(2, to: :batcave)
42
+ table.deal(from: :batcave, to: 'Tim')
43
43
  table
44
44
  end
45
+ it { expect(subject.cards_for(:batcave)).to eq ['Batgirl'] }
46
+ it { expect(subject.cards_for('Tim')).to eq ['Robin'] }
47
+ end
48
+ end
45
49
 
46
- it { is_expected.to be_a CardNine::Table }
47
-
48
- it 'moves each card to the right spot' do
49
- expect(subject.at('Tim').length).to eq 2
50
- expect(subject.at('Jason').length).to eq 2
51
- expect(subject.at(:shoe).length).to eq 0
52
- expect(subject.at(:discards).length).to eq 0
53
- end
50
+ describe '.deal_each_player(grp, count)' do
51
+ let(:table) { CardNine::Table.new(shoe, players, locations) }
52
+ subject do
53
+ table.deal_each_player(1)
54
+ table
54
55
  end
55
- context 'with count' do
56
- subject do
57
- table = described_class.new(deck: deck, players: %w|Jason Tim|)
58
- table.move_card(4, to: 'Tim')
59
- table.move_card(2, to: 'Jason', from: 'Tim')
60
- table
61
- end
56
+ it { expect(subject.shoe).to eq ['Batman'] }
57
+ it { expect(subject.cards_for('Tim')).to eq ['Robin'] }
62
58
 
63
- it { is_expected.to be_a CardNine::Table }
59
+ context 'with a count over 1' do
60
+ let(:card_names) { %w{Batman Nightwing Batgirl Robin Spoiler Huntress} }
61
+ subject { table.deal_each_player(2); table }
62
+ it { expect(subject.shoe).to eq [] }
63
+ it { expect(subject.cards_for('Dick')).to eq ['Spoiler', 'Nightwing'] }
64
+ end
65
+ end
64
66
 
65
- it 'moves each card to the right spot' do
66
- expect(subject.at('Tim').length).to eq 2
67
- expect(subject.at('Jason').length).to eq 2
68
- expect(subject.at(:shoe).length).to eq 0
69
- expect(subject.at(:discards).length).to eq 0
70
- end
67
+ describe '.deal_stage(stage_name)' do
68
+ it 'should yield to the named proc' do
69
+ canary = double('canary')
70
+ expect(canary).to receive(:call)
71
+ stages = { deal_1: canary }
72
+ table = CardNine::Table.new(shoe, players, locations, stages)
73
+ table.deal_stage(:deal_1)
71
74
  end
72
75
 
73
76
  end
77
+
78
+
74
79
  end
@@ -1,10 +1,21 @@
1
1
  require 'rspec'
2
2
  require 'card_nine'
3
-
3
+ require 'card_nine/dealers/texas_holdem'
4
+ require 'card_nine/dealers/simple'
4
5
  describe CardNine do
5
6
 
6
- subject { described_class.constants }
7
- it { is_expected.to include :Card, :Deck, :Dealer, :Hand }
7
+ describe 'texas holdem dealer' do
8
+
9
+ end
10
+
11
+ describe 'Simple dealer' do
12
+ let(:deck) { CardNine::Deck.new(cards: %w{Batman Nightwing Batgirl Robin}) }
13
+
14
+ let(:players) { %w{Tim Dick Jason} }
15
+ subject { CardNine::Dealers::Simple.new(deck, [:batcave]) }
16
+
17
+ it { is_expected.to be_a CardNine::Dealers::Simple }
18
+ end
8
19
 
9
20
 
10
21
  end
data/spec/spec_helper.rb CHANGED
@@ -17,7 +17,7 @@ RSpec.configure do |config|
17
17
  config.filter_run :focus
18
18
  config.run_all_when_everything_filtered = true
19
19
  config.filter_run_excluding :rewrite => true
20
-
20
+ config.order = :random
21
21
  # rspec-mocks config goes here. You can use an alternate test double
22
22
  # library (such as bogus or mocha) by changing the `mock_with` option here.
23
23
  config.mock_with :rspec do |mocks|
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: card_nine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott M Parrish
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-08 00:00:00.000000000 Z
11
+ date: 2014-12-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: virtus
@@ -201,17 +201,17 @@ files:
201
201
  - lib/card_nine/cards/playing_card.rb
202
202
  - lib/card_nine/cards/simple_card.rb
203
203
  - lib/card_nine/dealer.rb
204
+ - lib/card_nine/dealers/simple.rb
204
205
  - lib/card_nine/dealers/texas_holdem.rb
205
206
  - lib/card_nine/deck.rb
206
- - lib/card_nine/hand.rb
207
207
  - lib/card_nine/table.rb
208
208
  - spec/card_nine/card_spec.rb
209
209
  - spec/card_nine/cards/playing_card_spec.rb
210
210
  - spec/card_nine/cards/simple_card_spec.rb
211
211
  - spec/card_nine/dealer_spec.rb
212
+ - spec/card_nine/dealers/simple_spec.rb
212
213
  - spec/card_nine/dealers/texas_holdem_spec.rb
213
214
  - spec/card_nine/deck_spec.rb
214
- - spec/card_nine/hand_spec.rb
215
215
  - spec/card_nine/table_spec.rb
216
216
  - spec/card_nine_spec.rb
217
217
  - spec/spec_helper.rb
@@ -244,9 +244,9 @@ test_files:
244
244
  - spec/card_nine/cards/playing_card_spec.rb
245
245
  - spec/card_nine/cards/simple_card_spec.rb
246
246
  - spec/card_nine/dealer_spec.rb
247
+ - spec/card_nine/dealers/simple_spec.rb
247
248
  - spec/card_nine/dealers/texas_holdem_spec.rb
248
249
  - spec/card_nine/deck_spec.rb
249
- - spec/card_nine/hand_spec.rb
250
250
  - spec/card_nine/table_spec.rb
251
251
  - spec/card_nine_spec.rb
252
252
  - spec/spec_helper.rb
@@ -1,63 +0,0 @@
1
- require 'virtus'
2
- require 'card_nine/deck'
3
- require 'card_nine/table'
4
- module CardNine
5
- class Hand
6
- include Virtus.model
7
-
8
- # @!attribute [rw] deck
9
- # @return [CardNine::Deck]
10
- attribute :deck, CardNine::Deck
11
-
12
- # @!attribute [rw] players
13
- # @return [Array]
14
- attribute :players, Array, default: []
15
-
16
- # @!attribute [rw] table
17
- # @return [CardNine::Table]
18
- attribute :table, CardNine::Table, default: :initialize_table
19
-
20
- attribute :stages, Hash, default: {}
21
-
22
- # create a new hand, yield to a setup block if given
23
- def self.start(args = nil)
24
- hand = self.new(args)
25
- yield hand if block_given?
26
- hand
27
- end
28
-
29
- # pass deal commands to table
30
- # @yieldparam [Table] table for current hand
31
- def deal(count = 1, from: :shoe, to:)
32
- table.move_card(count, from: from, to: to)
33
- end
34
-
35
- def deal_players(count = 1, from: :shoe)
36
- count.times do
37
- players.each do |p|
38
- deal(1, from: from, to: p)
39
- end
40
- end
41
- end
42
-
43
- def discard(count = 1, from: :shoe)
44
- deal(count, from: from, to: :discards)
45
- end
46
-
47
- def deal_stage(stage_name = nil, &blk)
48
- stages[stage_name].call(self) if stage_name && stages[stage_name]
49
- blk.call(self) if blk
50
- self
51
- end
52
-
53
- # @return Array<Card> cards at +loc+ location on table
54
- def at(loc)
55
- table.at(loc)
56
- end
57
-
58
- private
59
- def initialize_table
60
- CardNine::Table.new(players: players, deck: deck)
61
- end
62
- end
63
- end
@@ -1,68 +0,0 @@
1
- require 'rspec'
2
- require 'card_nine/hand'
3
-
4
- describe CardNine::Hand do
5
- let(:players) { %w|Batman Batgirl Robin| }
6
- let(:deck) { CardNine::Cards::PlayingCard.deck }
7
- let(:table) { CardNine::Table.new(players: players, deck: deck) }
8
- let(:stages) { { deal_five: ->(h) { h.deal_players(5) } } }
9
- let(:args) { { players: players, deck: deck } }
10
- subject { described_class.new(args) }
11
- it { is_expected.to be_a described_class }
12
-
13
- it { expect(subject.deck).to eq deck }
14
- it { expect(subject.players).to eq players }
15
- it { expect(subject.table).to be_a CardNine::Table }
16
- it { expect(subject.stages).to be_a Hash }
17
-
18
- describe '#start(args = nil, &blk)' do
19
- it { expect(described_class.start(args)).to be_a described_class }
20
- it 'executes block with hand as argument' do
21
- hand = described_class.start(args) { |h| h.players << 'Nightwing' }
22
- expect(hand.players).to include 'Nightwing'
23
- end
24
- end
25
-
26
- describe '.at(loc)' do
27
- subject { described_class.start(args) }
28
- it { is_expected.to be_a described_class }
29
- it { expect(subject.at(:shoe).length).to eq 52 }
30
- it { expect(subject.at(:discards)).to eq [] }
31
- end
32
-
33
- describe '.deal_stage(stage_name = nil, &blk)' do
34
- context 'with only block' do
35
- subject do
36
- h = described_class.start(players: players, deck: deck, table: table, stages: stages)
37
- h.deal_stage do |h|
38
- h.deal(3, to: :discards)
39
- end
40
- h
41
- end
42
- it { expect(subject.at(:discards).length).to eq 3 }
43
- end
44
-
45
- context 'with only stage' do
46
- subject do
47
- h = described_class.start(players: players, deck: deck, table: table, stages: stages)
48
- h.deal_stage(:deal_five)
49
- h
50
- end
51
- it { expect(subject.at('Batman').length).to eq 5 }
52
- it { expect(subject.at('Batgirl').length).to eq 5 }
53
- it { expect(subject.at('Robin').length).to eq 5 }
54
- end
55
- context 'with both stages and block' do
56
- subject do
57
- h = described_class.start(players: players, deck: deck, table: table, stages: stages)
58
- h.deal_stage(:deal_five) { |h| h.deal(6, to: :discards) }
59
- h
60
- end
61
- it { expect(subject.at('Batman').length).to eq 5 }
62
- it { expect(subject.at('Batgirl').length).to eq 5 }
63
- it { expect(subject.at('Robin').length).to eq 5 }
64
- it { expect(subject.at(:discards).length).to eq 6 }
65
- it { expect(subject.at(:shoe).length).to eq 31 }
66
- end
67
- end
68
- end