Active player rotates after hand played

This commit is contained in:
Jesse C. Fisher 2015-08-08 05:28:39 -07:00
parent ca423cae99
commit 23308abc97
3 changed files with 37 additions and 10 deletions

View File

@ -35,6 +35,10 @@ class GamesController < ApplicationController
card.save
end
# TODO: Ensure active player only changes when valid hand is played
@game.set_active_player 'next'
@game.save
# TODO: add current_hand logic
# @hand > @game.hand_to_beat
redirect_to @game

View File

@ -7,6 +7,11 @@ class Game < ActiveRecord::Base
accepts_nested_attributes_for :players
validates :title, presence: true
# TODO: Simplify to a single attribute
alias_attribute :current_player_id, :control_player_id
alias_attribute :active_player_id, :control_player_id
alias_attribute :active_player, :control_player
def start
validate_startable
return false unless startable?
@ -81,6 +86,17 @@ class Game < ActiveRecord::Base
players.count >= 4
end
def set_active_player(arg)
case arg
when 'next'
self.active_player_id = self.next_player_id
end
end
def next_player_id
player_ids[(player_ids.index(current_player_id) + 1 ) % player_ids.length]
end
# The player whose turn it is
def control_player
self.players.find(self.control_player_id)

View File

@ -68,19 +68,26 @@ feature 'Play a hand', type: :feature do
# Given I am the current player
# When I play a hand
# Then the next player becomes the current player
scenario 'current player rotates after a valid hand' do
skip 'to be implemented'
game = setup_game
login_as(game.current_player.user, scope: :user)
@current_player_id = game.current_player.id
@current_player_index = game.players.index(game.current_player)
visit game_path game
@card_to_play = game.current_player.player_cards.order(:value).first
scenario 'active player rotates after a valid hand' do
@game = setup_game
login_as(@game.active_player.user, scope: :user)
@next_player_id = @game.next_player_id
@active_player_id = @game.active_player.id
@active_player_index = @game.players.index(@game.active_player)
visit game_path @game
@card_to_play = @game.active_player.player_cards.order(:value).first
check @card_to_play.to_s
click_button 'Play Hand'
# reload the game object instance
@game.reload
expect(page).to have_content('Played ' + @card_to_play.to_s)
expect(game.current_player.id).to_not eq(@current_player_id)
expect(game.players.index(game.current_player)).to eq( (@current_player_id + 1) % 2)
# render active player style
expect(page).to have_content(@game.players.find(@next_player_id).user.email + " My Turn")
# next player is now the active player
expect(@game.active_player_id).to_not eq(@active_player_id)
expect(@game.active_player_id).to eq(@next_player_id)
end
# Scenario: Player can play a valid hand on their turn