require 'rails_helper' RSpec.describe Play, type: :model do before(:each) do @game = FactoryGirl.create(:game) @user1 = FactoryGirl.create(:user) @user2 = FactoryGirl.create(:user) @game.add_player_from_user @user1 @game.add_player_from_user @user2 @game.save @game.start @play = @game.current_player.plays.new @play.game_id = @game.id @play.save end subject { @play } it { should respond_to(:game_id) } it { should respond_to(:player_cards) } it { should respond_to(:hand_type) } it '#game_id returns an integer' do expect(@play.game_id).to match @game.id end describe 'validations' do describe 'first_play' do context 'when there have been no plays yet' do it 'valid if it contains the lowest card' do #expect(@game.plays.count).to eq(1) # Active player is the lowest card holder expect(@game.current_player).to eq(@game.lowest_card.player) # Play the lowest card @cards_to_play = @game.current_player.player_cards.order(:value).first @play.player_cards << @cards_to_play @play.save expect(@play.player_cards.include? @game.lowest_card).to eq true expect(@game.play_to_beat.play).to eq subject end end end describe 'hand_type' do context 'when a single card is played' do it 'single' do @cards_to_play = @game.current_player.player_cards.order(:value).first @play.player_cards << @cards_to_play expect(@play.hand_type).to eq('single') end end context 'when two cards are played' do it 'valid pair' do @spade3 = PlayerCard.new(rank: "3", suit: "Spade") @club3 = PlayerCard.new(rank: "3", suit: "Club") @cards_to_play = [@spade3, @club3] @play.player_cards << @cards_to_play expect(@play.hand_type).to eq('pair') expect(@play.errors[:player_cards]).to eq([]) end it 'invalid pair' do @spade3 = PlayerCard.new(rank: "3", suit: "Spade") @club4 = PlayerCard.new(rank: "4", suit: "Club") @cards_to_play = [@spade3, @club4] @play.player_cards << @cards_to_play expect(@play.hand_type).to eq('pair') expect(@play.errors[:player_cards]).to eq(['Invalid pair. Rank must match.']) end end context 'when three cards are played' do it 'valid triple' do @spade3 = PlayerCard.new(rank: "3", suit: "Spade") @club3 = PlayerCard.new(rank: "3", suit: "Club") @diamond3 = PlayerCard.new(rank: "3", suit: "Diamond") @cards_to_play = [@spade3, @club3, @diamond3] @play.player_cards << @cards_to_play expect(@play.hand_type).to eq('triple') end it 'invalid triple' do @spade3 = PlayerCard.new(rank: "3", suit: "Spade") @club3 = PlayerCard.new(rank: "3", suit: "Club") @diamond4 = PlayerCard.new(rank: "4", suit: "Diamond") @cards_to_play = [@spade3, @club3, @diamond4] @play.player_cards << @cards_to_play expect(@play.hand_type).to eq('triple') expect(@play.errors[:player_cards]).to eq(['Invalid triple. Rank must match.']) end it 'valid run of 3' do @spade3 = PlayerCard.new(rank: "3", suit: "Spade") @club4 = PlayerCard.new(rank: "4", suit: "Club") @diamond5 = PlayerCard.new(rank: "5", suit: "Diamond") @cards_to_play = [@spade3, @club4, @diamond5] @play.player_cards << @cards_to_play expect(@play.hand_type).to eq('triple run') end it 'valid run of 3 suited' do @spade3 = PlayerCard.new(rank: "3", suit: "Spade") @club4 = PlayerCard.new(rank: "4", suit: "Spade") @diamond5 = PlayerCard.new(rank: "5", suit: "Spade") @cards_to_play = [@spade3, @club4, @diamond5] @play.player_cards << @cards_to_play expect(@play.hand_type).to eq('triple run suited') end end context 'when four cards are played' do it 'valid bomb' do @spade3 = PlayerCard.new(rank: "3", suit: "Spade") @club3 = PlayerCard.new(rank: "3", suit: "Club") @diamond3 = PlayerCard.new(rank: "3", suit: "Diamond") @heart3 = PlayerCard.new(rank: "3", suit: "Heart") @cards_to_play = [@spade3, @club3, @diamond3, @heart3] @play.player_cards << @cards_to_play expect(@play.hand_type).to eq('bomb') end it 'valid run of 4' do @spade3 = PlayerCard.new(rank: "3", suit: "Spade") @club4 = PlayerCard.new(rank: "4", suit: "Club") @diamond5 = PlayerCard.new(rank: "5", suit: "Diamond") @diamond6 = PlayerCard.new(rank: "6", suit: "Diamond") @cards_to_play = [@spade3, @club4, @diamond5, @diamond6] @play.player_cards << @cards_to_play expect(@play.hand_type).to eq('run of 4') end it 'valid run of 4 suited' do @spade3 = PlayerCard.new(rank: "3", suit: "Spade") @club4 = PlayerCard.new(rank: "4", suit: "Spade") @diamond5 = PlayerCard.new(rank: "5", suit: "Spade") @diamond6 = PlayerCard.new(rank: "6", suit: "Spade") @cards_to_play = [@spade3, @club4, @diamond5, @diamond6] @play.player_cards << @cards_to_play expect(@play.hand_type).to eq('run of 4 suited') end end context 'when five cards are played' do it 'valid run of 5' do @spade3 = PlayerCard.new(rank: "3", suit: "Spade") @club4 = PlayerCard.new(rank: "4", suit: "Club") @diamond5 = PlayerCard.new(rank: "5", suit: "Diamond") @diamond6 = PlayerCard.new(rank: "6", suit: "Diamond") @diamond7 = PlayerCard.new(rank: "7", suit: "Diamond") @cards_to_play = [@spade3, @club4, @diamond5, @diamond6, @diamond7] @play.player_cards << @cards_to_play expect(@play.hand_type).to eq('run of 5') end it 'invalid run of 5' do @spade3 = PlayerCard.new(rank: "3", suit: "Spade") @club4 = PlayerCard.new(rank: "4", suit: "Club") @diamond5 = PlayerCard.new(rank: "5", suit: "Diamond") @diamond6 = PlayerCard.new(rank: "6", suit: "Diamond") @diamond8 = PlayerCard.new(rank: "8", suit: "Diamond") @cards_to_play = [@spade3, @club4, @diamond5, @diamond6, @diamond8] @play.player_cards << @cards_to_play expect(@play.hand_type).to eq('run of 5') expect(@play.errors[:player_cards]).to eq(['Invalid run of 5']) end it 'valid run of 5 suited' do @spade3 = PlayerCard.new(rank: "3", suit: "Spade") @club4 = PlayerCard.new(rank: "4", suit: "Spade") @diamond5 = PlayerCard.new(rank: "5", suit: "Spade") @diamond6 = PlayerCard.new(rank: "6", suit: "Spade") @diamond7 = PlayerCard.new(rank: "7", suit: "Spade") @cards_to_play = [@spade3, @club4, @diamond5, @diamond6, @diamond7] @play.player_cards << @cards_to_play expect(@play.hand_type).to eq('run of 5 suited') end end (5..13).each do |i| context "when #{i} cards are played" do it "run of #{i}" do @cards_to_play = create_hand(i, 'run') @play.player_cards << @cards_to_play expect(@play.hand_type).to eq("run of #{i}") end it "run of #{i} suited" do @cards_to_play = create_hand(i, 'run suited') @play.player_cards << @cards_to_play expect(@play.hand_type).to eq("run of #{i} suited") end if [6, 8, 10].include? i it "double run of #{i}" do @cards_to_play = create_hand(i, 'double run') @play.player_cards << @cards_to_play expect(@play.hand_type).to eq("double run of #{i}") expect(@play.errors[:player_cards]).to eq([]) end end end end end end end