197 lines
8.0 KiB
Ruby
197 lines
8.0 KiB
Ruby
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
|